diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-19 14:13:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2016-02-19 14:13:52 +0000 |
commit | 758de9ca1895e14521c94a27247bf331aee24500 (patch) | |
tree | 9d084eb7c60224883397a8a8cee6e00e7ce95449 /llvm/lib/MC/StringTableBuilder.cpp | |
parent | cfa1d2b49d7b3f42833dc16cc5bfbaf3d9ba74a8 (diff) | |
download | bcm5719-llvm-758de9ca1895e14521c94a27247bf331aee24500.tar.gz bcm5719-llvm-758de9ca1895e14521c94a27247bf331aee24500.zip |
Add support for merging strings with alignment larger than one char.
This will be used in a lld patch.
llvm-svn: 261326
Diffstat (limited to 'llvm/lib/MC/StringTableBuilder.cpp')
-rw-r--r-- | llvm/lib/MC/StringTableBuilder.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/llvm/lib/MC/StringTableBuilder.cpp b/llvm/lib/MC/StringTableBuilder.cpp index f50e098e6e4..6118b17f248 100644 --- a/llvm/lib/MC/StringTableBuilder.cpp +++ b/llvm/lib/MC/StringTableBuilder.cpp @@ -16,7 +16,8 @@ using namespace llvm; -StringTableBuilder::StringTableBuilder(Kind K) : K(K) { +StringTableBuilder::StringTableBuilder(Kind K, unsigned Alignment) + : K(K), Alignment(Alignment) { // Account for leading bytes in table so that offsets returned from add are // correct. switch (K) { @@ -125,15 +126,21 @@ void StringTableBuilder::finalizeStringTable(bool Optimize) { assert(S.size() > COFF::NameSize && "Short string in COFF string table!"); if (Optimize && Previous.endswith(S)) { - P->second = StringTable.size() - S.size() - (K != RAW); - continue; + size_t Pos = StringTable.size() - S.size() - (K != RAW); + if (!(Pos & (Alignment - 1))) { + P->second = Pos; + continue; + } } - if (Optimize) - P->second = StringTable.size(); - else + if (Optimize) { + size_t Start = alignTo(StringTable.size(), Alignment); + P->second = Start; + StringTable.append(Start - StringTable.size(), '\0'); + } else { assert(P->second == StringTable.size() && "different strtab offset after finalization"); + } StringTable += S; if (K != RAW) @@ -176,8 +183,9 @@ size_t StringTableBuilder::getOffset(StringRef S) const { size_t StringTableBuilder::add(StringRef S) { assert(!isFinalized()); - auto P = StringIndexMap.insert(std::make_pair(S, Size)); + size_t Start = alignTo(Size, Alignment); + auto P = StringIndexMap.insert(std::make_pair(S, Start)); if (P.second) - Size += S.size() + (K != RAW); + Size = Start + S.size() + (K != RAW); return P.first->second; } |