DwarfStringPool.cpp revision 6948897e478cbd66626159776a8017b3c18579b9
1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===-- llvm/CodeGen/DwarfStringPool.cpp - Dwarf Debug Framework ----------===// 2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// The LLVM Compiler Infrastructure 4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file is distributed under the University of Illinois Open Source 6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// License. See LICENSE.TXT for details. 7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// 8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===// 9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "DwarfStringPool.h" 116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/CodeGen/AsmPrinter.h" 126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/MC/MCAsmInfo.h" 13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCStreamer.h" 14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm; 16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarDwarfStringPool::DwarfStringPool(BumpPtrAllocator &A, AsmPrinter &Asm, 186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef Prefix) 196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar : Pool(A), Prefix(Prefix), 206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar ShouldCreateSymbols(Asm.MAI->doesDwarfUseRelocationsAcrossSections()) {} 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarDwarfStringPool::EntryRef DwarfStringPool::getEntry(AsmPrinter &Asm, 236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar StringRef Str) { 246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto I = Pool.insert(std::make_pair(Str, EntryTy())); 256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (I.second) { 266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar auto &Entry = I.first->second; 276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Entry.Index = Pool.size() - 1; 286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Entry.Offset = NumBytes; 296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Entry.Symbol = ShouldCreateSymbols ? Asm.createTempSymbol(Prefix) : nullptr; 30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar NumBytes += Str.size() + 1; 326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(NumBytes > Entry.Offset && "Unexpected overflow"); 336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return EntryRef(*I.first); 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid DwarfStringPool::emit(AsmPrinter &Asm, MCSection *StrSection, 386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSection *OffsetSection) { 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Pool.empty()) 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return; 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Start the dwarf str section. 436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->SwitchSection(StrSection); 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Get all of the string pool entries and put them in an array by their ID so 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // we can sort them. 476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar SmallVector<const StringMapEntry<EntryTy> *, 64> Entries(Pool.size()); 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &E : Pool) 506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Entries[E.getValue().Index] = &E; 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines for (const auto &Entry : Entries) { 536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(ShouldCreateSymbols == static_cast<bool>(Entry->getValue().Symbol) && 546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "Mismatch between setting and entry"); 556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Emit a label for reference from debug information entries. 576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (ShouldCreateSymbols) 586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->EmitLabel(Entry->getValue().Symbol); 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Emit the string itself with a terminating null byte. 616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->AddComment("string offset=" + 626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Twine(Entry->getValue().Offset)); 636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->EmitBytes( 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef(Entry->getKeyData(), Entry->getKeyLength() + 1)); 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // If we've got an offset section go ahead and emit that now as well. 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (OffsetSection) { 696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->SwitchSection(OffsetSection); 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned size = 4; // FIXME: DWARF64 is 8. 716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar for (const auto &Entry : Entries) 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Asm.OutStreamer->EmitIntValue(Entry->getValue().Offset, size); 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 75