diff options
| author | Rui Ueyama <ruiu@google.com> | 2017-10-22 23:02:07 +0000 |
|---|---|---|
| committer | Rui Ueyama <ruiu@google.com> | 2017-10-22 23:02:07 +0000 |
| commit | d96724db42c04af11d0ff1f8a57d36cb8284752b (patch) | |
| tree | 475ac159f2f2a5660d8978e49b4f07ab4288695f | |
| parent | 39ff4010261d4a989a2c18612c5b99845e1f1923 (diff) | |
| download | bcm5719-llvm-d96724db42c04af11d0ff1f8a57d36cb8284752b.tar.gz bcm5719-llvm-d96724db42c04af11d0ff1f8a57d36cb8284752b.zip | |
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
| -rw-r--r-- | lld/ELF/InputSection.cpp | 19 | ||||
| -rw-r--r-- | lld/ELF/InputSection.h | 3 |
2 files changed, 2 insertions, 20 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index ac659f7256c..56b68da6116 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 fc03749c845..853b6385ae2 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -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; }; |

