Index: lld/ELF/Arch/PPC64.cpp =================================================================== --- lld/ELF/Arch/PPC64.cpp +++ lld/ELF/Arch/PPC64.cpp @@ -936,6 +936,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: @@ -1233,7 +1234,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; Index: lld/test/ELF/ppc64-tls-pcrel-le.s =================================================================== --- /dev/null +++ lld/test/ELF/ppc64-tls-pcrel-le.s @@ -0,0 +1,83 @@ +# 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 10 entries: +# SYMBOL: 7: 0000000000000000 4 TLS LOCAL DEFAULT 4 x +# SYMBOL: 8: 0000000000000004 4 TLS LOCAL DEFAULT 4 y +# SYMBOL: 9: 0000000000000008 20 TLS LOCAL DEFAULT 4 z + +# CHECK-LABEL: LocalExecAddrX +# CHECK: paddi 3, 13, -28672, 0 +# CHECK-NEXT: blr + +# CHECK-LABEL: LocalExecAddrY +# CHECK: paddi 3, 13, -28668, 0 +# CHECK-NEXT: blr + +# CHECK-LABEL: LocalExecAddrZ +# CHECK: paddi 3, 13, -28652, 0 +# CHECK-NEXT: blr + +# CHECK-LABEL: LocalExecValX +# CHECK: paddi 3, 13, -28672, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: blr + +# CHECK-LABEL: LocalExecValY +# CHECK: paddi 3, 13, -28668, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: blr + +# CHECK-LABEL: LocalExecValZ +# CHECK: paddi 3, 13, -28652, 0 +# CHECK-NEXT: lwz 3, 0(3) +# CHECK-NEXT: blr + +LocalExecAddrX: + paddi 3, 13, x@TPREL, 0 + blr + +LocalExecAddrY: + paddi 3, 13, y@TPREL, 0 + blr + +LocalExecAddrZ: + paddi 3, 13, z@TPREL+12, 0 + blr + +LocalExecValX: + paddi 3, 13, x@TPREL, 0 + lwz 3, 0(3) + blr + +LocalExecValY: + paddi 3, 13, y@TPREL, 0 + lwz 3, 0(3) + blr + +LocalExecValZ: + paddi 3, 13, z@TPREL+12, 0 + lwz 3, 0(3) + blr + +.section .tbss, "awT", @nobits +x: + .long 0 + .size x, 4 +y: + .long 0 + .size y, 4 +z: + .space 20 + .size z, 20