[lld] r190840 - [lld][ELF] Assign sectionChoice properly to ELF atoms

Shankar Easwaran shankare at codeaurora.org
Mon Sep 16 19:56:22 PDT 2013


Author: shankare
Date: Mon Sep 16 21:56:22 2013
New Revision: 190840

URL: http://llvm.org/viewvc/llvm-project?rev=190840&view=rev
Log:
[lld][ELF] Assign sectionChoice properly to ELF atoms

This sets the sectionChoice property for DefinedAtoms. The output section name
is derived by the property of the atom. This also decreases native file size.

Adds a test.

Added:
    lld/trunk/test/elf/X86_64/sectionchoice.test
Modified:
    lld/trunk/lib/ReaderWriter/ELF/Atoms.h
    lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
    lld/trunk/test/elf/mergeconstants.test

Modified: lld/trunk/lib/ReaderWriter/ELF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Atoms.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Atoms.h Mon Sep 16 21:56:22 2013
@@ -16,6 +16,7 @@
 #include "lld/ReaderWriter/Simple.h"
 
 #include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringSwitch.h"
 
 #include <memory>
 #include <vector>
@@ -376,9 +377,20 @@ public:
 
   // Do we have a choice for ELF?  All symbols live in explicit sections.
   virtual SectionChoice sectionChoice() const {
-    if (_symbol->st_shndx > llvm::ELF::SHN_LORESERVE)
-      return sectionBasedOnContent;
-
+    switch (contentType()) {
+    case typeCode:
+    case typeData:
+    case typeZeroFill:
+    case typeThreadZeroFill:
+    case typeThreadData:
+    case typeConstant:
+      if ((_sectionName == ".text") || (_sectionName == ".data") ||
+          (_sectionName == ".bss") || (_sectionName == ".rodata") ||
+          (_sectionName == ".tdata") || (_sectionName == ".tbss"))
+        return sectionBasedOnContent;
+    default:
+      break;
+    }
     return sectionCustomRequired;
   }
 

Modified: lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DefaultLayout.h Mon Sep 16 21:56:22 2013
@@ -172,8 +172,7 @@ public:
                                        int32_t contentPermissions);
 
   /// \brief This maps the input sections to the output section names
