summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/StringTableBuilder.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-02-19 14:13:52 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-02-19 14:13:52 +0000
commit758de9ca1895e14521c94a27247bf331aee24500 (patch)
tree9d084eb7c60224883397a8a8cee6e00e7ce95449 /llvm/lib/MC/StringTableBuilder.cpp
parentcfa1d2b49d7b3f42833dc16cc5bfbaf3d9ba74a8 (diff)
downloadbcm5719-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.cpp24
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;
}
OpenPOWER on IntegriCloud