diff options
| author | Marc Tiehuis <marctiehuis@gmail.com> | 2018-07-11 21:53:59 +1200 |
|---|---|---|
| committer | Greg V <greg@unrelenting.technology> | 2018-10-20 15:15:01 +0300 |
| commit | 19659c3bd347471d3d55597bdc1c141e9e4a1ae1 (patch) | |
| tree | e601a2d87d64277f611271c1e02d834def0892cb /std/special/bootstrap.zig | |
| parent | 102cb61e401ba2266938882d8a7d751a31a49ab2 (diff) | |
| download | zig-19659c3bd347471d3d55597bdc1c141e9e4a1ae1.tar.gz zig-19659c3bd347471d3d55597bdc1c141e9e4a1ae1.zip | |
freebsd: Fix argc resolution in _start
FreeBSD appears to use rdi instead of rsp as in other posix systems.
According to some loose documentation, x86 passes values on the stack,
so amd64 freebsd may be the only exception.
Diffstat (limited to 'std/special/bootstrap.zig')
| -rw-r--r-- | std/special/bootstrap.zig | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig index 53c646abdc..1fc80f2439 100644 --- a/std/special/bootstrap.zig +++ b/std/special/bootstrap.zig @@ -20,10 +20,17 @@ comptime { nakedcc fn _start() noreturn { switch (builtin.arch) { - builtin.Arch.x86_64 => { - argc_ptr = asm ("lea (%%rsp), %[argc]" - : [argc] "=r" (-> [*]usize) - ); + builtin.Arch.x86_64 => switch (builtin.os) { + builtin.Os.freebsd => { + argc_ptr = asm ("lea (%%rdi), %[argc]" + : [argc] "=r" (-> [*]usize) + ); + }, + else => { + argc_ptr = asm ("lea (%%rsp), %[argc]" + : [argc] "=r" (-> [*]usize) + ); + }, }, builtin.Arch.i386 => { argc_ptr = asm ("lea (%%esp), %[argc]" |
