Remove a fast lookup table from MergeInputSection.
We used to have a map from section piece offsets to section pieces as a cache for binary search. But I found that the map took quite a large amount of memory and didn't make linking faster. So, in this patch, I removed the map. This patch saves 566 MiB of RAM (2.019 GiB -> 1.453 GiB) when linking clang with debug info, and the link time is 4% faster in that test case. Thanks for Sean Silva for pointing this out. llvm-svn: 316305
This commit is contained in:
parent
39ff401026
commit
d96724db42
|
@ -963,27 +963,12 @@ const SectionPiece *MergeInputSection::getSectionPiece(uint64_t Offset) const {
|
|||
// Because contents of a mergeable section is not contiguous in output,
|
||||
// it is not just an addition to a base output offset.
|
||||
uint64_t MergeInputSection::getOffset(uint64_t Offset) const {
|
||||
if (!this->Live)
|
||||
if (!Live)
|
||||
return 0;
|
||||
|
||||
// Initialize OffsetMap lazily.
|
||||
llvm::call_once(InitOffsetMap, [&] {
|
||||
OffsetMap.reserve(Pieces.size());
|
||||
for (size_t I = 0; I < Pieces.size(); ++I)
|
||||
OffsetMap[Pieces[I].InputOff] = I;
|
||||
});
|
||||
|
||||
// Find a string starting at a given offset.
|
||||
auto It = OffsetMap.find(Offset);
|
||||
if (It != OffsetMap.end())
|
||||
return Pieces[It->second].OutputOff;
|
||||
|
||||
// If Offset is not at beginning of a section piece, it is not in the map.
|
||||
// In that case we need to search from the original section piece vector.
|
||||
const SectionPiece &Piece = *this->getSectionPiece(Offset);
|
||||
const SectionPiece &Piece = *getSectionPiece(Offset);
|
||||
if (!Piece.Live)
|
||||
return 0;
|
||||
|
||||
uint64_t Addend = Offset - Piece.InputOff;
|
||||
return Piece.OutputOff + Addend;
|
||||
}
|
||||
|
|
|
@ -269,9 +269,6 @@ private:
|
|||
void splitStrings(ArrayRef<uint8_t> A, size_t Size);
|
||||
void splitNonStrings(ArrayRef<uint8_t> A, size_t Size);
|
||||
|
||||
mutable llvm::DenseMap<uint32_t, uint32_t> OffsetMap;
|
||||
mutable llvm::once_flag InitOffsetMap;
|
||||
|
||||
llvm::DenseSet<uint64_t> LiveOffsets;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue