[PATCH] D18026: [lld] [ELF/AArch64] Fix TLS IE to LE relax for local symbols

Adhemerval Zanella via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 9 20:19:09 PST 2016


zatrazz created this revision.
zatrazz added reviewers: ruiu, rafael.
zatrazz added subscribers: llvm-commits, grimar, rengolin, emaste.
zatrazz set the repository for this revision to rL LLVM.
zatrazz added a project: lld.
Herald added a subscriber: aemerson.

This patch fix the TLS relax optimization when transforming Initial-Exec
to Local-Exec for local symbols (which can not be preempted).

Repository:
  rL LLVM

http://reviews.llvm.org/D18026

Files:
  ELF/Target.cpp
  test/ELF/aarch64-tls-iele.s

Index: test/ELF/aarch64-tls-iele.s
===================================================================
--- test/ELF/aarch64-tls-iele.s
+++ test/ELF/aarch64-tls-iele.s
@@ -5,17 +5,30 @@
 # RUN: llvm-readobj -s -r %tout | FileCheck -check-prefix=RELOC %s
 # REQUIRES: aarch64
 
-#Local-Dynamic to Initial-Exec relax creates no
+# Initial-Exec to Local-Exec relax creates no dynamic relocations.
 #RELOC:      Relocations [
 #RELOC-NEXT: ]
 
 # TCB size = 0x16 and foo is first element from TLS register.
 #CHECK: Disassembly of section .text:
 #CHECK: _start:
-#CHECK:  11000:	00 00 a0 d2	movz	x0, #0, lsl #16
-#CHECK:  11004:	00 02 80 f2 	movk	x0, #0x10
+#CHECK:  11000:	00 00 a0 d2     movz    x0, #0, lsl #16
+#CHECK:  11004:	80 02 80 f2     movk    x0, #0x14
+#CHECK:  11008: 00 00 a0 d2     movz    x0, #0, lsl #16
+#CHECK:  1100c: 00 02 80 f2     movk    x0, #0x10
+
+
+.section .tdata
+.align 2
+.type foo_local, %object
+.size foo_local, 4
+foo_local:
+.word 5
+.text
 
 .globl _start
 _start:
  adrp    x0, :gottprel:foo
  ldr     x0, [x0, :gottprel_lo12:foo]
+ adrp    x0, :gottprel:foo_local
+ ldr     x0, [x0, :gottprel_lo12:foo_local]
Index: ELF/Target.cpp
===================================================================
--- ELF/Target.cpp
+++ ELF/Target.cpp
@@ -1361,9 +1361,8 @@
 }
 
 bool AArch64TargetInfo::needsGot(uint32_t Type, SymbolBody &S) const {
-  if (Type == R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC ||
-      Type == R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21)
-    return true;
+  if (isTlsInitialExecRel(Type))
+    return canBePreempted(&S);
   if (isTlsDescRel (Type, S))
     return canBePreempted(&S);
   return refersToGotEntry(Type) || needsPlt<ELF64LE>(Type, S);
@@ -1529,7 +1528,7 @@
     return 0;
   case R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
   case R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
-    relocateTlsIeToLe(Type, Loc, BufEnd, P, S->getVA<ELF64LE>());
+    relocateTlsIeToLe(Type, Loc, BufEnd, P, SA);
     return 0;
   }
   llvm_unreachable("Unknown TLS optimization");


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18026.50229.patch
Type: text/x-patch
Size: 2040 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160310/66746e10/attachment.bin>


More information about the llvm-commits mailing list