[lld] 5f3e565 - Revert "[LLD][PowerPC] Add support for R_PPC64_GOT_TLSGD_PCREL34 used in TLS General Dynamic"

Stefan Pintilie via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 1 11:29:16 PDT 2020


Author: Stefan Pintilie
Date: 2020-10-01T13:28:35-05:00
New Revision: 5f3e565f59ee8c5614663a484df1dc853ca3694d

URL: https://github.com/llvm/llvm-project/commit/5f3e565f59ee8c5614663a484df1dc853ca3694d
DIFF: https://github.com/llvm/llvm-project/commit/5f3e565f59ee8c5614663a484df1dc853ca3694d.diff

LOG: Revert "[LLD][PowerPC] Add support for R_PPC64_GOT_TLSGD_PCREL34 used in TLS General Dynamic"

This reverts commit 79122868f9a3909cfd94d51e9bfe960917a1be05.

Added: 
    

Modified: 
    lld/ELF/Arch/PPC64.cpp
    lld/ELF/Relocations.cpp

Removed: 
    lld/test/ELF/ppc64-tls-pcrel-gd.s


################################################################################
diff  --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index 2e7b20d46cb0..06dd863f31b2 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -727,38 +727,15 @@ void PPC64::relaxTlsGdToLe(uint8_t *loc, const Relocation &rel,
     writeFromHalf16(loc, 0x3c6d0000); // addis r3, r13
     relocateNoSym(loc, R_PPC64_TPREL16_HA, val);
     break;
-  case R_PPC64_GOT_TLSGD_PCREL34:
-    // Relax from paddi r3, 0, x at got@tlsgd at pcrel, 1 to
-    //            paddi r3, r13, x at tprel, 0
-    writePrefixedInstruction(loc, 0x06000000386d0000);
-    relocateNoSym(loc, R_PPC64_TPREL34, val);
-    break;
-  case R_PPC64_TLSGD: {
-    // PC Relative Relaxation:
-    // Relax from bl __tls_get_addr at notoc(x at tlsgd) to
-    //            nop
-    // TOC Relaxation:
-    // Relax from bl __tls_get_addr(x at tlsgd)
-    //            nop
-    // to
-    //            nop
-    //            addi r3, r3, x at tprel@l
-    const uintptr_t locAsInt = reinterpret_cast<uintptr_t>(loc);
-    if (locAsInt % 4 == 0) {
-      write32(loc, NOP);            // nop
-      write32(loc + 4, 0x38630000); // addi r3, r3
-      // Since we are relocating a half16 type relocation and Loc + 4 points to
-      // the start of an instruction we need to advance the buffer by an extra
-      // 2 bytes on BE.
-      relocateNoSym(loc + 4 + (config->ekind == ELF64BEKind ? 2 : 0),
-                    R_PPC64_TPREL16_LO, val);
-    } else if (locAsInt % 4 == 1) {
-      write32(loc - 1, NOP);
-    } else {
-      errorOrWarn("R_PPC64_TLSGD has unexpected byte alignment");
-    }
+  case R_PPC64_TLSGD:
+    write32(loc, NOP);
+    write32(loc + 4, 0x38630000); // addi r3, r3
+    // Since we are relocating a half16 type relocation and Loc + 4 points to
+    // the start of an instruction we need to advance the buffer by an extra
+    // 2 bytes on BE.
+    relocateNoSym(loc + 4 + (config->ekind == ELF64BEKind ? 2 : 0),
+                  R_PPC64_TPREL16_LO, val);
     break;
-  }
   default:
     llvm_unreachable("unsupported relocation for TLS GD to LE relaxation");
   }
@@ -970,8 +947,6 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
   case R_PPC64_GOT_TLSGD16_HI:
   case R_PPC64_GOT_TLSGD16_LO:
     return R_TLSGD_GOT;
-  case R_PPC64_GOT_TLSGD_PCREL34:
-    return R_TLSGD_PC;
   case R_PPC64_GOT_TLSLD16:
   case R_PPC64_GOT_TLSLD16_HA:
   case R_PPC64_GOT_TLSLD16_HI:
@@ -1286,7 +1261,6 @@ void PPC64::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
     break;
   case R_PPC64_PCREL34:
   case R_PPC64_GOT_PCREL34:
