[lld] r235392 - [ELF] Narrow down the type of OutputSection::_sections container

Simon Atanasyan simon at atanasyan.com
Tue Apr 21 10:02:43 PDT 2015


Author: atanasyan
Date: Tue Apr 21 12:02:42 2015
New Revision: 235392

URL: http://llvm.org/viewvc/llvm-project?rev=235392&view=rev
Log:
[ELF] Narrow down the type of OutputSection::_sections container

The `OutputSection::appendSection()` method always gets a pointer
to the `Section` class descendants. So it is not necessary to keep them
in the vector of `Chunk` pointers.

No functional changes.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/SectionChunks.cpp
    lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
    lld/trunk/lib/ReaderWriter/ELF/TargetLayout.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.cpp?rev=235392&r1=235391&r2=235392&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.cpp Tue Apr 21 12:02:42 2015
@@ -277,21 +277,20 @@ void AtomSection<ELFT>::write(ELFWriter
     llvm::report_fatal_error("relocating output");
 }
 
-template <class ELFT> void OutputSection<ELFT>::appendSection(Chunk<ELFT> *c) {
-  if (c->alignment() > _alignment)
-    _alignment = c->alignment();
-  if (const auto section = dyn_cast<Section<ELFT>>(c)) {
-    assert(!_link && "Section already has a link!");
-    _link = section->getLink();
-    _shInfo = section->getInfo();
-    _entSize = section->getEntSize();
-    _type = section->getType();
-    if (_flags < section->getFlags())
-      _flags = section->getFlags();
-    section->setOutputSection(this, (_sections.size() == 0));
-  }
-  _kind = c->kind();
-  _sections.push_back(c);
+template <class ELFT>
+void OutputSection<ELFT>::appendSection(Section<ELFT> *section) {
+  if (section->alignment() > _alignment)
+    _alignment = section->alignment();
+  assert(!_link && "Section already has a link!");
+  _link = section->getLink();
+  _shInfo = section->getInfo();
+  _entSize = section->getEntSize();
+  _type = section->getType();
+  if (_flags < section->getFlags())
+    _flags = section->getFlags();
+  section->setOutputSection(this, (_sections.size() == 0));
+  _kind = section->kind();
+  _sections.push_back(section);
 }
 
 template <class ELFT>

Modified: lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h?rev=235392&r1=235391&r2=235392&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/SectionChunks.h Tue Apr 21 12:02:42 2015
@@ -205,13 +205,13 @@ protected:
 template <class ELFT> class OutputSection {
 public:
   // Iterators
-  typedef typename std::vector<Chunk<ELFT> *>::iterator ChunkIter;
+  typedef typename std::vector<Section<ELFT> *>::iterator SectionIter;
 
   OutputSection(StringRef name) : _name(name) {}
 
   // Appends a section into the list of sections that are part of this Output
   // Section
-  void appendSection(Chunk<ELFT> *c);
+  void appendSection(Section<ELFT> *c);
 
   // Set the OutputSection is associated with a segment
   void setHasSegment() { _hasSegment = true; }
@@ -244,7 +244,7 @@ public:
   void setInfo(uint64_t info) { _shInfo = info; }
   void setFlag(uint64_t flags) { _flags = flags; }
   void setType(int64_t type) { _type = type; }
-  range<ChunkIter> sections() { return _sections; }
+  range<SectionIter> sections() { return _sections; }
 
   // The below functions returns the properties of the OutputSection.
   bool hasSegment() const { return _hasSegment; }
@@ -278,7 +278,7 @@ private:
   int64_t _kind = 0;
   int64_t _type = 0;
   bool _isLoadableSection = false;
-  std::vector<Chunk<ELFT> *> _sections;
+  std::vector<Section<ELFT> *> _sections;
 };
 
 /// \brief The class represents the ELF String Table

Modified: lld/trunk/lib/ReaderWriter/ELF/TargetLayout.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/TargetLayout.cpp?rev=235392&r1=235391&r2=235392&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/TargetLayout.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/TargetLayout.cpp Tue Apr 21 12:02:42 2015
@@ -323,7 +323,7 @@ template <class ELFT> void TargetLayout<
       _outputSections.push_back(outputSection);
       outputSectionInsert.first->second = outputSection;
     }
-    outputSection->appendSection(si);
+    outputSection->appendSection(section);
   }
 }
 
