[lld] r278464 - Simplify LinkerScript<ELFT>::createSections.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 11 20:31:09 PDT 2016


Author: ruiu
Date: Thu Aug 11 22:31:09 2016
New Revision: 278464

URL: http://llvm.org/viewvc/llvm-project?rev=278464&view=rev
Log:
Simplify LinkerScript<ELFT>::createSections.

Previously, we were setting LayoutInputSection's OutputSection member
in createSections. Because when we create LayoutInputSectinos, we
don't know the output section for them, so we backfilled the member
in the function. This patch moves the code to backfill it to assignOffsets.

Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=278464&r1=278463&r2=278464&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Thu Aug 11 22:31:09 2016
@@ -50,10 +50,8 @@ static void addRegular(SymbolAssignment
   Cmd->Sym = Sym->body();
 }
 
-template <class ELFT>
-static void addSynthetic(SymbolAssignment *Cmd,
-                         OutputSectionBase<ELFT> *Section) {
-  Symbol *Sym = Symtab<ELFT>::X->addSynthetic(Cmd->Name, Section, 0);
+template <class ELFT> static void addSynthetic(SymbolAssignment *Cmd) {
+  Symbol *Sym = Symtab<ELFT>::X->addSynthetic(Cmd->Name, nullptr, 0);
   Sym->Visibility = Cmd->Hidden ? STV_HIDDEN : STV_DEFAULT;
   Cmd->Sym = Sym->body();
 }
@@ -224,6 +222,8 @@ LinkerScript<ELFT>::createInputSectionLi
 
   for (const std::unique_ptr<BaseCommand> &Base : Cmd.Commands) {
     if (auto *Cmd = dyn_cast<SymbolAssignment>(Base.get())) {
+      if (shouldDefine<ELFT>(Cmd))
+        addSynthetic<ELFT>(Cmd);
       Ret.push_back(new (LAlloc.Allocate()) LayoutInputSection<ELFT>(Cmd));
       continue;
     }
@@ -258,16 +258,8 @@ void LinkerScript<ELFT>::createSections(
       std::tie(OutSec, IsNew) = Factory.create(Head, Cmd->Name);
       if (IsNew)
         OutputSections->push_back(OutSec);
-
-      for (InputSectionBase<ELFT> *Sec : V) {
-        if (auto *L = dyn_cast<LayoutInputSection<ELFT>>(Sec)) {
-          if (shouldDefine<ELFT>(L->Cmd))
-            addSynthetic<ELFT>(L->Cmd, OutSec);
-          else if (L->Cmd->Name != ".")
-            continue;
-        }
+      for (InputSectionBase<ELFT> *Sec : V)
         OutSec->addSection(Sec);
-      }
     } else if (auto *Cmd2 = dyn_cast<SymbolAssignment>(Base1.get())) {
       if (shouldDefine<ELFT>(Cmd2))
         addRegular<ELFT>(Cmd2);
@@ -335,10 +327,13 @@ template <class ELFT> void assignOffsets
   for (InputSection<ELFT> *I : OutSec->Sections) {
     if (auto *L = dyn_cast<LayoutInputSection<ELFT>>(I)) {
       uintX_t Value = L->Cmd->Expression(Sec->getVA() + Off) - Sec->getVA();
-      if (L->Cmd->Name == ".")
+      if (L->Cmd->Name == ".") {
         Off = Value;
-      else
-        cast<DefinedSynthetic<ELFT>>(L->Cmd->Sym)->Value = Value;
+      } else {
+        auto *Sym = cast<DefinedSynthetic<ELFT>>(L->Cmd->Sym);
+        Sym->Section = OutSec;
+        Sym->Value = Value;
+      }
     } else {
       Off = alignTo(Off, I->Alignment);
       I->OutSecOff = Off;




More information about the llvm-commits mailing list