Index: lld/ELF/LinkerScript.cpp =================================================================== --- lld/ELF/LinkerScript.cpp +++ lld/ELF/LinkerScript.cpp @@ -948,7 +948,7 @@ // 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); Index: lld/ELF/OutputSections.h =================================================================== --- lld/ELF/OutputSections.h +++ lld/ELF/OutputSections.h @@ -118,7 +118,8 @@ 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 Index: lld/ELF/OutputSections.cpp =================================================================== --- lld/ELF/OutputSections.cpp +++ lld/ELF/OutputSections.cpp @@ -357,8 +357,7 @@ } 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,11 +465,33 @@ return v; } -std::vector getInputSections(OutputSection *os) { - std::vector ret; +namespace { +void forEachInputSectionDescription( + const OutputSection *os, function_ref f) { for (BaseCommand *base : os->sectionCommands) if (auto *isd = dyn_cast(base)) - ret.insert(ret.end(), isd->sections.begin(), isd->sections.end()); + if (!f(isd)) + break; +} +} // namespace + +InputSection *getFirstInputSection(const OutputSection *os) { + InputSection *ret = nullptr; + forEachInputSectionDescription(os, [&](InputSectionDescription *isd) { + if (isd->sections.empty()) + return true; + ret = isd->sections[0]; + return false; + }); + return ret; +} + +std::vector getInputSections(const OutputSection *os) { + std::vector ret; + forEachInputSectionDescription(os, [&](InputSectionDescription *isd) { + ret.insert(ret.end(), isd->sections.begin(), isd->sections.end()); + return true; + }); return ret; }