mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 20:29:48 +00:00
85d436d90a
And since it /looked/ like the DwarfStrSectionSym was unused, I tried removing it - but then it turned out that DwarfStringPool was reconstructing the same label (and expecting it to have already been emitted) and uses that. So I kept it around, but wanted to pass it in to users - since it seemed a bit silly for DwarfStringPool to have it passed in and returned but itself have no use for it. The only two users don't handle strings in both .dwo and .o files so they only ever need the one symbol - no need to keep it (and have an unused symbol) in the DwarfStringPool used for fission/.dwo. Refactor a bunch of accelerator table usage to remove duplication so I didn't have to touch 4-5 callers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217628 91177308-0d34-0410-b5e6-96231b3b80d8
72 lines
2.2 KiB
C++
72 lines
2.2 KiB
C++
//===-- llvm/CodeGen/DwarfStringPool.cpp - Dwarf Debug Framework ----------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "DwarfStringPool.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static std::pair<MCSymbol *, unsigned> &
|
|
getEntry(AsmPrinter &Asm,
|
|
StringMap<std::pair<MCSymbol *, unsigned>, BumpPtrAllocator &> &Pool,
|
|
StringRef Prefix, StringRef Str) {
|
|
std::pair<MCSymbol *, unsigned> &Entry =
|
|
Pool.GetOrCreateValue(Str).getValue();
|
|
if (!Entry.first) {
|
|
Entry.second = Pool.size() - 1;
|
|
Entry.first = Asm.GetTempSymbol(Prefix, Entry.second);
|
|
}
|
|
return Entry;
|
|
}
|
|
|
|
MCSymbol *DwarfStringPool::getSymbol(AsmPrinter &Asm, StringRef Str) {
|
|
return getEntry(Asm, Pool, Prefix, Str).first;
|
|
}
|
|
|
|
unsigned DwarfStringPool::getIndex(AsmPrinter &Asm, StringRef Str) {
|
|
return getEntry(Asm, Pool, Prefix, Str).second;
|
|
}
|
|
|
|
void DwarfStringPool::emit(AsmPrinter &Asm, const MCSection *StrSection,
|
|
const MCSection *OffsetSection) {
|
|
if (Pool.empty())
|
|
return;
|
|
|
|
// Start the dwarf str section.
|
|
Asm.OutStreamer.SwitchSection(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());
|
|
|
|
for (const auto &E : Pool)
|
|
Entries[E.getValue().second] = &E;
|
|
|
|
for (const auto &Entry : Entries) {
|
|
// Emit a label for reference from debug information entries.
|
|
Asm.OutStreamer.EmitLabel(Entry->getValue().first);
|
|
|
|
// Emit the string itself with a terminating null byte.
|
|
Asm.OutStreamer.EmitBytes(
|
|
StringRef(Entry->getKeyData(), Entry->getKeyLength() + 1));
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
}
|