commit c1cc63e5ff1f2a9b7621051475085cb0b6303ecb (tree)
parent b19d0fb0fd3e4ff023968e77f01848ffb9dce360
Author: Alex Rønne Petersen <alex@alexrp.com>
Date: Wed, 18 Sep 2024 03:33:08 +0200
libc: Work around LLVM's misassembly of `j <reg>` on mips r6.
See: https://github.com/ziglang/zig/issues/21315
Diffstat:
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
@@ -42,7 +42,8 @@
lw $31,28($sp)
.set noreorder
.set nomacro
- j $31
+ /* zig patch: j <reg> -> jr <reg> 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 <reg> -> jr <reg> 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
@@ -43,7 +43,8 @@
ld $28,0($sp)
.set noreorder
.set nomacro
- j $31
+ /* zig patch: j <reg> -> jr <reg> 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 <reg> -> jr <reg> 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
@@ -43,7 +43,8 @@
ld $28,0($sp)
.set noreorder
.set nomacro
- j $31
+ /* zig patch: j <reg> -> jr <reg> 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 <reg> -> jr <reg> 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
@@ -39,7 +39,8 @@
.end function; \
.size function,.-function
-#define ret j ra ; nop
+// zig patch: j <reg> -> jr <reg> 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
@@ -3,11 +3,13 @@
.section .init
lw $gp,24($sp)
lw $ra,28($sp)
- j $ra
+ # zig patch: j <reg> -> jr <reg> 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 <reg> -> jr <reg> 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
@@ -3,11 +3,13 @@
.section .init
ld $gp,16($sp)
ld $ra,24($sp)
- j $ra
+ # zig patch: j <reg> -> jr <reg> 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 <reg> -> jr <reg> for https://github.com/ziglang/zig/issues/21315
+ jr $ra
daddu $sp,$sp,32