From 19659c3bd347471d3d55597bdc1c141e9e4a1ae1 Mon Sep 17 00:00:00 2001 From: Marc Tiehuis Date: Wed, 11 Jul 2018 21:53:59 +1200 Subject: 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. --- std/special/bootstrap.zig | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'std/special') 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]" -- cgit v1.2.3 From f3bc1c38bfb35cd588048f248c69100eaf709a4f Mon Sep 17 00:00:00 2001 From: Greg V Date: Sat, 20 Oct 2018 15:15:15 +0300 Subject: Specify 16-byte stack alignment in _start on FreeBSD --- std/special/bootstrap.zig | 3 +++ 1 file changed, 3 insertions(+) (limited to 'std/special') diff --git a/std/special/bootstrap.zig b/std/special/bootstrap.zig index 1fc80f2439..070a26bf71 100644 --- a/std/special/bootstrap.zig +++ b/std/special/bootstrap.zig @@ -57,6 +57,9 @@ extern fn WinMainCRTStartup() noreturn { // TODO https://github.com/ziglang/zig/issues/265 fn posixCallMainAndExit() noreturn { + if (builtin.os == builtin.Os.freebsd) { + @setAlignStack(16); + } const argc = argc_ptr[0]; const argv = @ptrCast([*][*]u8, argc_ptr + 1); -- cgit v1.2.3