zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 77fc3b88fbdf805e0c2c1fc2647513cee56813a4 (tree)
parent 66b71273a2555da23f6d706c22e3d85f43fe602b
Author: Alex Rønne Petersen <alex@alexrp.com>
Date:   Thu, 25 Jul 2024 01:08:03 +0200

start: Set up the gp register on mips and mips64.

Diffstat:
Mlib/std/start.zig | 13+++++++++++++
1 file changed, 13 insertions(+), 0 deletions(-)

diff --git a/lib/std/start.zig b/lib/std/start.zig @@ -329,6 +329,11 @@ fn _start() callconv(.Naked) noreturn { \\ jsr (%%pc, %%a0) , .mips, .mipsel => + \\ bal 1f + \\ .gpword . + \\ 1: + \\ lw $gp, 0($ra) + \\ subu $gp, $ra, $gp \\ move $fp, $0 \\ move $ra, $0 \\ move $a0, $sp @@ -336,6 +341,14 @@ fn _start() callconv(.Naked) noreturn { \\ j %[posixCallMainAndExit] , .mips64, .mips64el => + \\ bal 1f + \\ .gpdword . + \\ 1: + // The `gp` register on MIPS serves a similar purpose to `r2` (ToC pointer) on PPC64. + // We need to set it up in order for dynamically-linked / position-independent code to + // work. + \\ ld $gp, 0($ra) + \\ dsubu $gp, $ra, $gp \\ move $fp, $0 \\ move $ra, $0 \\ move $a0, $sp