forked from OSchip/llvm-project
[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:
parent
e1669843f2
commit
65f6810d3a
|
@ -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;
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue