From 4e8116f4692e9b5787ba91c6b557b113aae7e244 Mon Sep 17 00:00:00 2001 From: Andrew Ng Date: Thu, 16 Jan 2020 13:23:08 +0000 Subject: [PATCH] [ELF] Refactor uses of getInputSections to improve efficiency NFC Add new method getFirstInputSection and use instead of getInputSections where appropriate to avoid creation of an unneeded vector of input sections. Differential Revision: https://reviews.llvm.org/D73047 --- lld/ELF/LinkerScript.cpp | 2 +- lld/ELF/OutputSections.cpp | 13 ++++++++++--- lld/ELF/OutputSections.h | 3 ++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index aaa7744a7809..db9794319d5d 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 6142cb0783ce..e5360c1ce23a 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 a24294eedf35..d5686f11ec8e 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -118,7 +118,8 @@ private: 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