summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-23 21:48:05 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-23 21:48:05 +0000
commit21956e4007c21fd737c3548f7812a2c47adaf588 (patch)
tree616d874a12844107ae8d5edd12bff7638404b955 /llvm/lib/MC
parent803195ed6df7b7d983d800233d77afe0767ba69b (diff)
downloadbcm5719-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.cpp4
-rw-r--r--llvm/lib/MC/MachObjectWriter.cpp2
-rw-r--r--llvm/lib/MC/StringTableBuilder.cpp21
-rw-r--r--llvm/lib/MC/WinCOFFObjectWriter.cpp4
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)
OpenPOWER on IntegriCloud