| ... | ... | @@ -9,8 +9,6 @@ const elf = std.elf; |
| 9 | 9 | const native_arch = builtin.cpu.arch; |
| 10 | 10 | const native_os = builtin.os.tag; |
| 11 | 11 | |
| 12 | | var argc_argv_ptr: [*]usize = undefined; |
| 13 | | |
| 14 | 12 | const start_sym_name = if (native_arch.isMIPS()) "__start" else "_start"; |
| 15 | 13 | |
| 16 | 14 | // The self-hosted compiler is not fully capable of handling all of this start.zig file. |
| ... | ... | @@ -277,41 +275,42 @@ fn _start() callconv(.Naked) noreturn { |
| 277 | 275 | asm volatile (switch (native_arch) { |
| 278 | 276 | .x86_64 => |
| 279 | 277 | \\ xorl %%ebp, %%ebp |
| 280 | | \\ movq %%rsp, %[argc_argv_ptr] |
| 278 | \\ movq %%rsp, %%rdi |
| 281 | 279 | \\ andq $-16, %%rsp |
| 282 | 280 | \\ callq %[posixCallMainAndExit:P] |
| 283 | 281 | , |
| 284 | 282 | .x86 => |
| 285 | 283 | \\ xorl %%ebp, %%ebp |
| 286 | | \\ movl %%esp, %[argc_argv_ptr] |
| 284 | \\ movl %%esp, %%eax |
| 287 | 285 | \\ andl $-16, %%esp |
| 286 | \\ subl $12, %%esp |
| 287 | \\ pushl %%eax |
| 288 | 288 | \\ calll %[posixCallMainAndExit:P] |
| 289 | 289 | , |
| 290 | 290 | .aarch64, .aarch64_be => |
| 291 | 291 | \\ mov fp, #0 |
| 292 | 292 | \\ mov lr, #0 |
| 293 | 293 | \\ mov x0, sp |
| 294 | | \\ str x0, %[argc_argv_ptr] |
| 295 | 294 | \\ b %[posixCallMainAndExit] |
| 296 | 295 | , |
| 297 | 296 | .arm, .armeb, .thumb, .thumbeb => |
| 298 | 297 | \\ mov fp, #0 |
| 299 | 298 | \\ mov lr, #0 |
| 300 | | \\ str sp, %[argc_argv_ptr] |
| 299 | \\ mov a1, sp |
| 301 | 300 | \\ and sp, #-16 |
| 302 | 301 | \\ b %[posixCallMainAndExit] |
| 303 | 302 | , |
| 304 | 303 | .riscv64 => |
| 305 | 304 | \\ li s0, 0 |
| 306 | 305 | \\ li ra, 0 |
| 307 | | \\ sd sp, %[argc_argv_ptr] |
| 306 | \\ mv a0, sp |
| 308 | 307 | \\ andi sp, sp, -16 |
| 309 | 308 | \\ tail %[posixCallMainAndExit]@plt |
| 310 | 309 | , |
| 311 | 310 | .mips, .mipsel => |
| 312 | 311 | // The lr is already zeroed on entry, as specified by the ABI. |
| 313 | 312 | \\ addiu $fp, $zero, 0 |
| 314 | | \\ sw $sp, %[argc_argv_ptr] |
| 313 | \\ move $a0, $sp |
| 315 | 314 | \\ .set push |
| 316 | 315 | \\ .set noat |
| 317 | 316 | \\ addiu $1, $zero, -16 |
| ... | ... | @@ -322,7 +321,7 @@ fn _start() callconv(.Naked) noreturn { |
| 322 | 321 | .mips64, .mips64el => |
| 323 | 322 | // The lr is already zeroed on entry, as specified by the ABI. |
| 324 | 323 | \\ addiu $fp, $zero, 0 |
| 325 | | \\ sd $sp, %[argc_argv_ptr] |
| 324 | \\ move $a0, $sp |
| 326 | 325 | \\ .set push |
| 327 | 326 | \\ .set noat |
| 328 | 327 | \\ daddiu $1, $zero, -16 |
| ... | ... | @@ -332,7 +331,7 @@ fn _start() callconv(.Naked) noreturn { |
| 332 | 331 | , |
| 333 | 332 | .powerpc, .powerpcle => |
| 334 | 333 | // Setup the initial stack frame and clear the back chain pointer. |
| 335 | | \\ stw 1, %[argc_argv_ptr] |
| 334 | \\ mr 3, 1 |
| 336 | 335 | \\ li 0, 0 |
| 337 | 336 | \\ stwu 1, -16(1) |
| 338 | 337 | \\ stw 0, 0(1) |
| ... | ... | @@ -342,7 +341,7 @@ fn _start() callconv(.Naked) noreturn { |
| 342 | 341 | .powerpc64, .powerpc64le => |
| 343 | 342 | // Setup the initial stack frame and clear the back chain pointer. |
| 344 | 343 | // TODO: Support powerpc64 (big endian) on ELFv2. |
| 345 | | \\ std 1, %[argc_argv_ptr] |
| 344 | \\ mr 3, 1 |
| 346 | 345 | \\ li 0, 0 |
| 347 | 346 | \\ stdu 0, -32(1) |
| 348 | 347 | \\ mtlr 0 |
| ... | ... | @@ -352,12 +351,12 @@ fn _start() callconv(.Naked) noreturn { |
| 352 | 351 | // argc is stored after a register window (16 registers) plus stack bias |
| 353 | 352 | \\ mov %%g0, %%i6 |
| 354 | 353 | \\ add %%o6, 2175, %%l0 |
| 355 | | \\ ba %[posixCallMainAndExit] |
| 356 | | \\ stx %%l0, %[argc_argv_ptr] |
| 354 | \\ mov %%l0, %%o0 |
| 355 | \\ ba,a %[posixCallMainAndExit] |
| 357 | 356 | , |
| 358 | 357 | else => @compileError("unsupported arch"), |
| 359 | 358 | } |
| 360 | | : [argc_argv_ptr] "=m" (argc_argv_ptr), |
| 359 | : |
| 361 | 360 | : [posixCallMainAndExit] "X" (&posixCallMainAndExit), |
| 362 | 361 | ); |
| 363 | 362 | } |
| ... | ... | @@ -385,7 +384,7 @@ fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn { |
| 385 | 384 | std.os.windows.ntdll.RtlExitUserProcess(@as(std.os.windows.UINT, @bitCast(result))); |
| 386 | 385 | } |
| 387 | 386 | |
| 388 | | fn posixCallMainAndExit() callconv(.C) noreturn { |
| 387 | fn posixCallMainAndExit(argc_argv_ptr: [*]usize) callconv(.C) noreturn { |
| 389 | 388 | const argc = argc_argv_ptr[0]; |
| 390 | 389 | const argv = @as([*][*:0]u8, @ptrCast(argc_argv_ptr + 1)); |
| 391 | 390 | |