[lld] r315124 - Split addSection into two small functions. NFCI.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 6 16:06:41 PDT 2017


Author: ruiu
Date: Fri Oct  6 16:06:40 2017
New Revision: 315124

URL: http://llvm.org/viewvc/llvm-project?rev=315124&view=rev
Log:
Split addSection into two small functions. NFCI.

addSection function was hard to read because it behaves differently
depending on its arguments but what exactly it does is not clear.
Now it should be better. Still, it is not clear (not what but) why
it does what it does, but I'll take a look at it later.

Modified:
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/ELF/OutputSections.cpp
    lld/trunk/ELF/OutputSections.h
    lld/trunk/ELF/Writer.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=315124&r1=315123&r2=315124&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Oct  6 16:06:40 2017
@@ -458,7 +458,7 @@ void LinkerScript::addOrphanSections(Out
     });
     log(toString(S) + " is being placed in '" + Name + "'");
     if (I == End) {
-      Factory.addInputSec(S, Name);
+      Factory.addInputSec(S, Name, nullptr);
       assert(S->getOutputSection()->SectionIndex == INT_MAX);
     } else {
       OutputSection *Sec = cast<OutputSection>(*I);

Modified: lld/trunk/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=315124&r1=315123&r2=315124&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.cpp (original)
+++ lld/trunk/ELF/OutputSections.cpp Fri Oct  6 16:06:40 2017
@@ -200,14 +200,25 @@ void elf::reportDiscarded(InputSectionBa
           IS->File->getName() + "'");
 }
 
-static OutputSection *addSection(InputSectionBase *IS, StringRef OutsecName,
-                                 OutputSection *Sec) {
-  if (Sec && Sec->Live) {
+static OutputSection *createSection(InputSectionBase *IS, StringRef OutsecName) {
+  OutputSection *Sec = Script->createOutputSection(OutsecName, "<internal>");
+  Sec->Type = IS->Type;
+  Sec->Flags = IS->Flags;
+  Sec->addSection(cast<InputSection>(IS));
+
+  Script->Opt.Commands.push_back(Sec);
+
+  return Sec;
+}
+
+static void addSection(OutputSection *Sec, InputSectionBase *IS, StringRef OutsecName) {
+  if (Sec->Live) {
     if (getIncompatibleFlags(Sec->Flags) != getIncompatibleFlags(IS->Flags))
       error("incompatible section flags for " + Sec->Name + "\n>>> " +
             toString(IS) + ": 0x" + utohexstr(IS->Flags) +
             "\n>>> output section " + Sec->Name + ": 0x" +
             utohexstr(Sec->Flags));
+
     if (Sec->Type != IS->Type) {
       if (canMergeToProgbits(Sec->Type) && canMergeToProgbits(IS->Type))
         Sec->Type = SHT_PROGBITS;
@@ -218,18 +229,12 @@ static OutputSection *addSection(InputSe
               "\n>>> output section " + Sec->Name + ": " +
               getELFSectionTypeName(Config->EMachine, Sec->Type));
     }
-    Sec->Flags |= IS->Flags;
   } else {
-    if (!Sec) {
-      Sec = Script->createOutputSection(OutsecName, "<internal>");
-      Script->Opt.Commands.push_back(Sec);
-    }
     Sec->Type = IS->Type;
-    Sec->Flags = IS->Flags;
   }
 
+  Sec->Flags |= IS->Flags;
   Sec->addSection(cast<InputSection>(IS));
-  return Sec;
 }
 
 void OutputSectionFactory::addInputSec(InputSectionBase *IS,
@@ -242,7 +247,7 @@ void OutputSectionFactory::addInputSec(I
 
   // If we have destination output section - use it directly.
   if (OS) {
-    addSection(IS, OutsecName, OS);
+    addSection(OS, IS, OutsecName);
     return;
   }
 
@@ -254,7 +259,7 @@ void OutputSectionFactory::addInputSec(I
   // as-is because adding/removing members or merging them with other groups
   // change their semantics.
   if (IS->Type == SHT_GROUP || (IS->Flags & SHF_GROUP)) {
-    addSection(IS, OutsecName, nullptr);
+    createSection(IS, OutsecName);
     return;
   }
 
@@ -268,13 +273,20 @@ void OutputSectionFactory::addInputSec(I
       (IS->Type == SHT_REL || IS->Type == SHT_RELA)) {
     auto *Sec = cast<InputSection>(IS);
     OutputSection *Out = Sec->getRelocatedSection()->getOutputSection();
-    Out->RelocationSection = addSection(IS, OutsecName, Out->RelocationSection);
+
+    if (Out->RelocationSection)
+      addSection(Out->RelocationSection, IS, OutsecName);
+    else
+      Out->RelocationSection = createSection(IS, OutsecName);
     return;
   }
 
   SectionKey Key = createKey(IS, OutsecName);
   OutputSection *&Sec = Map[Key];
-  Sec = addSection(IS, OutsecName, Sec);
+  if (Sec)
+    addSection(Sec, IS, OutsecName);
+  else
+    Sec = createSection(IS, OutsecName);
 }
 
 OutputSectionFactory::~OutputSectionFactory() {}

Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=315124&r1=315123&r2=315124&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Fri Oct  6 16:06:40 2017
@@ -165,7 +165,7 @@ public:
   ~OutputSectionFactory();
 
   void addInputSec(InputSectionBase *IS, StringRef OutsecName,
-                   OutputSection *OS = nullptr);
+                   OutputSection *OS);
 
 private:
   llvm::SmallDenseMap<SectionKey, OutputSection *> Map;

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=315124&r1=315123&r2=315124&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Fri Oct  6 16:06:40 2017
@@ -880,7 +880,7 @@ template <class ELFT> void Writer<ELFT>:
   Script->Opt.Commands.clear();
   for (InputSectionBase *IS : InputSections)
     if (IS)
-      Factory.addInputSec(IS, getOutputSectionName(IS->Name));
+      Factory.addInputSec(IS, getOutputSectionName(IS->Name), nullptr);
   Script->Opt.Commands.insert(Script->Opt.Commands.end(), Old.begin(),
                               Old.end());
 




More information about the llvm-commits mailing list