[lld] 65f6810 - [LLD][PowerPC] Add support for R_PPC64_TPREL34 used in TLS Local Exec

Stefan Pintilie via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 07:07:44 PDT 2020


Author: Stefan Pintilie
Date: 2020-09-15T09:06:19-05:00
New Revision: 65f6810d3a4b0ef1fdaad49e808459fbd133bb20

URL: https://github.com/llvm/llvm-project/commit/65f6810d3a4b0ef1fdaad49e808459fbd133bb20
DIFF: https://github.com/llvm/llvm-project/commit/65f6810d3a4b0ef1fdaad49e808459fbd133bb20.diff

LOG: [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 at tprel
```
The relocation is:
```
R_PPC_TPREL34
```

Reviewed By: NeHuang, MaskRay

Differential Revision: https://reviews.llvm.org/D86608

Added: 
    lld/test/ELF/ppc64-tls-pcrel-le.s

Modified: 
    lld/ELF/Arch/PPC64.cpp

Removed: 
    


################################################################################
diff  --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index bdd7d5517213..522546331f51 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -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;

diff  --git a/lld/test/ELF/ppc64-tls-pcrel-le.s b/lld/test/ELF/ppc64-tls-pcrel-le.s
new file mode 100644
index 000000000000..bff7d075eda4
--- /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: <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 at TPREL, 0
+	paddi 3, 13, y at TPREL, 0
+	paddi 3, 13, z at TPREL+12, 0
+	blr
+
+LocalExecVal:
+	paddi 3, 13, x at TPREL, 0
+	lwz 3, 0(3)
+	paddi 3, 13, y at TPREL, 0
+	lwz 3, 0(3)
+	paddi 3, 13, z at TPREL+12, 0
+	lwz 3, 0(3)
+	blr
+
+.section .tbss, "awT", @nobits
+x:
+	.long	0
+y:
+	.long	0
+z:
+	.space	20


        


More information about the llvm-commits mailing list