[lld] r183815 - [ELF] TBSS section has to be special cased so that it doesnot occupy memory space
Shankar Easwaran
shankare at codeaurora.org
Tue Jun 11 17:32:32 PDT 2013
Author: shankare
Date: Tue Jun 11 19:32:32 2013
New Revision: 183815
URL: http://llvm.org/viewvc/llvm-project?rev=183815&view=rev
Log:
[ELF] TBSS section has to be special cased so that it doesnot occupy memory space
Added:
lld/trunk/test/elf/Inputs/tlsAddr.x86-64
lld/trunk/test/elf/Inputs/tlsaddr.c
lld/trunk/test/elf/tlsAddr.test
Modified:
lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h
lld/trunk/test/elf/dynamic-segorder.test
Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=183815&r1=183814&r2=183815&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Tue Jun 11 19:32:32 2013
@@ -581,8 +581,13 @@ template <class ELFT> void DefaultLayout
int64_t lookupSectionFlag = msi->flags();
if (!(lookupSectionFlag & llvm::ELF::SHF_WRITE))
lookupSectionFlag &= ~llvm::ELF::SHF_EXECINSTR;
+
+ // Merge string sections into Data segment itself
lookupSectionFlag &= ~(llvm::ELF::SHF_STRINGS | llvm::ELF::SHF_MERGE);
+ // Merge the TLS section into the DATA segment itself
+ lookupSectionFlag &= ~(llvm::ELF::SHF_TLS);
+
Segment<ELFT> *segment;
// We need a seperate segment for sections that dont have
// the segment type to be PT_LOAD
Modified: lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h?rev=183815&r1=183814&r2=183815&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.h Tue Jun 11 19:32:32 2013
@@ -30,6 +30,9 @@
namespace lld {
namespace elf {
+
+template <typename ELFT> class DefaultLayout;
+
/// \brief A segment can be divided into segment slices
/// depending on how the segments can be split
template<class ELFT>
@@ -496,8 +499,13 @@ template <class ELFT> void Segment<ELFT>
}
if (isTLSSegment)
tlsStartAddr += section->memSize();
- addr += section->memSize();
- section->setMemSize(addr - section->virtualAddr());
+ section->setMemSize(addr + section->memSize() - section->virtualAddr());
+ // TBSS section is special that it doesnot contribute to memory of any
+ // segment, If we see a tbss section, dont add memory size to addr
+ // The fileOffset is automatically taken care of since TBSS section does
+ // not endup using file size
+ if (section->order() != DefaultLayout<ELFT>::ORDER_TBSS)
+ addr += section->memSize();
}
slice->setMemSize(addr - slice->virtualAddr());
}
Added: lld/trunk/test/elf/Inputs/tlsAddr.x86-64
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/tlsAddr.x86-64?rev=183815&view=auto
==============================================================================
Binary files lld/trunk/test/elf/Inputs/tlsAddr.x86-64 (added) and lld/trunk/test/elf/Inputs/tlsAddr.x86-64 Tue Jun 11 19:32:32 2013 differ
Added: lld/trunk/test/elf/Inputs/tlsaddr.c
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/Inputs/tlsaddr.c?rev=183815&view=auto
==============================================================================
--- lld/trunk/test/elf/Inputs/tlsaddr.c (added)
+++ lld/trunk/test/elf/Inputs/tlsaddr.c Tue Jun 11 19:32:32 2013
@@ -0,0 +1,8 @@
+__thread int tls0 = 0;
+__thread int tls1 = 0;
+__thread int tls2 = 1;
+__thread int tls3 = 2;
+
+int main() {
+ return tls0 + tls1 + tls2;
+}
Modified: lld/trunk/test/elf/dynamic-segorder.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/dynamic-segorder.test?rev=183815&r1=183814&r2=183815&view=diff
==============================================================================
--- lld/trunk/test/elf/dynamic-segorder.test (original)
+++ lld/trunk/test/elf/dynamic-segorder.test Tue Jun 11 19:32:32 2013
@@ -10,8 +10,6 @@ CHECK: LOAD
CHECK: flags r-x
CHECK: LOAD
CHECK: flags rw-
-CHECK: LOAD
-CHECK: flags rw-
CHECK: DYNAMIC
CHECK: flags r--
CHECK: TLS
Added: lld/trunk/test/elf/tlsAddr.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/tlsAddr.test?rev=183815&view=auto
==============================================================================
--- lld/trunk/test/elf/tlsAddr.test (added)
+++ lld/trunk/test/elf/tlsAddr.test Tue Jun 11 19:32:32 2013
@@ -0,0 +1,7 @@
+# This tests verifies that TLS variables have correct offsets
+# and that TBSS doesnot occupy memory
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/tlsAddr.x86-64 -static \
+RUN: -o %t --noinhibit-exec
+RUN: llvm-objdump -section-headers %t | FileCheck -check-prefix=CHECKADDR %s
+
+CHECKADDR: 8 .data 00000000 0000000000401008 DATA
More information about the llvm-commits
mailing list