Split LinkerScript<ELFT>::createSections.

Also avoid to use a lambda that is called only once.

llvm-svn: 278445
This commit is contained in:
Rui Ueyama 2016-08-12 00:27:23 +00:00
parent 100cd2bbbc
commit 48c3f1cebc
2 changed files with 36 additions and 25 deletions

View File

@ -268,43 +268,52 @@ getComparator(SortKind K) {
return compareAlignment<ELFT>;
}
template <class ELFT>
void LinkerScript<ELFT>::discard(OutputSectionCommand &Cmd) {
for (const std::unique_ptr<BaseCommand> &Base : Cmd.Commands) {
if (auto *Cmd = dyn_cast<InputSectionDescription>(Base.get())) {
for (InputSectionBase<ELFT> *S : getInputSections(Cmd)) {
S->Live = false;
reportDiscarded(S);
}
}
}
}
template <class ELFT>
void LinkerScript<ELFT>::createSections(
OutputSectionFactory<ELFT> &Factory) {
OutputSectionBuilder<ELFT> Builder(Factory, OutputSections);
auto Add = [&](StringRef OutputName, const InputSectionDescription *Cmd) {
std::vector<InputSectionBase<ELFT> *> Sections = getInputSections(Cmd);
if (OutputName == "/DISCARD/") {
for (InputSectionBase<ELFT> *S : Sections) {
S->Live = false;
reportDiscarded(S);
}
return;
}
if (Cmd->SortInner)
std::stable_sort(Sections.begin(), Sections.end(),
getComparator<ELFT>(Cmd->SortInner));
if (Cmd->SortOuter)
std::stable_sort(Sections.begin(), Sections.end(),
getComparator<ELFT>(Cmd->SortOuter));
for (InputSectionBase<ELFT> *S : Sections)
Builder.addSection(OutputName, S);
};
for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands)
for (const std::unique_ptr<BaseCommand> &Base1 : Opt.Commands) {
if (auto *Cmd = dyn_cast<OutputSectionCommand>(Base1.get())) {
for (const std::unique_ptr<BaseCommand> &Base2 : Cmd->Commands)
if (auto *Assignment = dyn_cast<SymbolAssignment>(Base2.get()))
Builder.addSymbol(Assignment);
else
Add(Cmd->Name, cast<InputSectionDescription>(Base2.get()));
if (Cmd->Name == "/DISCARD/") {
discard(*Cmd);
continue;
}
for (const std::unique_ptr<BaseCommand> &Base2 : Cmd->Commands) {
if (auto *Cmd2 = dyn_cast<SymbolAssignment>(Base2.get())) {
Builder.addSymbol(Cmd2);
continue;
}
auto *Cmd2 = cast<InputSectionDescription>(Base2.get());
std::vector<InputSectionBase<ELFT> *> Sections = getInputSections(Cmd2);
if (Cmd2->SortInner)
std::stable_sort(Sections.begin(), Sections.end(),
getComparator<ELFT>(Cmd2->SortInner));
if (Cmd2->SortOuter)
std::stable_sort(Sections.begin(), Sections.end(),
getComparator<ELFT>(Cmd2->SortOuter));
for (InputSectionBase<ELFT> *S : Sections)
Builder.addSection(Cmd->Name, S);
}
Builder.flushSection();
} else if (auto *Cmd2 = dyn_cast<SymbolAssignment>(Base1.get())) {
if (shouldDefine<ELFT>(Cmd2))
addRegular<ELFT>(Cmd2);
}
}
// Add all other input sections, which are not listed in script.
for (const std::unique_ptr<ObjectFile<ELFT>> &F :

View File

@ -156,6 +156,8 @@ private:
std::vector<InputSectionBase<ELFT> *>
getInputSections(const InputSectionDescription *);
void discard(OutputSectionCommand &Cmd);
// "ScriptConfig" is a bit too long, so define a short name for it.
ScriptConfiguration &Opt = *ScriptConfig;