Skip to content

Commit 14946c1

Browse files
committed
[mips] Fix compiler-rt tailcall on mips
See https://reviews.llvm.org/D158491
1 parent 24f4e4f commit 14946c1

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

compiler-rt/lib/interception/interception.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,9 @@ const interpose_substitution substitution_##func_name[] \
199199
".type " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", %function\n" \
200200
SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n" \
201201
SANITIZER_STRINGIFY(CFI_STARTPROC) "\n" \
202-
SANITIZER_STRINGIFY(ASM_TAIL_CALL) " __interceptor_" \
203-
SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func)) "\n" \
202+
C_ASM_TAIL_CALL(SANITIZER_STRINGIFY(TRAMPOLINE(func)), \
203+
"__interceptor_" \
204+
SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func))) "\n" \
204205
SANITIZER_STRINGIFY(CFI_ENDPROC) "\n" \
205206
".size " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", " \
206207
".-" SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n" \

compiler-rt/lib/sanitizer_common/sanitizer_asm.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444

4545
#if defined(__x86_64__) || defined(__i386__) || defined(__sparc__)
4646
# define ASM_TAIL_CALL jmp
47+
#elif defined(__mips__) && __mips_isa_rev >= 6
48+
# define ASM_TAIL_CALL bc
4749
#elif defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \
4850
defined(__powerpc__) || defined(__loongarch_lp64)
4951
# define ASM_TAIL_CALL b
@@ -53,6 +55,25 @@
5355
# define ASM_TAIL_CALL tail
5456
#endif
5557

58+
#if defined(__mips64) && __mips_isa_rev < 6
59+
# define C_ASM_TAIL_CALL(tfunc, ifunc) \
60+
"lui $t8, %hi(%neg(%gp_rel(" tfunc ")))\n" \
61+
"daddu $t8, $t8, $t9\n" \
62+
"daddu $t8, $t8, %lo(%neg(%gp_rel(" tfunc ")))\n" \
63+
"ld $t9, %got_disp(" ifunc ")($t8)\n" \
64+
"jr $t9\n"
65+
#elif defined(__mips__) && __mips_isa_rev < 6
66+
# define C_ASM_TAIL_CALL(tfunc, ifunc) \
67+
".set noreorder\n" \
68+
".cpload $t9\n" \
69+
".set reorder\n" \
70+
"lw $t9, %got(" ifunc ")($gp)\n" \
71+
"jr $t9\n"
72+
#elif defined(ASM_TAIL_CALL)
73+
# define C_ASM_TAIL_CALL(tfunc, ifunc) \
74+
SANITIZER_STRINGIFY(ASM_TAIL_CALL) " " ifunc
75+
#endif
76+
5677
#if defined(__ELF__) && defined(__x86_64__) || defined(__i386__) || \
5778
defined(__riscv)
5879
# define ASM_PREEMPTIBLE_SYM(sym) sym@plt

0 commit comments

Comments
 (0)