diff options
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 6cfbc5d4585..85c170b142f 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -443,29 +443,32 @@ void LinkerScript::fabricateDefaultCommands() { make<SymbolAssignment>(".", Expr, "")); } +static OutputSection *findByName(ArrayRef<BaseCommand *> Vec, + StringRef Name) { + for (BaseCommand *Base : Vec) + if (auto *Sec = dyn_cast<OutputSection>(Base)) + if (Sec->Name == Name) + return Sec; + return nullptr; +} + // Add sections that didn't match any sections command. void LinkerScript::addOrphanSections(OutputSectionFactory &Factory) { - unsigned NumCommands = Opt.Commands.size(); + unsigned End = Opt.Commands.size(); + for (InputSectionBase *S : InputSections) { if (!S->Live || S->Parent) continue; + StringRef Name = getOutputSectionName(S->Name); - auto End = Opt.Commands.begin() + NumCommands; - auto I = std::find_if(Opt.Commands.begin(), End, [&](BaseCommand *Base) { - if (auto *Sec = dyn_cast<OutputSection>(Base)) - return Sec->Name == Name; - return false; - }); log(toString(S) + " is being placed in '" + Name + "'"); - if (I == End) { + + if (OutputSection *Sec = findByName( + makeArrayRef(Opt.Commands).slice(0, End), Name)) { + Factory.addInputSec(S, Name, Sec); + } else { Factory.addInputSec(S, Name, nullptr); assert(S->getOutputSection()->SectionIndex == INT_MAX); - } else { - OutputSection *Sec = cast<OutputSection>(*I); - Factory.addInputSec(S, Name, Sec); - unsigned Index = std::distance(Opt.Commands.begin(), I); - assert(Sec->SectionIndex == INT_MAX || Sec->SectionIndex == Index); - Sec->SectionIndex = Index; } } } |