diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp --- a/lld/ELF/Arch/PPC64.cpp +++ b/lld/ELF/Arch/PPC64.cpp @@ -938,6 +938,7 @@ case R_PPC64_TPREL16_HIGHERA: case R_PPC64_TPREL16_HIGHEST: case R_PPC64_TPREL16_HIGHESTA: + case R_PPC64_TPREL34: return R_TLS; case R_PPC64_DTPREL16: case R_PPC64_DTPREL16_DS: @@ -1235,7 +1236,8 @@ (val & si1Mask)); break; } - case R_PPC64_GOT_PCREL34: { + case R_PPC64_GOT_PCREL34: + case R_PPC64_TPREL34: { const uint64_t si0Mask = 0x00000003ffff0000; const uint64_t si1Mask = 0x000000000000ffff; const uint64_t fullMask = 0x0003ffff0000ffff; diff --git a/lld/test/ELF/ppc64-tls-pcrel-le.s b/lld/test/ELF/ppc64-tls-pcrel-le.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/ppc64-tls-pcrel-le.s @@ -0,0 +1,56 @@ +# REQUIRES: ppc +# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=SYMBOL +# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t | FileCheck %s + +# RUN: llvm-mc -filetype=obj -triple=powerpc64 %s -o %t.o +# RUN: ld.lld %t.o -o %t +# RUN: llvm-readelf -s %t | FileCheck %s --check-prefix=SYMBOL +# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t | FileCheck %s + +## This test checks the LLD implementation of the Local Exec TLS model +## when using prefixed instructions like paddi. + +# SYMBOL: Symbol table '.symtab' contains 6 entries: +# SYMBOL: 3: 0000000000000000 0 TLS LOCAL DEFAULT 2 x +# SYMBOL-NEXT: 4: 0000000000000004 0 TLS LOCAL DEFAULT 2 y +# SYMBOL-NEXT: 5: 0000000000000008 0 TLS LOCAL DEFAULT 2 z + +# CHECK-LABEL: : +# CHECK: paddi 3, 13, -28672, 0 +# CHECK-NEXT: paddi 3, 13, -28668, 0 +# CHECK-NEXT: paddi 3, 13, -28652, 0 +# CHECK-NEXT: blr + +# CHECK-LABEL: : +# CHECK: paddi 3, 13, -28672, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: paddi 3, 13, -28668, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: paddi 3, 13, -28652, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: blr + +LocalExecAddr: + paddi 3, 13, x@TPREL, 0 + paddi 3, 13, y@TPREL, 0 + paddi 3, 13, z@TPREL+12, 0 + blr + +LocalExecVal: + paddi 3, 13, x@TPREL, 0 + lwz 3, 0(3) + paddi 3, 13, y@TPREL, 0 + lwz 3, 0(3) + paddi 3, 13, z@TPREL+12, 0 + lwz 3, 0(3) + blr + +.section .tbss, "awT", @nobits +x: + .long 0 +y: + .long 0 +z: + .space 20