diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-23 21:48:05 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-10-23 21:48:05 +0000 |
commit | 21956e4007c21fd737c3548f7812a2c47adaf588 (patch) | |
tree | 616d874a12844107ae8d5edd12bff7638404b955 /llvm/lib/MC | |
parent | 803195ed6df7b7d983d800233d77afe0767ba69b (diff) | |
download | bcm5719-llvm-21956e4007c21fd737c3548f7812a2c47adaf588.tar.gz bcm5719-llvm-21956e4007c21fd737c3548f7812a2c47adaf588.zip |
Add a RAW mode to StringTableBuilder.
In this mode it just tries to tail merge the strings without imposing any other
format constrains. It will not, for example, add a null byte between them.
Also add support for keeping a tentative size and offset if we decide to
not optimize after all.
This will be used shortly in lld for merging SHF_STRINGS sections.
llvm-svn: 251153
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 4 | ||||
-rw-r--r-- | llvm/lib/MC/MachObjectWriter.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/MC/StringTableBuilder.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 4 |
4 files changed, 21 insertions, 10 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 5fdfcf9ef2d..230d3d775b1 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -109,7 +109,7 @@ class ELFObjectWriter : public MCObjectWriter { BumpPtrAllocator Alloc; StringSaver VersionSymSaver{Alloc}; - StringTableBuilder StrTabBuilder; + StringTableBuilder StrTabBuilder{StringTableBuilder::ELF}; /// @} @@ -880,7 +880,7 @@ void ELFObjectWriter::computeSymbolTable( for (const std::string &Name : FileNames) StrTabBuilder.add(Name); - StrTabBuilder.finalize(StringTableBuilder::ELF); + StrTabBuilder.finalize(); for (const std::string &Name : FileNames) Writer.writeSymbol(StrTabBuilder.getOffset(Name), diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp index d5184f1d9a4..17023d82d62 100644 --- a/llvm/lib/MC/MachObjectWriter.cpp +++ b/llvm/lib/MC/MachObjectWriter.cpp @@ -520,7 +520,7 @@ void MachObjectWriter::computeSymbolTable( StringTable.add(Symbol.getName()); } - StringTable.finalize(StringTableBuilder::MachO); + StringTable.finalize(); // Build the symbol arrays but only for non-local symbols. // diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp index fc6c3bc0902..6210238e72a 100644 --- a/llvm/lib/MC/StringTableBuilder.cpp +++ b/llvm/lib/MC/StringTableBuilder.cpp @@ -16,6 +16,8 @@ using namespace llvm; +StringTableBuilder::StringTableBuilder(Kind K) : K(K) {} + static int compareBySuffix(std::pair<StringRef, size_t> *const *AP, std::pair<StringRef, size_t> *const *BP) { StringRef A = (*AP)->first; @@ -32,7 +34,7 @@ static int compareBySuffix(std::pair<StringRef, size_t> *const *AP, return SizeB - SizeA; } -void StringTableBuilder::finalize(Kind K) { +void StringTableBuilder::finalize() { std::vector<std::pair<StringRef, size_t> *> Strings; Strings.reserve(StringIndexMap.size()); for (std::pair<StringRef, size_t> &P : StringIndexMap) @@ -41,6 +43,8 @@ void StringTableBuilder::finalize(Kind K) { array_pod_sort(Strings.begin(), Strings.end(), compareBySuffix); switch (K) { + case RAW: + break; case ELF: case MachO: // Start the table with a NUL byte. @@ -59,17 +63,19 @@ void StringTableBuilder::finalize(Kind K) { assert(S.size() > COFF::NameSize && "Short string in COFF string table!"); if (Previous.endswith(S)) { - P->second = StringTable.size() - 1 - S.size(); + P->second = StringTable.size() - S.size() - (K != RAW); continue; } P->second = StringTable.size(); StringTable += S; - StringTable += '\x00'; + if (K != RAW) + StringTable += '\x00'; Previous = S; } switch (K) { + case RAW: case ELF: break; case MachO: @@ -85,6 +91,8 @@ void StringTableBuilder::finalize(Kind K) { StringTable.data(), Size); break; } + + Size = StringTable.size(); } void StringTableBuilder::clear() { @@ -99,7 +107,10 @@ size_t StringTableBuilder::getOffset(StringRef S) const { return I->second; } -void StringTableBuilder::add(StringRef S) { +size_t StringTableBuilder::add(StringRef S) { assert(!isFinalized()); - StringIndexMap.insert(std::make_pair(S, 0)); + auto P = StringIndexMap.insert(std::make_pair(S, Size)); + if (P.second) + Size += S.size() + (K != RAW); + return P.first->second; } diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index f251942161d..8d4d3df21ab 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -127,7 +127,7 @@ public: COFF::header Header; sections Sections; symbols Symbols; - StringTableBuilder Strings; + StringTableBuilder Strings{StringTableBuilder::WinCOFF}; // Maps used during object file creation. section_map SectionMap; @@ -908,7 +908,7 @@ void WinCOFFObjectWriter::writeObject(MCAssembler &Asm, for (const auto &S : Symbols) if (S->should_keep() && S->Name.size() > COFF::NameSize) Strings.add(S->Name); - Strings.finalize(StringTableBuilder::WinCOFF); + Strings.finalize(); // Set names. for (const auto &S : Sections) |