OSDN Git Service

[ELF][ARM] Represent R_ARM_LDO32 as R_DTPREL instead of R_ABS
authorFangrui Song <maskray@google.com>
Mon, 6 Jul 2020 16:47:53 +0000 (09:47 -0700)
committerFangrui Song <maskray@google.com>
Mon, 6 Jul 2020 16:47:53 +0000 (09:47 -0700)
Follow-up to D82899. Note, we need to disable R_DTPREL relaxation
because ARM psABI does not define TLS relaxation.

Reviewed By: grimar, psmith

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

lld/ELF/Arch/ARM.cpp
lld/ELF/Relocations.cpp
lld/test/ELF/debug-dead-reloc-tls-arm.s

index 0dfdbf3..fd90557 100644 (file)
@@ -121,6 +121,8 @@ RelExpr ARM::getRelExpr(RelType type, const Symbol &s,
     return R_TLSGD_PC;
   case R_ARM_TLS_LDM32:
     return R_TLSLD_PC;
+  case R_ARM_TLS_LDO32:
+    return R_DTPREL;
   case R_ARM_BASE_PREL:
     // B(S) + A - P
     // FIXME: currently B(S) assumed to be .got, this may not hold for all
index dfae234..42341f6 100644 (file)
@@ -238,7 +238,7 @@ handleTlsRelocation(RelType type, Symbol &sym, InputSectionBase &c,
   }
 
   // Local-Dynamic relocs can be relaxed to Local-Exec.
-  if (expr == R_DTPREL && !config->shared) {
+  if (expr == R_DTPREL && canRelax && !config->shared) {
     c.relocations.push_back(
         {target->adjustRelaxExpr(type, nullptr, R_RELAX_TLS_LD_TO_LE), type,
          offset, addend, &sym});
index 146133a..7fa5bca 100644 (file)
@@ -7,8 +7,7 @@
 # RUN: llvm-objdump -s %t | FileCheck %s
 
 # CHECK:      Contents of section .debug_info:
-## FIXME: Use ffffffff
-# CHECK-NEXT:  0000 00000000
+# CHECK-NEXT:  0000 ffffffff
 
 .globl _start
 _start: