[PATCH] [lld][ELF] rename TLV contentTypes for ELF

Shankar Kalpathi Easwaran shankarke at gmail.com
Thu Aug 22 18:27:03 PDT 2013


Hi kledzik, Bigcheese,

    typeTLV content type is used by Darwin to represent thread local
    storage. A new contentType has to be made to represent ELF
    thread local storage data. These have been set to
    
    - typeThreadZeroFill (represents TBSS storage)
    - typeThreadData     (represents TDATA storage0


http://llvm-reviews.chandlerc.com/D1482

Files:
  include/lld/Core/DefinedAtom.h
  lib/Core/DefinedAtom.cpp
  lib/ReaderWriter/ELF/Atoms.h
  lib/ReaderWriter/ELF/DefaultLayout.h
  lib/ReaderWriter/ELF/SectionChunks.h
  lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
  test/elf/X86_64/largebss.test

Index: include/lld/Core/DefinedAtom.h
===================================================================
--- include/lld/Core/DefinedAtom.h
+++ include/lld/Core/DefinedAtom.h
@@ -145,6 +145,8 @@
     typeTLVInitialZeroFill, // TLV initial zero fill data [Darwin]
     typeTLVInitializerPtr,  // pointer to thread local initializer [Darwin]
     typeDataDirectoryEntry, // linker created for data directory header [PECOFF]
+    typeThreadZeroFill,     // Uninitialized thread local data(TBSS) [ELF]
+    typeThreadData,         // Initialized thread local data(TDATA) [ELF]
   };
 
   // Permission bits for atoms and segments. The order of these values are
@@ -311,7 +313,8 @@
     ContentType atomContentType = contentType();
     return !(atomContentType == DefinedAtom::typeZeroFill ||
              atomContentType == DefinedAtom::typeZeroFillFast ||
-             atomContentType == DefinedAtom::typeTLVInitialZeroFill);
+             atomContentType == DefinedAtom::typeTLVInitialZeroFill ||
+             atomContentType == DefinedAtom::typeThreadZeroFill);
   }
 
 protected:
Index: lib/Core/DefinedAtom.cpp
===================================================================
--- lib/Core/DefinedAtom.cpp
+++ lib/Core/DefinedAtom.cpp
@@ -65,6 +65,8 @@
   case typeTLVInitialData:
   case typeTLVInitialZeroFill:
   case typeTLVInitializerPtr:
+  case typeThreadData:
+  case typeThreadZeroFill:
     return permRW_L;
 
   case typeUnknown:
Index: lib/ReaderWriter/ELF/Atoms.h
===================================================================
--- lib/ReaderWriter/ELF/Atoms.h
+++ lib/ReaderWriter/ELF/Atoms.h
@@ -286,8 +286,8 @@
 
     if (_section->sh_flags ==
         (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | llvm::ELF::SHF_TLS)) {
-      return _contentType = _section->sh_type == llvm::ELF::SHT_NOBITS ? typeTLVInitialZeroFill
-                                                        : typeTLVInitialData;
+      return _contentType = _section->sh_type == llvm::ELF::SHT_NOBITS ? typeThreadZeroFill
+                                                        : typeThreadData;
     }
 
     if (_symbol->getType() == llvm::ELF::STT_GNU_IFUNC)
Index: lib/ReaderWriter/ELF/DefaultLayout.h
===================================================================
--- lib/ReaderWriter/ELF/DefaultLayout.h
+++ lib/ReaderWriter/ELF/DefaultLayout.h
@@ -343,9 +343,9 @@
   case DefinedAtom::typeStub:
     return ORDER_PLT;
 
-  case DefinedAtom::typeTLVInitialData:
+  case DefinedAtom::typeThreadData:
     return ORDER_TDATA;
-  case DefinedAtom::typeTLVInitialZeroFill:
+  case DefinedAtom::typeThreadZeroFill:
     return ORDER_TBSS;
   default:
     // If we get passed in a section push it to OTHER
