summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/StringTableBuilder.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-01-29 00:49:42 +0000
committerReid Kleckner <rnk@google.com>2016-01-29 00:49:42 +0000
commit2214ed8937a05b9457b167a84d6732a448fad27f (patch)
tree8418d7840e286b16568c7f6c3301757fbd92771e /llvm/lib/MC/StringTableBuilder.cpp
parent0407108020ed12d8c34582d847d2c37cd68d1d0b (diff)
downloadbcm5719-llvm-2214ed8937a05b9457b167a84d6732a448fad27f.tar.gz
bcm5719-llvm-2214ed8937a05b9457b167a84d6732a448fad27f.zip
Reland "[CodeView] Use assembler directives for line tables"
This reverts commit r259126 and relands r259117. This time with updated library dependencies. llvm-svn: 259130
Diffstat (limited to 'llvm/lib/MC/StringTableBuilder.cpp')
-rw-r--r--llvm/lib/MC/StringTableBuilder.cpp55
1 files changed, 47 insertions, 8 deletions
diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp
index 80e552287b3..f50e098e6e4 100644
--- a/llvm/lib/MC/StringTableBuilder.cpp
+++ b/llvm/lib/MC/StringTableBuilder.cpp
@@ -16,7 +16,22 @@
using namespace llvm;
-StringTableBuilder::StringTableBuilder(Kind K) : K(K) {}
+StringTableBuilder::StringTableBuilder(Kind K) : K(K) {
+ // Account for leading bytes in table so that offsets returned from add are
+ // correct.
+ switch (K) {
+ case RAW:
+ Size = 0;
+ break;
+ case MachO:
+ case ELF:
+ Size = 1;
+ break;
+ case WinCOFF:
+ Size = 4;
+ break;
+ }
+}
typedef std::pair<StringRef, size_t> StringPair;
@@ -62,13 +77,32 @@ tailcall:
}
void StringTableBuilder::finalize() {
- std::vector<std::pair<StringRef, size_t> *> Strings;
+ finalizeStringTable(/*Optimize=*/true);
+}
+
+void StringTableBuilder::finalizeInOrder() {
+ finalizeStringTable(/*Optimize=*/false);
+}
+
+void StringTableBuilder::finalizeStringTable(bool Optimize) {
+ typedef std::pair<StringRef, size_t> StringOffsetPair;
+ std::vector<StringOffsetPair *> Strings;
Strings.reserve(StringIndexMap.size());
- for (std::pair<StringRef, size_t> &P : StringIndexMap)
+ for (StringOffsetPair &P : StringIndexMap)
Strings.push_back(&P);
- if (!Strings.empty())
- multikey_qsort(&Strings[0], &Strings[0] + Strings.size(), 0);
+ if (!Strings.empty()) {
+ // If we're optimizing, sort by name. If not, sort by previously assigned
+ // offset.
+ if (Optimize) {
+ multikey_qsort(&Strings[0], &Strings[0] + Strings.size(), 0);
+ } else {
+ std::sort(Strings.begin(), Strings.end(),
+ [](const StringOffsetPair *LHS, const StringOffsetPair *RHS) {
+ return LHS->second < RHS->second;
+ });
+ }
+ }
switch (K) {
case RAW:
@@ -85,17 +119,22 @@ void StringTableBuilder::finalize() {
}
StringRef Previous;
- for (std::pair<StringRef, size_t> *P : Strings) {
+ for (StringOffsetPair *P : Strings) {
StringRef S = P->first;
if (K == WinCOFF)
assert(S.size() > COFF::NameSize && "Short string in COFF string table!");
- if (Previous.endswith(S)) {
+ if (Optimize && Previous.endswith(S)) {
P->second = StringTable.size() - S.size() - (K != RAW);
continue;
}
- P->second = StringTable.size();
+ if (Optimize)
+ P->second = StringTable.size();
+ else
+ assert(P->second == StringTable.size() &&
+ "different strtab offset after finalization");
+
StringTable += S;
if (K != RAW)
StringTable += '\x00';
OpenPOWER on IntegriCloud