[lld] r320478 - [ELF] Refactor to remove loop copying all Sections in OS->finalize() [NFC]

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 12 05:38:51 PST 2017


Author: psmith
Date: Tue Dec 12 05:38:51 2017
New Revision: 320478

URL: http://llvm.org/viewvc/llvm-project?rev=320478&view=rev
Log:
[ELF] Refactor to remove loop copying all Sections in OS->finalize() [NFC]

Moving the SHF_LINK_ORDER processing out of OutputSection::finalize()
means that we no longer need to copy all InputSections as we now only need
the first one.

Differential Revision: https://reviews.llvm.org/D40966

Modified:
    lld/trunk/ELF/OutputSections.cpp

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=320478&r1=320477&r2=320478&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Tue Dec 12 05:38:51 2017
@@ -275,8 +275,8 @@ template <class ELFT> void OutputSection
 
 template <class ELFT>
 static void finalizeShtGroup(OutputSection *OS,
-                             ArrayRef<InputSection *> Sections) {
-  assert(Config->Relocatable && Sections.size() == 1);
+                             InputSection *Section) {
+  assert(Config->Relocatable);
 
   // sh_link field for SHT_GROUP sections should contain the section index of
   // the symbol table.
@@ -284,17 +284,19 @@ static void finalizeShtGroup(OutputSecti
 
   // sh_info then contain index of an entry in symbol table section which
   // provides signature of the section group.
-  ObjFile<ELFT> *Obj = Sections[0]->getFile<ELFT>();
+  ObjFile<ELFT> *Obj = Section->getFile<ELFT>();
   ArrayRef<Symbol *> Symbols = Obj->getSymbols();
-  OS->Info = InX::SymTab->getSymbolIndex(Symbols[Sections[0]->Info]);
+  OS->Info = InX::SymTab->getSymbolIndex(Symbols[Section->Info]);
 }
 
 template <class ELFT> void OutputSection::finalize() {
-  std::vector<InputSection *> Sections;
+  InputSection *First = nullptr;
   for (BaseCommand *Base : SectionCommands) {
     if (auto *ISD = dyn_cast<InputSectionDescription>(Base)) {
-      for (InputSection *&IS : ISD->Sections)
-        Sections.push_back(IS);
+      if (ISD->Sections.empty())
+        continue;
+      if (First == nullptr)
+        First = ISD->Sections.front();
     }
     if (isa<ByteCommand>(Base) && Type == SHT_NOBITS)
       Type = SHT_PROGBITS;
@@ -305,19 +307,18 @@ template <class ELFT> void OutputSection
     // SHF_LINK_ORDER flag. The dependency is indicated by the sh_link field. We
     // need to translate the InputSection sh_link to the OutputSection sh_link,
     // all InputSections in the OutputSection have the same dependency.
-    if (auto *D = Sections.front()->getLinkOrderDep())
+    if (auto *D = First->getLinkOrderDep())
       Link = D->getParent()->SectionIndex;
   }
 
   if (Type == SHT_GROUP) {
-    finalizeShtGroup<ELFT>(this, Sections);
+    finalizeShtGroup<ELFT>(this, First);
     return;
   }
 
   if (!Config->CopyRelocs || (Type != SHT_RELA && Type != SHT_REL))
     return;
 
-  InputSection *First = Sections[0];
   if (isa<SyntheticSection>(First))
     return;
 




More information about the llvm-commits mailing list