summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2016-05-06 00:51:58 +0000
committerRui Ueyama <ruiu@google.com>2016-05-06 00:51:58 +0000
commit02d71ade063d1acbd9fe22c96671760ddf746219 (patch)
tree04e1ad0ec807fc3ed66d38e2ed8769f52b209ce7 /llvm
parent2a42da996d9b9327a7935fb330f63ff44a87e57a (diff)
downloadbcm5719-llvm-02d71ade063d1acbd9fe22c96671760ddf746219.tar.gz
bcm5719-llvm-02d71ade063d1acbd9fe22c96671760ddf746219.zip
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 llvm-svn: 268698
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/MC/StringTableBuilder.h7
-rw-r--r--llvm/lib/MC/StringTableBuilder.cpp8
2 files changed, 9 insertions, 6 deletions
diff --git a/llvm/include/llvm/MC/StringTableBuilder.h b/llvm/include/llvm/MC/StringTableBuilder.h
index 5a5e518f976..f2b8ecd2d99 100644
--- a/llvm/include/llvm/MC/StringTableBuilder.h
+++ b/llvm/include/llvm/MC/StringTableBuilder.h
@@ -23,7 +23,7 @@ public:
private:
SmallString<256> StringTable;
- DenseMap<StringRef, size_t> StringIndexMap;
+ DenseMap<CachedHash<StringRef>, 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<StringRef, size_t> &getMap() const { return StringIndexMap; }
+ const DenseMap<CachedHash<StringRef>, size_t> &getMap() const {
+ return StringIndexMap;
+ }
+
size_t getSize() const { return Size; }
void clear();
diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp
index 6118b17f248..9d95952a6d3 100644
--- a/llvm/lib/MC/StringTableBuilder.cpp
+++ b/llvm/lib/MC/StringTableBuilder.cpp
@@ -34,11 +34,11 @@ StringTableBuilder::StringTableBuilder(Kind K, unsigned Alignment)
}
}
-typedef std::pair<StringRef, size_t> StringPair;
+typedef std::pair<CachedHash<StringRef>, 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<StringRef, size_t> StringOffsetPair;
+ typedef std::pair<CachedHash<StringRef>, size_t> StringOffsetPair;
std::vector<StringOffsetPair *> 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!");
OpenPOWER on IntegriCloud