aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp32
1 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp
index fc98ed4..a599126 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfStringPool.cpp
@@ -12,12 +12,16 @@
using namespace llvm;
-std::pair<MCSymbol *, unsigned> &DwarfStringPool::getEntry(AsmPrinter &Asm,
- StringRef Str) {
- std::pair<MCSymbol *, unsigned> &Entry = Pool[Str];
- if (!Entry.first) {
- Entry.second = Pool.size() - 1;
- Entry.first = Asm.createTempSymbol(Prefix);
+DwarfStringPool::EntryTy &DwarfStringPool::getEntry(AsmPrinter &Asm,
+ StringRef Str) {
+ auto &Entry = Pool[Str];
+ if (!Entry.Symbol) {
+ Entry.Index = Pool.size() - 1;
+ Entry.Offset = NumBytes;
+ Entry.Symbol = Asm.createTempSymbol(Prefix);
+
+ NumBytes += Str.size() + 1;
+ assert(NumBytes > Entry.Offset && "Unexpected overflow");
}
return Entry;
}
@@ -32,17 +36,18 @@ void DwarfStringPool::emit(AsmPrinter &Asm, MCSection *StrSection,
// Get all of the string pool entries and put them in an array by their ID so
// we can sort them.
- SmallVector<const StringMapEntry<std::pair<MCSymbol *, unsigned>> *, 64>
- Entries(Pool.size());
+ SmallVector<const StringMapEntry<EntryTy> *, 64> Entries(Pool.size());
for (const auto &E : Pool)
- Entries[E.getValue().second] = &E;
+ Entries[E.getValue().Index] = &E;
for (const auto &Entry : Entries) {
// Emit a label for reference from debug information entries.
- Asm.OutStreamer->EmitLabel(Entry->getValue().first);
+ Asm.OutStreamer->EmitLabel(Entry->getValue().Symbol);
// Emit the string itself with a terminating null byte.
+ Asm.OutStreamer->AddComment("string offset=" +
+ Twine(Entry->getValue().Offset));
Asm.OutStreamer->EmitBytes(
StringRef(Entry->getKeyData(), Entry->getKeyLength() + 1));
}
@@ -50,11 +55,8 @@ void DwarfStringPool::emit(AsmPrinter &Asm, MCSection *StrSection,
// If we've got an offset section go ahead and emit that now as well.
if (OffsetSection) {
Asm.OutStreamer->SwitchSection(OffsetSection);
- unsigned offset = 0;
unsigned size = 4; // FIXME: DWARF64 is 8.
- for (const auto &Entry : Entries) {
- Asm.OutStreamer->EmitIntValue(offset, size);
- offset += Entry->getKeyLength() + 1;
- }
+ for (const auto &Entry : Entries)
+ Asm.OutStreamer->EmitIntValue(Entry->getValue().Offset, size);
}
}