1*daefdbf3SDavid Blaikie //===-- llvm/CodeGen/DwarfStringPool.cpp - Dwarf Debug Framework ----------===// 2*daefdbf3SDavid Blaikie // 3*daefdbf3SDavid Blaikie // The LLVM Compiler Infrastructure 4*daefdbf3SDavid Blaikie // 5*daefdbf3SDavid Blaikie // This file is distributed under the University of Illinois Open Source 6*daefdbf3SDavid Blaikie // License. See LICENSE.TXT for details. 7*daefdbf3SDavid Blaikie // 8*daefdbf3SDavid Blaikie //===----------------------------------------------------------------------===// 9*daefdbf3SDavid Blaikie 10*daefdbf3SDavid Blaikie #include "DwarfStringPool.h" 11*daefdbf3SDavid Blaikie #include "llvm/MC/MCStreamer.h" 12*daefdbf3SDavid Blaikie 13*daefdbf3SDavid Blaikie using namespace llvm; 14*daefdbf3SDavid Blaikie 15*daefdbf3SDavid Blaikie MCSymbol *DwarfStringPool::getSectionSymbol() { return SectionSymbol; } 16*daefdbf3SDavid Blaikie 17*daefdbf3SDavid Blaikie std::pair<MCSymbol *, unsigned> & 18*daefdbf3SDavid Blaikie getEntry(AsmPrinter &Asm, 19*daefdbf3SDavid Blaikie StringMap<std::pair<MCSymbol *, unsigned>, BumpPtrAllocator &> &Pool, 20*daefdbf3SDavid Blaikie StringRef Prefix, StringRef Str) { 21*daefdbf3SDavid Blaikie std::pair<MCSymbol *, unsigned> &Entry = 22*daefdbf3SDavid Blaikie Pool.GetOrCreateValue(Str).getValue(); 23*daefdbf3SDavid Blaikie if (!Entry.first) { 24*daefdbf3SDavid Blaikie Entry.second = Pool.size() - 1; 25*daefdbf3SDavid Blaikie Entry.first = Asm.GetTempSymbol(Prefix, Entry.second); 26*daefdbf3SDavid Blaikie } 27*daefdbf3SDavid Blaikie return Entry; 28*daefdbf3SDavid Blaikie } 29*daefdbf3SDavid Blaikie 30*daefdbf3SDavid Blaikie MCSymbol *DwarfStringPool::getSymbol(AsmPrinter &Asm, StringRef Str) { 31*daefdbf3SDavid Blaikie return getEntry(Asm, Pool, Prefix, Str).first; 32*daefdbf3SDavid Blaikie } 33*daefdbf3SDavid Blaikie 34*daefdbf3SDavid Blaikie unsigned DwarfStringPool::getIndex(AsmPrinter &Asm, StringRef Str) { 35*daefdbf3SDavid Blaikie return getEntry(Asm, Pool, Prefix, Str).second; 36*daefdbf3SDavid Blaikie } 37*daefdbf3SDavid Blaikie 38*daefdbf3SDavid Blaikie void DwarfStringPool::emit(AsmPrinter &Asm, const MCSection *StrSection, 39*daefdbf3SDavid Blaikie const MCSection *OffsetSection, 40*daefdbf3SDavid Blaikie const MCSymbol *StrSecSym) { 41*daefdbf3SDavid Blaikie if (Pool.empty()) 42*daefdbf3SDavid Blaikie return; 43*daefdbf3SDavid Blaikie 44*daefdbf3SDavid Blaikie // Start the dwarf str section. 45*daefdbf3SDavid Blaikie Asm.OutStreamer.SwitchSection(StrSection); 46*daefdbf3SDavid Blaikie 47*daefdbf3SDavid Blaikie // Get all of the string pool entries and put them in an array by their ID so 48*daefdbf3SDavid Blaikie // we can sort them. 49*daefdbf3SDavid Blaikie SmallVector<const StringMapEntry<std::pair<MCSymbol *, unsigned>> *, 64> 50*daefdbf3SDavid Blaikie Entries(Pool.size()); 51*daefdbf3SDavid Blaikie 52*daefdbf3SDavid Blaikie for (const auto &E : Pool) 53*daefdbf3SDavid Blaikie Entries[E.getValue().second] = &E; 54*daefdbf3SDavid Blaikie 55*daefdbf3SDavid Blaikie for (const auto &Entry : Entries) { 56*daefdbf3SDavid Blaikie // Emit a label for reference from debug information entries. 57*daefdbf3SDavid Blaikie Asm.OutStreamer.EmitLabel(Entry->getValue().first); 58*daefdbf3SDavid Blaikie 59*daefdbf3SDavid Blaikie // Emit the string itself with a terminating null byte. 60*daefdbf3SDavid Blaikie Asm.OutStreamer.EmitBytes( 61*daefdbf3SDavid Blaikie StringRef(Entry->getKeyData(), Entry->getKeyLength() + 1)); 62*daefdbf3SDavid Blaikie } 63*daefdbf3SDavid Blaikie 64*daefdbf3SDavid Blaikie // If we've got an offset section go ahead and emit that now as well. 65*daefdbf3SDavid Blaikie if (OffsetSection) { 66*daefdbf3SDavid Blaikie Asm.OutStreamer.SwitchSection(OffsetSection); 67*daefdbf3SDavid Blaikie unsigned offset = 0; 68*daefdbf3SDavid Blaikie unsigned size = 4; // FIXME: DWARF64 is 8. 69*daefdbf3SDavid Blaikie for (const auto &Entry : Entries) { 70*daefdbf3SDavid Blaikie Asm.OutStreamer.EmitIntValue(offset, size); 71*daefdbf3SDavid Blaikie offset += Entry->getKeyLength() + 1; 72*daefdbf3SDavid Blaikie } 73*daefdbf3SDavid Blaikie } 74*daefdbf3SDavid Blaikie } 75