[lld] r174427 - [ELF][Layout] Provide a proper way to get the TLS segment size.

Michael J. Spencer bigcheesegs at gmail.com
Tue Feb 5 11:14:43 PST 2013


Author: mspencer
Date: Tue Feb  5 13:14:43 2013
New Revision: 174427

URL: http://llvm.org/viewvc/llvm-project?rev=174427&view=rev
Log:
[ELF][Layout] Provide a proper way to get the TLS segment size.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=174427&r1=174426&r2=174427&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Tue Feb  5 13:14:43 2013
@@ -247,6 +247,13 @@ public:
     return _relocationTable;
   }
 
+  uint64_t getTLSSize() const {
+    for (const auto &phdr : *_programHeader)
+      if (phdr->p_type == llvm::ELF::PT_TLS)
+        return phdr->p_memsz;
+    return 0;
+  }
+
 private:
   SectionMapT _sectionMap;
   MergedSectionMapT _mergedSectionMap;
@@ -316,6 +323,10 @@ StringRef DefaultLayout<ELFT>::getSectio
     return ".text";
   if (name.startswith(".rodata"))
     return ".rodata";
+  if (name.startswith(".tdata"))
+    return ".tdata";
+  if (name.startswith(".tbss"))
+    return ".tbss";
   return name;
 }
 

Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp?rev=174427&r1=174426&r2=174427&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64TargetHandler.cpp Tue Feb  5 13:14:43 2013
@@ -78,19 +78,8 @@ ErrorOr<void> X86_64TargetRelocationHand
   case R_X86_64_TPOFF64:
   case R_X86_64_DTPOFF32:
   case R_X86_64_TPOFF32: {
-    // Get the start and end of the TLS segment.
-    if (_tlsSize == 0) {
-      auto tdata = _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
-          .findOutputSection(".tdata");
-      auto tbss = _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
-          .findOutputSection(".tbss");
-      // HACK: The tdata and tbss sections end up together to from the TLS
-      // segment. This should actually use the TLS program header entry.
-      if (tdata)
-        _tlsSize = tdata->memSize();
-      if (tbss)
-        _tlsSize += tbss->memSize();
-    }
+    _tlsSize = _targetInfo.getTargetHandler<X86_64ELFType>().targetLayout()
+        .getTLSSize();
     if (ref.kind() == R_X86_64_TPOFF32 || ref.kind() == R_X86_64_DTPOFF32) {
       int32_t result = (int32_t)(targetVAddress - _tlsSize);
       *reinterpret_cast<llvm::support::little32_t *>(location) = result;





More information about the llvm-commits mailing list