Skip to content

Commit

Permalink
[ELF] - Change the way of sorting local symbols.
Browse files Browse the repository at this point in the history
rLLD329787 added the stable sorting to SymbolTableBaseSection::postThunkContents.

I profiled the Mozilla (response-O0.txt) from lld-speed-test package and found
std::stable_sort is showing up in profile results and consuming the 3.1% of the total
CPU time in the RelWithDebug build. Total time of postThunkContents is 3.54%, 238ms.

This change reduces postTimeContents time to 50ms, making it to take 0.73% of Total CPU time.

So, instead of sorting the local part I suggest to just rebuild it.
That is what this patch does.

Differential revision: https://reviews.llvm.org/D45519

llvm-svn: 335583
  • Loading branch information
George Rimar committed Jun 26, 2018
1 parent 4860b98 commit 8f53b6d
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions lld/ELF/SyntheticSections.cpp
Expand Up @@ -1762,19 +1762,19 @@ void SymbolTableBaseSection::postThunkContents() {
size_t NumLocals = E - Symbols.begin();
getParent()->Info = NumLocals + 1;

// Assign the growing unique ID for each local symbol's file.
DenseMap<InputFile *, unsigned> FileIDs;
for (auto I = Symbols.begin(); I != E; ++I)
FileIDs.insert({I->Sym->File, FileIDs.size()});

// Sort the local symbols to group them by file. We do not need to care about
// the STT_FILE symbols, they are already naturally placed first in each group.
// That happens because STT_FILE is always the first symbol in the object and
// hence precede all other local symbols we add for a file.
std::stable_sort(Symbols.begin(), E,
[&](const SymbolTableEntry &L, const SymbolTableEntry &R) {
return FileIDs[L.Sym->File] < FileIDs[R.Sym->File];
});
// We want to group the local symbols by file. For that we rebuild the local
// part of the symbols vector. We do not need to care about the STT_FILE
// symbols, they are already naturally placed first in each group. That
// happens because STT_FILE is always the first symbol in the object and hence
// precede all other local symbols we add for a file.
MapVector<InputFile *, std::vector<SymbolTableEntry>> Arr;
for (const SymbolTableEntry &S : llvm::make_range(Symbols.begin(), E))
Arr[S.Sym->File].push_back(S);

auto I = Symbols.begin();
for (std::pair<InputFile *, std::vector<SymbolTableEntry>> &P : Arr)
for (SymbolTableEntry &Entry : P.second)
*I++ = Entry;
}

void SymbolTableBaseSection::addSymbol(Symbol *B) {
Expand Down

0 comments on commit 8f53b6d

Please sign in to comment.