[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