[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