From 65f6810d3a4b0ef1fdaad49e808459fbd133bb20 Mon Sep 17 00:00:00 2001 From: Stefan Pintilie Date: Tue, 15 Sep 2020 08:23:58 -0500 Subject: [PATCH] [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 --- lld/ELF/Arch/PPC64.cpp | 4 ++- lld/test/ELF/ppc64-tls-pcrel-le.s | 56 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/ppc64-tls-pcrel-le.s diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp index bdd7d55..5225463 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 0000000..bff7d07 --- /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 -- 2.7.4