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
This commit is contained in:
parent
2a42da996d
commit
02d71ade06
|
@ -23,7 +23,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SmallString<256> StringTable;
|
SmallString<256> StringTable;
|
||||||
DenseMap<StringRef, size_t> StringIndexMap;
|
DenseMap<CachedHash<StringRef>, size_t> StringIndexMap;
|
||||||
size_t Size = 0;
|
size_t Size = 0;
|
||||||
Kind K;
|
Kind K;
|
||||||
unsigned Alignment;
|
unsigned Alignment;
|
||||||
|
@ -57,7 +57,10 @@ public:
|
||||||
/// after the table is finalized.
|
/// after the table is finalized.
|
||||||
size_t getOffset(StringRef S) const;
|
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; }
|
size_t getSize() const { return Size; }
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
|
|
@ -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.
|
// Returns the character at Pos from end of a string.
|
||||||
static int charTailAt(StringPair *P, size_t Pos) {
|
static int charTailAt(StringPair *P, size_t Pos) {
|
||||||
StringRef S = P->first;
|
StringRef S = P->first.Val;
|
||||||
if (Pos >= S.size())
|
if (Pos >= S.size())
|
||||||
return -1;
|
return -1;
|
||||||
return (unsigned char)S[S.size() - Pos - 1];
|
return (unsigned char)S[S.size() - Pos - 1];
|
||||||
|
@ -86,7 +86,7 @@ void StringTableBuilder::finalizeInOrder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StringTableBuilder::finalizeStringTable(bool Optimize) {
|
void StringTableBuilder::finalizeStringTable(bool Optimize) {
|
||||||
typedef std::pair<StringRef, size_t> StringOffsetPair;
|
typedef std::pair<CachedHash<StringRef>, size_t> StringOffsetPair;
|
||||||
std::vector<StringOffsetPair *> Strings;
|
std::vector<StringOffsetPair *> Strings;
|
||||||
Strings.reserve(StringIndexMap.size());
|
Strings.reserve(StringIndexMap.size());
|
||||||
for (StringOffsetPair &P : StringIndexMap)
|
for (StringOffsetPair &P : StringIndexMap)
|
||||||
|
@ -121,7 +121,7 @@ void StringTableBuilder::finalizeStringTable(bool Optimize) {
|
||||||
|
|
||||||
StringRef Previous;
|
StringRef Previous;
|
||||||
for (StringOffsetPair *P : Strings) {
|
for (StringOffsetPair *P : Strings) {
|
||||||
StringRef S = P->first;
|
StringRef S = P->first.Val;
|
||||||
if (K == WinCOFF)
|
if (K == WinCOFF)
|
||||||
assert(S.size() > COFF::NameSize && "Short string in COFF string table!");
|
assert(S.size() > COFF::NameSize && "Short string in COFF string table!");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue