aboutsummaryrefslogtreecommitdiff
path: root/std/special/bootstrap.zig
diff options
context:
space:
mode:
authorMarc Tiehuis <marctiehuis@gmail.com>2018-07-11 21:53:59 +1200
committerGreg V <greg@unrelenting.technology>2018-10-20 15:15:01 +0300
commit19659c3bd347471d3d55597bdc1c141e9e4a1ae1 (patch)
treee601a2d87d64277f611271c1e02d834def0892cb /std/special/bootstrap.zig
parent102cb61e401ba2266938882d8a7d751a31a49ab2 (diff)
downloadzig-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.zig15
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]"