@@ -349,83 +349,80 @@ template <class ELFT> void TargetLayout<
     ++ordinal;
   }
   for (auto osi : _outputSections) {
-    for (auto ai : osi->sections()) {
-      if (auto section = dyn_cast<Section<ELFT>>(ai)) {
-        if (!hasOutputSegment(section))
-          continue;
-
-        osi->setLoadableSection(section->isLoadableSection());
-
-        // Get the segment type for the section
-        int64_t segmentType = getSegmentType(section);
-
-        osi->setHasSegment();
-        section->setSegmentType(segmentType);
-        StringRef segmentName = section->segmentKindToStr();
-
-        int64_t lookupSectionFlag = osi->flags();
-        if ((!(lookupSectionFlag & llvm::ELF::SHF_WRITE)) &&
-            (_ctx.mergeRODataToTextSegment()))
-          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 separate segment for sections that don't have
-        // the segment type to be PT_LOAD
-        if (segmentType != llvm::ELF::PT_LOAD) {
-          const AdditionalSegmentKey key(segmentType, lookupSectionFlag);
-          const std::pair<AdditionalSegmentKey, Segment<ELFT> *>
-              additionalSegment(key, nullptr);
-          std::pair<typename AdditionalSegmentMapT::iterator, bool>
-              additionalSegmentInsert(
-                  _additionalSegmentMap.insert(additionalSegment));
-          if (!additionalSegmentInsert.second) {
-            segment = additionalSegmentInsert.first->second;
-          } else {
-            segment =
-                new (_allocator) Segment<ELFT>(_ctx, segmentName, segmentType);
-            additionalSegmentInsert.first->second = segment;
-            _segments.push_back(segment);
-          }
-          segment->append(section);
-        }
-        if (segmentType == llvm::ELF::PT_NULL)
-          continue;
-
-        // If the output magic is set to OutputMagic::NMAGIC or
-        // OutputMagic::OMAGIC, Place the data alongside text in one single
-        // segment
-        if (outputMagic == ELFLinkingContext::OutputMagic::NMAGIC ||
-            outputMagic == ELFLinkingContext::OutputMagic::OMAGIC)
-          lookupSectionFlag = llvm::ELF::SHF_EXECINSTR | llvm::ELF::SHF_ALLOC |
-                              llvm::ELF::SHF_WRITE;
-
-        // Use the flags of the merged Section for the segment
-        const SegmentKey key("PT_LOAD", lookupSectionFlag);
-        const std::pair<SegmentKey, Segment<ELFT> *> currentSegment(key,
-                                                                    nullptr);
-        std::pair<typename SegmentMapT::iterator, bool> segmentInsert(
-            _segmentMap.insert(currentSegment));
-        if (!segmentInsert.second) {
-          segment = segmentInsert.first->second;
+    for (auto section : osi->sections()) {
+      if (!hasOutputSegment(section))
+        continue;
+
+      osi->setLoadableSection(section->isLoadableSection());
+
+      // Get the segment type for the section
+      int64_t segmentType = getSegmentType(section);
+
+      osi->setHasSegment();
+      section->setSegmentType(segmentType);
+      StringRef segmentName = section->segmentKindToStr();
+
+      int64_t lookupSectionFlag = osi->flags();
+      if ((!(lookupSectionFlag & llvm::ELF::SHF_WRITE)) &&
+          (_ctx.mergeRODataToTextSegment()))
+        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 separate segment for sections that don't have
+      // the segment type to be PT_LOAD
+      if (segmentType != llvm::ELF::PT_LOAD) {
+        const AdditionalSegmentKey key(segmentType, lookupSectionFlag);
+        const std::pair<AdditionalSegmentKey, Segment<ELFT> *>
+            additionalSegment(key, nullptr);
+        std::pair<typename AdditionalSegmentMapT::iterator, bool>
+            additionalSegmentInsert(
+                _additionalSegmentMap.insert(additionalSegment));
+        if (!additionalSegmentInsert.second) {
+          segment = additionalSegmentInsert.first->second;
         } else {
-          segment = new (_allocator)
-              Segment<ELFT>(_ctx, "PT_LOAD", llvm::ELF::PT_LOAD);
-          segmentInsert.first->second = segment;
+          segment =
+              new (_allocator) Segment<ELFT>(_ctx, segmentName, segmentType);
+          additionalSegmentInsert.first->second = segment;
           _segments.push_back(segment);
         }
-        // Insert chunks with linker script expressions that occur at this
-        // point, just before appending a new input section
-        addExtraChunksToSegment(segment, section->archivePath(),
-                                section->memberPath(),
-                                section->inputSectionName());
         segment->append(section);
       }
+      if (segmentType == llvm::ELF::PT_NULL)
+        continue;
+
+      // If the output magic is set to OutputMagic::NMAGIC or
+      // OutputMagic::OMAGIC, Place the data alongside text in one single
+      // segment
+      if (outputMagic == ELFLinkingContext::OutputMagic::NMAGIC ||
+          outputMagic == ELFLinkingContext::OutputMagic::OMAGIC)
+        lookupSectionFlag = llvm::ELF::SHF_EXECINSTR | llvm::ELF::SHF_ALLOC |
+                            llvm::ELF::SHF_WRITE;
+
+      // Use the flags of the merged Section for the segment
+      const SegmentKey key("PT_LOAD", lookupSectionFlag);
+      const std::pair<SegmentKey, Segment<ELFT> *> currentSegment(key, nullptr);
+      std::pair<typename SegmentMapT::iterator, bool> segmentInsert(
+          _segmentMap.insert(currentSegment));
+      if (!segmentInsert.second) {
+        segment = segmentInsert.first->second;
+      } else {
+        segment =
+            new (_allocator) Segment<ELFT>(_ctx, "PT_LOAD", llvm::ELF::PT_LOAD);
+        segmentInsert.first->second = segment;
+        _segments.push_back(segment);
+      }
+      // Insert chunks with linker script expressions that occur at this
+      // point, just before appending a new input section
+      addExtraChunksToSegment(segment, section->archivePath(),
+                              section->memberPath(),
+                              section->inputSectionName());
+      segment->append(section);
     }
   }
   if (_ctx.isDynamic() && !_ctx.isDynamicLibrary()) {





More information about the llvm-commits mailing list