[lld] r316251 - Don't call buildSectionOrder multiple times.
Rafael Espindola via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 20 17:05:01 PDT 2017
Author: rafael
Date: Fri Oct 20 17:05:01 2017
New Revision: 316251
URL: http://llvm.org/viewvc/llvm-project?rev=316251&view=rev
Log:
Don't call buildSectionOrder multiple times.
This takes linking the linux kernel from 1.52s to 0.58s.
Modified:
lld/trunk/ELF/InputSection.cpp
lld/trunk/ELF/LinkerScript.cpp
lld/trunk/ELF/LinkerScript.h
Modified: lld/trunk/ELF/InputSection.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=316251&r1=316250&r2=316251&view=diff
==============================================================================
--- lld/trunk/ELF/InputSection.cpp (original)
+++ lld/trunk/ELF/InputSection.cpp Fri Oct 20 17:05:01 2017
@@ -46,6 +46,10 @@ std::string lld::toString(const InputSec
}
DenseMap<SectionBase *, int> elf::buildSectionOrder() {
+ DenseMap<SectionBase *, int> SectionOrder;
+ if (Config->SymbolOrderingFile.empty())
+ return SectionOrder;
+
// Build a map from symbols to their priorities. Symbols that didn't
// appear in the symbol ordering file have the lowest priority 0.
// All explicitly mentioned symbols have negative (higher) priorities.
@@ -55,7 +59,6 @@ DenseMap<SectionBase *, int> elf::buildS
SymbolOrder.insert({S, Priority++});
// Build a map from sections to their priorities.
- DenseMap<SectionBase *, int> SectionOrder;
for (InputFile *File : ObjectFiles) {
for (SymbolBody *Body : File->getSymbols()) {
auto *D = dyn_cast<DefinedRegular>(Body);
Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=316251&r1=316250&r2=316251&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Oct 20 17:05:01 2017
@@ -274,9 +274,9 @@ static void sortInputSections(
// Compute and remember which sections the InputSectionDescription matches.
std::vector<InputSection *>
-LinkerScript::computeInputSections(const InputSectionDescription *Cmd) {
+LinkerScript::computeInputSections(const InputSectionDescription *Cmd,
+ const DenseMap<SectionBase *, int> &Order) {
std::vector<InputSection *> Ret;
- DenseMap<SectionBase *, int> Order = buildSectionOrder();
// Collects all sections that satisfy constraints of Cmd.
for (const SectionPattern &Pat : Cmd->SectionPatterns) {
@@ -326,13 +326,13 @@ void LinkerScript::discard(ArrayRef<Inpu
}
}
-std::vector<InputSection *>
-LinkerScript::createInputSectionList(OutputSection &OutCmd) {
+std::vector<InputSection *> LinkerScript::createInputSectionList(
+ OutputSection &OutCmd, const DenseMap<SectionBase *, int> &Order) {
std::vector<InputSection *> Ret;
for (BaseCommand *Base : OutCmd.SectionCommands) {
if (auto *Cmd = dyn_cast<InputSectionDescription>(Base)) {
- Cmd->Sections = computeInputSections(Cmd);
+ Cmd->Sections = computeInputSections(Cmd, Order);
Ret.insert(Ret.end(), Cmd->Sections.begin(), Cmd->Sections.end());
}
}
@@ -359,6 +359,7 @@ void LinkerScript::processSectionCommand
Ctx = make_unique<AddressState>();
Ctx->OutSec = Aether;
+ DenseMap<SectionBase *, int> Order = buildSectionOrder();
// Add input sections to output sections.
for (size_t I = 0; I < SectionCommands.size(); ++I) {
// Handle symbol assignments outside of any output section.
@@ -368,7 +369,7 @@ void LinkerScript::processSectionCommand
}
if (auto *Sec = dyn_cast<OutputSection>(SectionCommands[I])) {
- std::vector<InputSection *> V = createInputSectionList(*Sec);
+ std::vector<InputSection *> V = createInputSectionList(*Sec, Order);
// The output section name `/DISCARD/' is special.
// Any input section assigned to it is discarded.
Modified: lld/trunk/ELF/LinkerScript.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.h?rev=316251&r1=316250&r2=316251&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.h (original)
+++ lld/trunk/ELF/LinkerScript.h Fri Oct 20 17:05:01 2017
@@ -205,9 +205,12 @@ class LinkerScript final {
void setDot(Expr E, const Twine &Loc, bool InSec);
std::vector<InputSection *>
- computeInputSections(const InputSectionDescription *);
+ computeInputSections(const InputSectionDescription *,
+ const llvm::DenseMap<SectionBase *, int> &Order);
- std::vector<InputSection *> createInputSectionList(OutputSection &Cmd);
+ std::vector<InputSection *>
+ createInputSectionList(OutputSection &Cmd,
+ const llvm::DenseMap<SectionBase *, int> &Order);
std::vector<size_t> getPhdrIndices(OutputSection *Sec);
More information about the llvm-commits
mailing list