[lld] r183817 - [ELF][X86_64] Create GOT entries for external TLS symbols properly without Segfaults.

Shankar Easwaran shankare at codeaurora.org
Tue Jun 11 17:32:39 PDT 2013


Author: shankare
Date: Tue Jun 11 19:32:39 2013
New Revision: 183817

URL: http://llvm.org/viewvc/llvm-project?rev=183817&view=rev
Log:
[ELF][X86_64] Create GOT entries for external TLS symbols properly without Segfaults.

Added:
    lld/trunk/test/elf/X86_64/Inputs/externtls.c
    lld/trunk/test/elf/X86_64/Inputs/externtls.x86-64
    lld/trunk/test/elf/X86_64/extern-tls.test
Modified:
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp?rev=183817&r1=183816&r2=183817&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.cpp Tue Jun 11 19:32:39 2013
@@ -140,7 +140,7 @@ protected:
   }
 
   /// \brief Create a GOT entry for the TP offset of a TLS atom.
-  const GOTAtom *getGOTTPOFF(const DefinedAtom *atom) {
+  const GOTAtom *getGOTTPOFF(const Atom *atom) {
     auto got = _gotMap.find(atom);
     if (got == _gotMap.end()) {
       auto g = new (_file._alloc) X86_64GOTAtom(_file, ".got");
@@ -159,8 +159,7 @@ protected:
   /// \brief Create a TPOFF64 GOT entry and change the relocation to a PC32 to
   /// the GOT.
   void handleGOTTPOFF(const Reference &ref) {
-    auto target = dyn_cast_or_null<const DefinedAtom>(ref.target());
-    const_cast<Reference &>(ref).setTarget(getGOTTPOFF(target));
+    const_cast<Reference &>(ref).setTarget(getGOTTPOFF(ref.target()));
     const_cast<Reference &>(ref).setKind(R_X86_64_PC32);
   }
 

Added: lld/trunk/test/elf/X86_64/Inputs/externtls.c
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/externtls.c?rev=183817&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/Inputs/externtls.c (added)
+++ lld/trunk/test/elf/X86_64/Inputs/externtls.c Tue Jun 11 19:32:39 2013
@@ -0,0 +1,6 @@
+extern __thread  int extern_tls;
+
+int main() {
+  extern_tls = 1;
+  return 0;
+}

Added: lld/trunk/test/elf/X86_64/Inputs/externtls.x86-64
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/externtls.x86-64?rev=183817&view=auto
==============================================================================
Binary files lld/trunk/test/elf/X86_64/Inputs/externtls.x86-64 (added) and lld/trunk/test/elf/X86_64/Inputs/externtls.x86-64 Tue Jun 11 19:32:39 2013 differ

Added: lld/trunk/test/elf/X86_64/extern-tls.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/extern-tls.test?rev=183817&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/extern-tls.test (added)
+++ lld/trunk/test/elf/X86_64/extern-tls.test Tue Jun 11 19:32:39 2013
@@ -0,0 +1,16 @@
+# This tests verifies that TLS variables have correct offsets
+# when variables the TLS variables are not defined in the program
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/externtls.x86-64 -static  \
+RUN: -emit-yaml --noinhibit-exec | FileCheck %s -check-prefix=CHECKGOT
+
+CHECKGOT:  - name:            __got_tls_extern_tls
+CHECKGOT:    type:            got
+CHECKGOT:    content:         [ 00, 00, 00, 00, 00, 00, 00, 00 ]
+CHECKGOT:    alignment:       2^3
+CHECKGOT:    section-choice:  custom-required
+CHECKGOT:    section-name:    .got
+CHECKGOT:    permissions:     rw-
+CHECKGOT:    references:      
+CHECKGOT:      - kind:            R_X86_64_TPOFF64
+CHECKGOT:        offset:          0
+CHECKGOT:        target:          extern_tls





More information about the llvm-commits mailing list