Files
clang-p2996/llvm/test/ExecutionEngine/RuntimeDyld/PowerPC/ppc64_reloc.s
Hiroshi Inoue 3872c6c633 [PowerPC] fix broken JIT-compiled code with tail call optimization
The relocation for branch instructions in the dynamic loader of ExecutionEngine assumes branch instructions with R_PPC64_REL24 relocation type are only bl. However, with the tail call optimization, b instructions can be also used to jump into another function.
This patch makes the relocation to keep bits in the branch instruction other than the jump offset to avoid relocation rewrites a b instruction into bl.

Differential Revision: https://reviews.llvm.org/D47456

llvm-svn: 333502
2018-05-30 04:48:29 +00:00

49 lines
1.4 KiB
ArmAsm

# test for little endian
# RUN: rm -rf %t && mkdir -p %t
# RUN: llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj -o %t/ppc64_reloc.o %s
# RUN: llvm-mc -triple=powerpc64le-unknown-linux-gnu -filetype=obj -o %t/ppc64_elf_module_b.o %S/Inputs/ppc64_elf_module_b.s
# RUN: llvm-rtdyld -triple=powerpc64le-unknown-linux-gnu -verify -check=%s %t/ppc64_reloc.o %t/ppc64_elf_module_b.o
# test for big endian
# RUN: rm -rf %t && mkdir -p %t
# RUN: llvm-mc -triple=powerpc64-unknown-linux-gnu -filetype=obj -o %t/ppc64_reloc.o %s
# RUN: llvm-mc -triple=powerpc64-unknown-linux-gnu -filetype=obj -o %t/ppc64_elf_module_b.o %S/Inputs/ppc64_elf_module_b.s
# RUN: llvm-rtdyld -triple=powerpc64-unknown-linux-gnu -verify -check=%s %t/ppc64_reloc.o %t/ppc64_elf_module_b.o
.text
.abiversion 2
.file "test.c"
.globl func
.p2align 4
.type func,@function
func: # @func
.Lfunc_begin0:
.Lfunc_gep0:
addis 2, 12, .TOC.-.Lfunc_gep0@ha
addi 2, 2, .TOC.-.Lfunc_gep0@l
.Lfunc_lep0:
.localentry func, .Lfunc_lep0-.Lfunc_gep0
mflr 0
std 31, -8(1)
std 0, 16(1)
stdu 1, -112(1)
mr 31, 1
# confirm that LK flag is set for bl
# rtdyld-check: (*{4}call_bl) & 1 = 1
call_bl:
bl foo
nop
li 3, 0
addi 1, 1, 112
ld 0, 16(1)
ld 31, -8(1)
mtlr 0
# confirm that LK flag is not set for b
# rtdyld-check: (*{4}call_b) & 1 = 0
call_b:
b foo
.long 0
.quad 0
.Lfunc_end0:
.size func, .Lfunc_end0-.Lfunc_begin0