[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