diff options
author | Rui Ueyama <ruiu@google.com> | 2016-08-12 03:31:09 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2016-08-12 03:31:09 +0000 |
commit | 0c70d3ccb7ad72a25ac64708efefa4f14f1246cc (patch) | |
tree | 97d9774b8b380ad15825c1bc0e818f96127ac3dc | |
parent | ea0237205990c6652929331cf07702add46f377d (diff) | |
download | bcm5719-llvm-0c70d3ccb7ad72a25ac64708efefa4f14f1246cc.tar.gz bcm5719-llvm-0c70d3ccb7ad72a25ac64708efefa4f14f1246cc.zip |
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.
llvm-svn: 278464
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index d7e460fa156..a29776badf3 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -50,10 +50,8 @@ static void addRegular(SymbolAssignment *Cmd) { 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>::createInputSectionList(OutputSectionCommand &Cmd) { 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(OutputSectionFactory<ELFT> &Factory) { 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(OutputSectionBase<ELFT> *Sec) { 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; |