-  virtual StringRef getSectionName(StringRef name, const int32_t contentType,
-                                   const int32_t contentPermissions);
+  virtual StringRef getSectionName(const DefinedAtom *da) const;
 
   /// \brief Gets or creates a section.
   AtomSection<ELFT> *getSection(
@@ -372,29 +371,35 @@ Layout::SectionOrder DefaultLayout<ELFT>
 
 /// \brief This maps the input sections to the output section names
 template <class ELFT>
-StringRef DefaultLayout<ELFT>::getSectionName(
-    StringRef name, const int32_t contentType,
-    const int32_t contentPermissions) {
-  if ((contentType == DefinedAtom::typeZeroFill) ||
-      (contentType == DefinedAtom::typeZeroFillFast))
-    return ".bss";
-  if (name.startswith(".text"))
-    return ".text";
-  if (name.startswith(".rodata"))
-    return ".rodata";
-  if (name.startswith(".gcc_except_table"))
-    return ".gcc_except_table";
-  if (name.startswith(".data.rel.ro"))
-    return ".data.rel.ro";
-  if (name.startswith(".data.rel.local"))
-    return ".data.rel.local";
-  if (name.startswith(".data"))
-    return ".data";
-  if (name.startswith(".tdata"))
-    return ".tdata";
-  if (name.startswith(".tbss"))
-    return ".tbss";
-  return name;
+StringRef DefaultLayout<ELFT>::getSectionName(const DefinedAtom *da) const {
+  if (da->sectionChoice() == DefinedAtom::sectionBasedOnContent) {
+    switch (da->contentType()) {
+    case DefinedAtom::typeCode:
+      return ".text";
+    case DefinedAtom::typeData:
+      return ".data";
+    case DefinedAtom::typeConstant:
+      return ".rodata";
+    case DefinedAtom::typeZeroFill:
+      return ".bss";
+    case DefinedAtom::typeThreadData:
+      return ".tdata";
+    case DefinedAtom::typeThreadZeroFill:
+      return ".tbss";
+    default:
+      break;
+    }
+  }
+  return llvm::StringSwitch<StringRef>(da->customSectionName())
+      .StartsWith(".text", ".text")
+      .StartsWith(".rodata", ".rodata")
+      .StartsWith(".gcc_except_table", ".gcc_except_table")
+      .StartsWith(".data.rel.ro", ".data.rel.ro")
+      .StartsWith(".data.rel.local", ".data.rel.local")
+      .StartsWith(".data", ".data")
+      .StartsWith(".tdata", ".tdata")
+      .StartsWith(".tbss", ".tbss")
+      .Default(da->customSectionName());
 }
 
 /// \brief Gets the segment for a output section
@@ -519,12 +524,11 @@ ErrorOr<const lld::AtomLayout &> Default
     // -noinhibit-exec.
     if (definedAtom->contentType() == DefinedAtom::typeUnknown)
       return make_error_code(llvm::errc::invalid_argument);
-    StringRef sectionName = definedAtom->customSectionName();
     const DefinedAtom::ContentPermissions permissions =
         definedAtom->permissions();
     const DefinedAtom::ContentType contentType = definedAtom->contentType();
 
-    sectionName = getSectionName(sectionName, contentType, permissions);
+    StringRef sectionName = getSectionName(definedAtom);
     AtomSection<ELFT> *section =
         getSection(sectionName, contentType, permissions);
     // Add runtime relocations to the .rela section.

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonTargetHandler.h Mon Sep 16 21:56:22 2013
@@ -103,13 +103,15 @@ public:
   }
 
   /// \brief This maps the input sections to the output section names
-  virtual StringRef getSectionName(StringRef name, const int32_t contentType,
-                                   const int32_t contentPermissions) {
-    if ((contentType == DefinedAtom::typeDataFast) ||
-       (contentType == DefinedAtom::typeZeroFillFast))
+  virtual StringRef getSectionName(const DefinedAtom *da) const {
+    switch (da->contentType()) {
+    case DefinedAtom::typeDataFast:
+    case DefinedAtom::typeZeroFillFast:
       return ".sdata";
-    return DefaultLayout<HexagonELFType>::getSectionName(name, contentType,
-                                                         contentPermissions);
+    default:
+      break;
+    }
+    return DefaultLayout<HexagonELFType>::getSectionName(da);
   }
 
   /// \brief Gets or creates a section.

Added: lld/trunk/test/elf/X86_64/sectionchoice.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/sectionchoice.test?rev=190840&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/sectionchoice.test (added)
+++ lld/trunk/test/elf/X86_64/sectionchoice.test Mon Sep 16 21:56:22 2013
@@ -0,0 +1,7 @@
+# This tests that we are able to properly set the sectionChoice for DefinedAtoms
+RUN: lld -flavor gnu -target x86_64-linux %p/Inputs/zerosizedsection.o  \
+RUN: --noinhibit-exec -o %t -emit-yaml
+RUN: FileCheck %s < %t
+
+CHECK-NOT: section-choice: sectionCustomRequired
+

Modified: lld/trunk/test/elf/mergeconstants.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/mergeconstants.test?rev=190840&r1=190839&r2=190840&view=diff
==============================================================================
--- lld/trunk/test/elf/mergeconstants.test (original)
+++ lld/trunk/test/elf/mergeconstants.test Mon Sep 16 21:56:22 2013
@@ -12,8 +12,6 @@ mergeAtoms:    scope:           global
 mergeAtoms:    type:            data
 mergeAtoms:    content:         [ 00, 00, 00, 00, 00, 00, 00, 00 ]
 mergeAtoms:    alignment:       2^3
-mergeAtoms:    section-choice:  custom-required
-mergeAtoms:    section-name:    .data
 mergeAtoms:    references:      
 mergeAtoms:      - kind:            R_X86_64_64
 mergeAtoms:        offset:          3





More information about the llvm-commits mailing list