Index: lib/ReaderWriter/ELF/SectionChunks.h
===================================================================
--- lib/ReaderWriter/ELF/SectionChunks.h
+++ lib/ReaderWriter/ELF/SectionChunks.h
@@ -146,11 +146,11 @@
     case DefinedAtom::typeGOT:
     case DefinedAtom::typeStub:
     case DefinedAtom::typeResolver:
-    case DefinedAtom::typeTLVInitialData:
+    case DefinedAtom::typeThreadData:
       this->_type = SHT_PROGBITS;
       break;
 
-    case DefinedAtom::typeTLVInitialZeroFill:
+    case DefinedAtom::typeThreadZeroFill:
     case DefinedAtom::typeZeroFillFast:
     case DefinedAtom::typeZeroFill:
       this->_type = SHT_NOBITS;
@@ -167,8 +167,8 @@
     case DefinedAtom::permRW_:
     case DefinedAtom::permRW_L:
       this->_flags = SHF_ALLOC | SHF_WRITE;
-      if (_contentType == DefinedAtom::typeTLVInitialData ||
-          _contentType == DefinedAtom::typeTLVInitialZeroFill)
+      if (_contentType == DefinedAtom::typeThreadData ||
+          _contentType == DefinedAtom::typeThreadZeroFill)
         this->_flags |= SHF_TLS;
       break;
     case DefinedAtom::permRWX:
@@ -292,16 +292,16 @@
     case DefinedAtom::typeGOT:
     case DefinedAtom::typeStub:
     case DefinedAtom::typeResolver:
-    case DefinedAtom::typeTLVInitialData:
+    case DefinedAtom::typeThreadData:
       _atoms.push_back(new (_alloc) lld::AtomLayout(atom, fOffset, 0));
       this->_fsize = fOffset + definedAtom->size();
       this->_msize = mOffset + definedAtom->size();
       DEBUG_WITH_TYPE("Section",
                       llvm::dbgs() << "[" << this->name() << " " << this << "] "
                                    << "Adding atom: " << atom->name() << "@"
                                    << fOffset << "\n");
       break;
-    case DefinedAtom::typeTLVInitialZeroFill:
+    case DefinedAtom::typeThreadZeroFill:
     case DefinedAtom::typeZeroFill:
     case DefinedAtom::typeZeroFillFast:
       _atoms.push_back(new (_alloc) lld::AtomLayout(atom, mOffset, 0));
@@ -713,8 +713,8 @@
     type = llvm::ELF::STT_OBJECT;
     sym.st_value = addr;
     break;
-  case DefinedAtom::typeTLVInitialData:
-  case DefinedAtom::typeTLVInitialZeroFill:
+  case DefinedAtom::typeThreadData:
+  case DefinedAtom::typeThreadZeroFill:
     type = llvm::ELF::STT_TLS;
     sym.st_value = addr;
     break;
Index: lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
===================================================================
--- lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
+++ lib/ReaderWriter/YAML/ReaderWriterYAML.cpp
@@ -487,6 +487,10 @@
                           lld::DefinedAtom::typeTLVInitialZeroFill);
     io.enumCase(value, "tlv-initializer-ptr",
                           lld::DefinedAtom::typeTLVInitializerPtr);
+    io.enumCase(value, "thread-data",
+                          lld::DefinedAtom::typeThreadData);
+    io.enumCase(value, "thread-zero-fill",
+                          lld::DefinedAtom::typeThreadZeroFill);
   }
 };
 
Index: test/elf/X86_64/largebss.test
===================================================================
--- test/elf/X86_64/largebss.test
+++ test/elf/X86_64/largebss.test
@@ -19,6 +19,6 @@
 CHECK:    section-name:    .bss
 CHECK:  - name:            largetbss
 CHECK:    scope:           global
-CHECK:    type:            tlv-zero-fill
+CHECK:    type:            thread-zero-fill
 CHECK:    size:            4000
 CHECK:    section-name:    .tbss
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1482.1.patch
Type: text/x-patch
Size: 6127 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130822/a8e1882f/attachment.bin>


More information about the llvm-commits mailing list