@@ -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)
@@ -341,8 +340,10 @@ fn _start() callconv(.Naked) noreturn {
341
340
,
342
341
.powerpc64 , .powerpc64le = >
343
342
// Setup the initial stack frame and clear the back chain pointer.
344
- // TODO: Support powerpc64 (big endian) on ELFv2.
345
- \\ std 1, %[argc_argv_ptr]
343
+ \\ addis 2, 12, .TOC. - _start@ha
344
+ \\ addi 2, 2, .TOC. - _start@l
345
+ \\ mr 3, 1
346
+ \\ clrrdi 1, 1, 4
346
347
\\ li 0, 0
347
348
\\ stdu 0, -32(1)
348
349
\\ mtlr 0
@@ -352,12 +353,12 @@ fn _start() callconv(.Naked) noreturn {
352
353
// argc is stored after a register window (16 registers) plus stack bias
353
354
\\ mov %%g0, %%i6
354
355
\\ add %%o6, 2175, %%l0
355
- \\ ba %[posixCallMainAndExit]
356
- \\ stx %%l0, %[argc_argv_ptr ]
356
+ \\ mov %%l0, %%o0
357
+ \\ ba,a %[posixCallMainAndExit ]
357
358
,
358
359
else = > @compileError ("unsupported arch" ),
359
360
}
360
- : [ argc_argv_ptr ] "=m" ( argc_argv_ptr ),
361
+ :
361
362
: [posixCallMainAndExit ] "X" (& posixCallMainAndExit ),
362
363
);
363
364
}
@@ -385,7 +386,7 @@ fn wWinMainCRTStartup() callconv(std.os.windows.WINAPI) noreturn {
385
386
std .os .windows .ntdll .RtlExitUserProcess (@as (std .os .windows .UINT , @bitCast (result )));
386
387
}
387
388
388
- fn posixCallMainAndExit () callconv (.C ) noreturn {
389
+ fn posixCallMainAndExit (argc_argv_ptr : [ * ] usize ) callconv (.C ) noreturn {
389
390
const argc = argc_argv_ptr [0 ];
390
391
const argv = @as ([* ][* :0 ]u8 , @ptrCast (argc_argv_ptr + 1 ));
391
392
0 commit comments