diff --git a/lld/ELF/Thunks.cpp b/lld/ELF/Thunks.cpp index 8603b330f854..3b8086931ddb 100644 --- a/lld/ELF/Thunks.cpp +++ b/lld/ELF/Thunks.cpp @@ -945,7 +945,8 @@ static Thunk *addThunkPPC32(const InputSection &isec, const Relocation &rel, } static Thunk *addThunkPPC64(RelType type, Symbol &s, int64_t a) { - assert(type == R_PPC64_REL24 && "unexpected relocation type for thunk"); + assert((type == R_PPC64_REL14 || type == R_PPC64_REL24) && + "unexpected relocation type for thunk"); if (s.isInPlt()) return make(s); diff --git a/lld/test/ELF/ppc64-long-branch-rel14.s b/lld/test/ELF/ppc64-long-branch-rel14.s new file mode 100644 index 000000000000..dc67e932fd3c --- /dev/null +++ b/lld/test/ELF/ppc64-long-branch-rel14.s @@ -0,0 +1,60 @@ +# REQUIRES: ppc +# RUN: echo 'SECTIONS { \ +# RUN: .text_low 0x2000: { *(.text_low) } \ +# RUN: .text_high 0xa000 : { *(.text_high) } \ +# RUN: }' > %t.lds + +# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s -o %t.o +# RUN: ld.lld -T %t.lds %t.o -o %t +# RUN: llvm-readelf -r %t | FileCheck --check-prefix=SEC %s +# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o +# RUN: ld.lld -pie -T %t.lds %t.o -o %t +# RUN: llvm-readelf -r %t | FileCheck --check-prefix=SEC %s +# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s + +# SEC: There are no relocations in this file. + +# CHECK-LABEL: <_start>: +# CHECK-NEXT: 2000: bt 2, 0x2014 +# CHECK-NEXT: bt+ 2, 0x2014 +# CHECK-NEXT: bf 2, 0xa004 +# CHECK-NEXT: bt 2, 0x2024 +# CHECK-NEXT: blr +# CHECK-EMPTY: +# CHECK-NEXT: <__long_branch_high>: +# CHECK-NEXT: 2014: addis 12, 2, 0 +# CHECK-NEXT: ld 12, {{.*}}(12) +# CHECK-NEXT: mtctr 12 +# CHECK-NEXT: bctr +# CHECK-EMPTY: + +# CHECK-NEXT: <__long_branch_>: +# CHECK-NEXT: 2024: addis 12, 2, 0 +# CHECK-NEXT: ld 12, {{.*}}(12) +# CHECK-NEXT: mtctr 12 +# CHECK-NEXT: bctr + +.section .text_low, "ax", @progbits +.globl _start +_start: +beq high # Need a thunk +beq+ high # Need a thunk +bne high +beq .text_high+16 # Need a thunk +blr + +# CHECK-LABEL: <.text_high>: +# CHECK-NEXT: a000: nop +# CHECK-EMPTY: +# CHECK-LABEL: : +# CHECK-NEXT: a004: bf 0, 0x2008 +# CHECK-NEXT: bt 1, 0x2008 + +.section .text_high, "ax", @progbits +nop +.globl high +high: +bge .text_low+8 # Need a thunk +bgt .text_low+8 # Need a thunk