diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-22 18:32:06 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-22 18:32:06 +0000 |
commit | fc063e8fec64b72ef06a5e4ec8835745e6548740 (patch) | |
tree | 665727f29a1b2bf89db79ade949f210512ed76f0 /llvm/lib/MC/StringTableBuilder.cpp | |
parent | d276de6db1c231f5338cb05847654fcd21a8317a (diff) | |
download | llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.zip llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.tar.gz llvm-fc063e8fec64b72ef06a5e4ec8835745e6548740.tar.bz2 |
Avoid storing a second copy of each string in StringTableBuilder.
This was only use in the extremely uncommon case of @@@ symbols on ELF.
llvm-svn: 251039
Diffstat (limited to 'llvm/lib/MC/StringTableBuilder.cpp')
-rw-r--r-- | llvm/lib/MC/StringTableBuilder.cpp | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp index 0f15d30..cc4fbf6 100644 --- a/llvm/lib/MC/StringTableBuilder.cpp +++ b/llvm/lib/MC/StringTableBuilder.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/StringTableBuilder.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/COFF.h" #include "llvm/Support/Endian.h" @@ -17,10 +16,10 @@ using namespace llvm; -static int compareBySuffix(StringMapEntry<size_t> *const *AP, - StringMapEntry<size_t> *const *BP) { - StringRef a = (*AP)->first(); - StringRef b = (*BP)->first(); +static int compareBySuffix(std::pair<StringRef, size_t> *const *AP, + std::pair<StringRef, size_t> *const *BP) { + StringRef a = (*AP)->first; + StringRef b = (*BP)->first; size_t sizeA = a.size(); size_t sizeB = b.size(); size_t len = std::min(sizeA, sizeB); @@ -34,9 +33,9 @@ static int compareBySuffix(StringMapEntry<size_t> *const *AP, } void StringTableBuilder::finalize(Kind kind) { - std::vector<StringMapEntry<size_t> *> Strings; + std::vector<std::pair<StringRef, size_t> *> Strings; Strings.reserve(StringIndexMap.size()); - for (StringMapEntry<size_t> &P : StringIndexMap) + for (std::pair<StringRef, size_t> &P : StringIndexMap) Strings.push_back(&P); array_pod_sort(Strings.begin(), Strings.end(), compareBySuffix); @@ -54,8 +53,8 @@ void StringTableBuilder::finalize(Kind kind) { } StringRef Previous; - for (StringMapEntry<size_t> *P : Strings) { - StringRef s = P->first(); + for (std::pair<StringRef, size_t> *P : Strings) { + StringRef s = P->first; if (kind == WinCOFF) assert(s.size() > COFF::NameSize && "Short string in COFF string table!"); @@ -92,3 +91,15 @@ void StringTableBuilder::clear() { StringTable.clear(); StringIndexMap.clear(); } + +size_t StringTableBuilder::getOffset(StringRef s) const { + assert(isFinalized()); + auto I = StringIndexMap.find(s); + assert(I != StringIndexMap.end() && "String is not in table!"); + return I->second; +} + +void StringTableBuilder::add(StringRef s) { + assert(!isFinalized()); + StringIndexMap.insert(std::make_pair(s, 0)); +} |