From c1cc63e5ff1f2a9b7621051475085cb0b6303ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Wed, 18 Sep 2024 03:33:08 +0200 Subject: [PATCH] libc: Work around LLVM's misassembly of `j ` on mips r6. See: https://github.com/ziglang/zig/issues/21315 --- lib/libc/glibc/sysdeps/mips/mips32/crtn.S | 6 ++++-- lib/libc/glibc/sysdeps/mips/mips64/n32/crtn.S | 6 ++++-- lib/libc/glibc/sysdeps/mips/mips64/n64/crtn.S | 6 ++++-- lib/libc/glibc/sysdeps/unix/mips/sysdep.h | 3 ++- lib/libc/musl/crt/mips/crtn.s | 6 ++++-- lib/libc/musl/crt/mips64/crtn.s | 6 ++++-- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/libc/glibc/sysdeps/mips/mips32/crtn.S b/lib/libc/glibc/sysdeps/mips/mips32/crtn.S index 89ecbd9882..4fd4c745d9 100644 --- a/lib/libc/glibc/sysdeps/mips/mips32/crtn.S +++ b/lib/libc/glibc/sysdeps/mips/mips32/crtn.S @@ -42,7 +42,8 @@ lw $31,28($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 addiu $sp,$sp,32 .set macro .set reorder @@ -51,7 +52,8 @@ lw $31,28($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 addiu $sp,$sp,32 .set macro .set reorder diff --git a/lib/libc/glibc/sysdeps/mips/mips64/n32/crtn.S b/lib/libc/glibc/sysdeps/mips/mips64/n32/crtn.S index 633d79cfad..f9a6c7ee4c 100644 --- a/lib/libc/glibc/sysdeps/mips/mips64/n32/crtn.S +++ b/lib/libc/glibc/sysdeps/mips/mips64/n32/crtn.S @@ -43,7 +43,8 @@ ld $28,0($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 addiu $sp,$sp,16 .set macro .set reorder @@ -53,7 +54,8 @@ ld $28,0($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 addiu $sp,$sp,16 .set macro .set reorder diff --git a/lib/libc/glibc/sysdeps/mips/mips64/n64/crtn.S b/lib/libc/glibc/sysdeps/mips/mips64/n64/crtn.S index 99ed1e3263..2722b2812c 100644 --- a/lib/libc/glibc/sysdeps/mips/mips64/n64/crtn.S +++ b/lib/libc/glibc/sysdeps/mips/mips64/n64/crtn.S @@ -43,7 +43,8 @@ ld $28,0($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 daddiu $sp,$sp,16 .set macro .set reorder @@ -53,7 +54,8 @@ ld $28,0($sp) .set noreorder .set nomacro - j $31 + /* zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 */ + jr $31 daddiu $sp,$sp,16 .set macro .set reorder diff --git a/lib/libc/glibc/sysdeps/unix/mips/sysdep.h b/lib/libc/glibc/sysdeps/unix/mips/sysdep.h index d1e0460260..54e92b26d0 100644 --- a/lib/libc/glibc/sysdeps/unix/mips/sysdep.h +++ b/lib/libc/glibc/sysdeps/unix/mips/sysdep.h @@ -39,7 +39,8 @@ .end function; \ .size function,.-function -#define ret j ra ; nop +// zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 +#define ret jr ra ; nop #undef PSEUDO_END #define PSEUDO_END(sym) cfi_endproc; .end sym; .size sym,.-sym diff --git a/lib/libc/musl/crt/mips/crtn.s b/lib/libc/musl/crt/mips/crtn.s index 506a04b78c..5146d83a0e 100644 --- a/lib/libc/musl/crt/mips/crtn.s +++ b/lib/libc/musl/crt/mips/crtn.s @@ -3,11 +3,13 @@ .section .init lw $gp,24($sp) lw $ra,28($sp) - j $ra + # zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 + jr $ra addu $sp,$sp,32 .section .fini lw $gp,24($sp) lw $ra,28($sp) - j $ra + # zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 + jr $ra addu $sp,$sp,32 diff --git a/lib/libc/musl/crt/mips64/crtn.s b/lib/libc/musl/crt/mips64/crtn.s index f3930b2406..dc4dbb03ad 100644 --- a/lib/libc/musl/crt/mips64/crtn.s +++ b/lib/libc/musl/crt/mips64/crtn.s @@ -3,11 +3,13 @@ .section .init ld $gp,16($sp) ld $ra,24($sp) - j $ra + # zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 + jr $ra daddu $sp,$sp,32 .section .fini ld $gp,16($sp) ld $ra,24($sp) - j $ra + # zig patch: j -> jr for https://github.com/ziglang/zig/issues/21315 + jr $ra daddu $sp,$sp,32