summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-08-12 03:31:09 +0000
committerRui Ueyama <ruiu@google.com>2016-08-12 03:31:09 +0000
commit0c70d3ccb7ad72a25ac64708efefa4f14f1246cc (patch)
tree97d9774b8b380ad15825c1bc0e818f96127ac3dc
parentea0237205990c6652929331cf07702add46f377d (diff)
downloadbcm5719-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.cpp27
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;
OpenPOWER on IntegriCloud