[LLD][PowerPC] Add support for R_PPC64_TPREL34 used in TLS Local Exec

Add Thread Local Storage Local Exec support to LLD. This is to support PC Relative addressing of Local Exec.
The patch teaches LLD to handle:
```
paddi r9, r13, x1@tprel
```
The relocation is:
```
R_PPC_TPREL34
```

Reviewed By: NeHuang, MaskRay

Differential Revision: https://reviews.llvm.org/D86608
This commit is contained in:
Stefan Pintilie 2020-09-15 08:23:58 -05:00
parent e1669843f2
commit 65f6810d3a
2 changed files with 59 additions and 1 deletions

View File

@ -938,6 +938,7 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
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 @@ void PPC64::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
(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;

View File

@ -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: <LocalExecAddr>:
# 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: <LocalExecVal>:
# 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