[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
This commit is contained in:
Andrew Ng 2020-01-16 13:23:08 +00:00
parent bc29069dc4
commit 4e8116f469
3 changed files with 13 additions and 5 deletions

View File

@ -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);

View File

@ -357,8 +357,7 @@ static void finalizeShtGroup(OutputSection *os,
}
void OutputSection::finalize() {
std::vector<InputSection *> 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<InputSection *> getInputSections(OutputSection *os) {
InputSection *getFirstInputSection(const OutputSection *os) {
for (BaseCommand *base : os->sectionCommands)
if (auto *isd = dyn_cast<InputSectionDescription>(base))
if (!isd->sections.empty())
return isd->sections[0];
return nullptr;
}
std::vector<InputSection *> getInputSections(const OutputSection *os) {
std::vector<InputSection *> ret;
for (BaseCommand *base : os->sectionCommands)
if (auto *isd = dyn_cast<InputSectionDescription>(base))

View File

@ -118,7 +118,8 @@ private:
int getPriority(StringRef s);
std::vector<InputSection *> getInputSections(OutputSection* os);
InputSection *getFirstInputSection(const OutputSection *os);
std::vector<InputSection *> 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