From ecc2a1e20cf64972fced2b10fa0203eecc92ccd4 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Fri, 6 May 2016 00:51:58 +0000 Subject: [PATCH] Make StringTableBuilder to cache hash values. This change seems to speed up LLD a bit if it has a lot of mergeable sections. The number is below. It's not too bad for a small patch. Time to link Clang (debug build): w/o patch 6.3696 seconds w/patch 6.2746 seconds (-1.5%) Differential Revision: http://reviews.llvm.org/D19933 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268698 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/StringTableBuilder.h | 7 +++++-- lib/MC/StringTableBuilder.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/llvm/MC/StringTableBuilder.h b/include/llvm/MC/StringTableBuilder.h index 5a5e518f976..f2b8ecd2d99 100644 --- a/include/llvm/MC/StringTableBuilder.h +++ b/include/llvm/MC/StringTableBuilder.h @@ -23,7 +23,7 @@ public: private: SmallString<256> StringTable; - DenseMap StringIndexMap; + DenseMap, size_t> StringIndexMap; size_t Size = 0; Kind K; unsigned Alignment; @@ -57,7 +57,10 @@ public: /// after the table is finalized. size_t getOffset(StringRef S) const; - const DenseMap &getMap() const { return StringIndexMap; } + const DenseMap, size_t> &getMap() const { + return StringIndexMap; + } + size_t getSize() const { return Size; } void clear(); diff --git a/lib/MC/StringTableBuilder.cpp b/lib/MC/StringTableBuilder.cpp index 6118b17f248..9d95952a6d3 100644 --- a/lib/MC/StringTableBuilder.cpp +++ b/lib/MC/StringTableBuilder.cpp @@ -34,11 +34,11 @@ StringTableBuilder::StringTableBuilder(Kind K, unsigned Alignment) } } -typedef std::pair StringPair; +typedef std::pair, size_t> StringPair; // Returns the character at Pos from end of a string. static int charTailAt(StringPair *P, size_t Pos) { - StringRef S = P->first; + StringRef S = P->first.Val; if (Pos >= S.size()) return -1; return (unsigned char)S[S.size() - Pos - 1]; @@ -86,7 +86,7 @@ void StringTableBuilder::finalizeInOrder() { } void StringTableBuilder::finalizeStringTable(bool Optimize) { - typedef std::pair StringOffsetPair; + typedef std::pair, size_t> StringOffsetPair; std::vector Strings; Strings.reserve(StringIndexMap.size()); for (StringOffsetPair &P : StringIndexMap) @@ -121,7 +121,7 @@ void StringTableBuilder::finalizeStringTable(bool Optimize) { StringRef Previous; for (StringOffsetPair *P : Strings) { - StringRef S = P->first; + StringRef S = P->first.Val; if (K == WinCOFF) assert(S.size() > COFF::NameSize && "Short string in COFF string table!"); -- 2.50.1