From: Rui Ueyama Date: Sun, 22 Oct 2017 23:02:07 +0000 (+0000) Subject: Remove a fast lookup table from MergeInputSection. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d96724db42c04af11d0ff1f8a57d36cb8284752b;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index ac659f7..56b68da 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -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; } diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index fc03749..853b638 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -269,9 +269,6 @@ private: void splitStrings(ArrayRef A, size_t Size); void splitNonStrings(ArrayRef A, size_t Size); - mutable llvm::DenseMap OffsetMap; - mutable llvm::once_flag InitOffsetMap; - llvm::DenseSet LiveOffsets; };