-  case R_PPC64_GOT_TLSGD_PCREL34:
   case R_PPC64_GOT_TPREL_PCREL34:
   case R_PPC64_TPREL34: {
     const uint64_t si0Mask = 0x00000003ffff0000;
@@ -1366,8 +1340,7 @@ RelExpr PPC64::adjustRelaxExpr(RelType type, const uint8_t *data,
     if ((readPrefixedInstruction(data) & 0xfc000000) == 0xe4000000)
       return R_PPC64_RELAX_GOT_PC;
   }
-
-  if (type != R_PPC64_GOT_TLSGD_PCREL34 && expr == R_RELAX_TLS_GD_TO_IE)
+  if (expr == R_RELAX_TLS_GD_TO_IE)
     return R_RELAX_TLS_GD_TO_IE_GOT_OFF;
   if (expr == R_RELAX_TLS_LD_TO_LE)
     return R_RELAX_TLS_LD_TO_LE_ABS;
@@ -1408,35 +1381,10 @@ void PPC64::relaxTlsGdToIe(uint8_t *loc, const Relocation &rel,
     relocateNoSym(loc, R_PPC64_GOT_TPREL16_LO_DS, val);
     return;
   }
-  case R_PPC64_GOT_TLSGD_PCREL34: {
-    // Relax from paddi r3, 0, sym at got@tlsgd at pcrel, 1 to
-    //            pld r3, sym at got@tprel at pcrel
-    writePrefixedInstruction(loc, 0x04100000e4600000);
-    relocateNoSym(loc, R_PPC64_GOT_TPREL_PCREL34, val);
-    return;
-  }
-  case R_PPC64_TLSGD: {
-    // PC Relative Relaxation:
-    // Relax from bl __tls_get_addr at notoc(x at tlsgd) to
-    //            nop
-    // TOC Relaxation:
-    // Relax from bl __tls_get_addr(x at tlsgd)
-    //            nop
-    // to
-    //            nop
-    //            add r3, r3, r13
-    const uintptr_t locAsInt = reinterpret_cast<uintptr_t>(loc);
-    if (locAsInt % 4 == 0) {
-      write32(loc, NOP);            // bl __tls_get_addr(sym at tlsgd) --> nop
-      write32(loc + 4, 0x7c636A14); // nop --> add r3, r3, r13
-    } else if (locAsInt % 4 == 1) {
-      // bl __tls_get_addr(sym at tlsgd) --> add r3, r3, r13
-      write32(loc - 1, 0x7c636a14);
-    } else {
-      errorOrWarn("R_PPC64_TLSGD has unexpected byte alignment");
-    }
+  case R_PPC64_TLSGD:
+    write32(loc, NOP);            // bl __tls_get_addr(sym at tlsgd) --> nop
+    write32(loc + 4, 0x7c636A14); // nop --> add r3, r3, r13
     return;
-  }
   default:
     llvm_unreachable("unsupported relocation for TLS GD to IE relaxation");
   }

diff  --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index ea6aa3c6a12a..4c6a70d9034e 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -1357,19 +1357,6 @@ static void scanReloc(InputSectionBase &sec, OffsetGetter &getOffset, RelTy *&i,
     if (type == R_PPC64_TOC16_LO && sym.isSection() && isa<Defined>(sym) &&
         cast<Defined>(sym).section->name == ".toc")
       ppc64noTocRelax.insert({&sym, addend});
-
-    if (type == R_PPC64_TLSGD && expr == R_TLSDESC_CALL) {
-      if (i == end) {
-        errorOrWarn("R_PPC64_TLSGD may not be the last relocation" +
-                    getLocation(sec, sym, offset));
-        return;
-      }
-
-      // Offset the 4-byte aligned R_PPC64_TLSGD by one byte in the NOTOC case,
-      // so we can discern it later from the toc-case.
-      if (i->getType(/*isMips64EL=*/false) == R_PPC64_REL24_NOTOC)
-        ++offset;
-    }
   }
 
   // Relax relocations.

