diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index aaa7744a7809ed..db9794319d5dd0 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -953,7 +953,7 @@ void LinkerScript::adjustSectionsBeforeSorting() { // We do not want to keep any special flags for output section // in case it is empty. - bool isEmpty = getInputSections(sec).empty(); + bool isEmpty = (getFirstInputSection(sec) == nullptr); if (isEmpty) sec->flags = flags & ((sec->nonAlloc ? 0 : (uint64_t)SHF_ALLOC) | SHF_WRITE | SHF_EXECINSTR); diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 6142cb0783ceb8..e5360c1ce23acd 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -357,8 +357,7 @@ static void finalizeShtGroup(OutputSection *os, } void OutputSection::finalize() { - std::vector v = getInputSections(this); - InputSection *first = v.empty() ? nullptr : v[0]; + InputSection *first = getFirstInputSection(this); if (flags & SHF_LINK_ORDER) { // We must preserve the link order dependency of sections with the @@ -466,7 +465,15 @@ int getPriority(StringRef s) { return v; } -std::vector getInputSections(OutputSection *os) { +InputSection *getFirstInputSection(const OutputSection *os) { + for (BaseCommand *base : os->sectionCommands) + if (auto *isd = dyn_cast(base)) + if (!isd->sections.empty()) + return isd->sections[0]; + return nullptr; +} + +std::vector getInputSections(const OutputSection *os) { std::vector ret; for (BaseCommand *base : os->sectionCommands) if (auto *isd = dyn_cast(base)) diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index a24294eedf351b..d5686f11ec8ec8 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -118,7 +118,8 @@ class OutputSection final : public BaseCommand, public SectionBase { int getPriority(StringRef s); -std::vector getInputSections(OutputSection* os); +InputSection *getFirstInputSection(const OutputSection *os); +std::vector getInputSections(const OutputSection *os); // All output sections that are handled by the linker specially are // globally accessible. Writer initializes them, so don't use them