aboutsummaryrefslogtreecommitdiff
path: root/lib/std/start.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-09-22 11:41:21 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-09-22 11:41:21 -0700
commite2d1f9874df2a9221aaa9ec55bd2974b70601f64 (patch)
treeeff7919b0717e193aa53b70fcee862d6f33deddb /lib/std/start.zig
parent52b8239a22aa37fe3914427cd4e2905231769e59 (diff)
parent58ee5f4e61cd9b7a9ba65798e2214efa3753a733 (diff)
downloadzig-e2d1f9874df2a9221aaa9ec55bd2974b70601f64.tar.gz
zig-e2d1f9874df2a9221aaa9ec55bd2974b70601f64.zip
Merge remote-tracking branch 'origin/master' into llvm11
Diffstat (limited to 'lib/std/start.zig')
-rw-r--r--lib/std/start.zig15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/std/start.zig b/lib/std/start.zig
index c65cd08981..aea31a1531 100644
--- a/lib/std/start.zig
+++ b/lib/std/start.zig
@@ -121,6 +121,21 @@ fn _start() callconv(.Naked) noreturn {
: [argc] "=r" (-> [*]usize)
);
},
+ .powerpc64le => {
+ // Before returning the stack pointer, we have to set up a backchain
+ // and a few other registers required by the ELFv2 ABI.
+ // TODO: Support powerpc64 (big endian) on ELFv2.
+ starting_stack_ptr = asm (
+ \\ mr 4, 1
+ \\ subi 1, 1, 32
+ \\ li 5, 0
+ \\ std 5, 0(1)
+ \\ mr %[argc], 4
+ : [argc] "=r" (-> [*]usize)
+ :
+ : "r4", "r5"
+ );
+ },
else => @compileError("unsupported arch"),
}
// If LLVM inlines stack variables into _start, they will overwrite