diff  --git a/lld/test/ELF/ppc64-tls-pcrel-gd.s b/lld/test/ELF/ppc64-tls-pcrel-gd.s
deleted file mode 100644
index 2220d91fe798..000000000000
--- a/lld/test/ELF/ppc64-tls-pcrel-gd.s
+++ /dev/null
@@ -1,94 +0,0 @@
-# REQUIRES: ppc
-# RUN: split-file %s %t
-
-# RUN: llvm-mc -filetype=obj -triple=powerpc64le %t/asm -o %t.o
-# RUN: llvm-mc -filetype=obj -triple=powerpc64le %t/defs -o %t-defs.o
-# RUN: ld.lld --shared %t-defs.o -o %t-defs.so
-# RUN: ld.lld -T %t/lds --shared %t.o -o %t-gd.so
-# RUN: ld.lld -T %t/lds %t.o %t-defs.so -o %t-gdtoie
-# RUN: ld.lld -T %t/lds %t.o %t-defs.o -o %t-gdtole
-
-# RUN: llvm-readelf -r %t-gd.so | FileCheck %s --check-prefix=GD-RELOC
-# RUN: llvm-readelf -s %t-gd.so | FileCheck %s --check-prefix=GD-SYM
-# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t-gd.so | FileCheck %s --check-prefix=GD
-
-# RUN: llvm-readelf -r %t-gdtoie | FileCheck %s --check-prefix=GDTOIE-RELOC
-# RUN: llvm-readelf -s %t-gdtoie | FileCheck %s --check-prefix=GDTOIE-SYM
-# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t-gdtoie | FileCheck %s --check-prefix=GDTOIE
-
-# RUN: llvm-readelf -r %t-gdtole | FileCheck %s --check-prefix=GDTOLE-RELOC
-# RUN: llvm-readelf -s %t-gdtole | FileCheck %s --check-prefix=GDTOLE-SYM
-# RUN: llvm-objdump -d --no-show-raw-insn --mcpu=pwr10 %t-gdtole | FileCheck %s --check-prefix=GDTOLE
-
-## This test checks the General Dynamic PC Relative TLS implementation for lld.
-## GD - General Dynamic with no relaxation possible
-## GDTOIE - General Dynamic relaxed to Initial Exec
-## GDTOLE - General Dynamic relaxed to Local Exec
-
-#--- lds
-SECTIONS {
-  .text_addr 0x1001000 : { *(.text_addr) }
-}
-
-#--- defs
-.section .tbss,"awT", at nobits
-.globl  x
-x:
-  .long 0
-.globl  y
-y:
-  .long 0
-
-#--- asm
-
-# GD-RELOC: Relocation section '.rela.dyn' at offset 0x100b8 contains 4 entries:
-# GD-RELOC: 0000000001001160  0000000200000044 R_PPC64_DTPMOD64       0000000000000000 x + 0
-# GD-RELOC: 0000000001001168  000000020000004e R_PPC64_DTPREL64       0000000000000000 x + 0
-# GD-RELOC: 0000000001001170  0000000300000044 R_PPC64_DTPMOD64       0000000000000000 y + 0
-# GD-RELOC: 0000000001001178  000000030000004e R_PPC64_DTPREL64       0000000000000000 y + 0
-
-# GD-SYM:   Symbol table '.dynsym' contains 4 entries:
-# GD-SYM:   2: 0000000000000000     0 TLS     GLOBAL DEFAULT   UND x
-# GD-SYM:   3: 0000000000000000     0 TLS     GLOBAL DEFAULT   UND y
-
-
-# GDTOIE-RELOC: Relocation section '.rela.dyn' at offset 0x10118 contains 2 entries:
-# GDTOIE-RELOC: 00000000010010e0  0000000200000049 R_PPC64_TPREL64        0000000000000000 x + 0
-# GDTOIE-RELOC: 00000000010010e8  0000000300000049 R_PPC64_TPREL64        0000000000000000 y + 0
-
-# GDTOIE-SYM: Symbol table '.dynsym' contains 4 entries:
-# GDTOIE-SYM:   2: 0000000000000000     0 TLS     GLOBAL DEFAULT   UND x
-# GDTOIE-SYM:   3: 0000000000000000     0 TLS     GLOBAL DEFAULT   UND y
-
-
-# GDTOLE-RELOC: There are no relocations in this file.
-
-# GDTOLE-SYM: Symbol table '.symtab' contains 5 entries:
-# GDTOLE-SYM: 3: 0000000000000000     0 TLS     GLOBAL DEFAULT     3 x
-# GDTOLE-SYM: 4: 0000000000000004     0 TLS     GLOBAL DEFAULT     3 y
-
-# GD-LABEL: <GDTwoVal>:
-# GD-NEXT:    paddi 3, 0, 352, 1
-# GD-NEXT:    bl
-# GD-NEXT:    paddi 3, 0, 356, 1
-# GD-NEXT:    bl
-# GD-NEXT:    blr
-# GDTOIE-LABEL: <GDTwoVal>:
-# GDTOIE-NEXT:    pld 3, 224(0), 1
-# GDTOIE-NEXT:    add 3, 3, 13
-# GDTOIE-NEXT:    pld 3, 220(0), 1
-# GDTOIE-NEXT:    add 3, 3, 13
-# GDTOIE-NEXT:    blr
-# GDTOLE-LABEL: <GDTwoVal>:
-# GDTOLE-NEXT:    paddi 3, 13, -28672, 0
-# GDTOLE-NEXT:    nop
-# GDTOLE-NEXT:    paddi 3, 13, -28668, 0
-# GDTOLE-NEXT:    nop
-# GDTOLE-NEXT:    blr
-.section .text_addr, "ax", %progbits
-GDTwoVal:
-  paddi 3, 0, x at got@tlsgd at pcrel, 1
-  bl __tls_get_addr at notoc(x at tlsgd)
-  paddi 3, 0, y at got@tlsgd at pcrel, 1
-  bl __tls_get_addr at notoc(y at tlsgd)
-  blr


        


More information about the llvm-commits mailing list