diff options
author | Eric Christopher <echristo@gmail.com> | 2012-12-27 02:14:01 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2012-12-27 02:14:01 +0000 |
commit | 64f824c9d181c8ee78cba5b00fa7be0e5a0900a5 (patch) | |
tree | f0e964ea93bd6df6a8bb9963789a51f57ca24e5c /lib/CodeGen/AsmPrinter/DwarfDebug.cpp | |
parent | d84aa00c7cec63292b4dbca37e813ce64254469f (diff) |
For the dwarf5 split debug info code split out the string section
per compile unit/skeleton compile unit. Update tests accordingly.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171133 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 52 |
1 files changed, 36 insertions, 16 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4867bb8177..74a81a5130 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -157,15 +157,18 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) AbbreviationsSet(InitAbbreviationsSetSize), SourceIdMap(DIEValueAllocator), InfoStringPool(DIEValueAllocator), PrevLabel(NULL), GlobalCUIndexCount(0), - InfoHolder(A, &AbbreviationsSet, &Abbreviations, &InfoStringPool), + InfoHolder(A, &AbbreviationsSet, &Abbreviations, + &InfoStringPool, "info_string"), SkeletonCU(0), SkeletonAbbrevSet(InitAbbreviationsSetSize), - SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, &InfoStringPool) { + SkeletonStringPool(DIEValueAllocator), + SkeletonHolder(A, &SkeletonAbbrevSet, &SkeletonAbbrevs, + &SkeletonStringPool, "skel_string") { DwarfInfoSectionSym = DwarfAbbrevSectionSym = 0; DwarfStrSectionSym = TextSectionSym = 0; DwarfDebugRangeSectionSym = DwarfDebugLocSectionSym = 0; - DwarfAbbrevDWOSectionSym = 0; + DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0; FunctionBeginSym = FunctionEndSym = 0; // Turn on accelerator tables and older gdb compatibility @@ -213,7 +216,7 @@ static MCSymbol *emitSectionSym(AsmPrinter *Asm, const MCSection *Section, } MCSymbol *DwarfUnits::getStringPoolSym() { - return Asm->GetTempSymbol("section_str"); + return Asm->GetTempSymbol(StringPref); } MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) { @@ -222,7 +225,7 @@ MCSymbol *DwarfUnits::getStringPoolEntry(StringRef Str) { if (Entry.first) return Entry.first; Entry.second = NextStringPoolNumber++; - return Entry.first = Asm->GetTempSymbol("string", Entry.second); + return Entry.first = Asm->GetTempSymbol(StringPref, Entry.second); } // Define a unique number for the abbreviation. @@ -987,6 +990,8 @@ void DwarfDebug::endModule() { // Finally emit string information into a string table. emitDebugStr(); + if (useSplitDwarf()) + emitDebugStrDWO(); // clean up. SPMap.clear(); @@ -1724,7 +1729,10 @@ void DwarfDebug::emitSectionLabels() { emitSectionSym(Asm, TLOF.getDwarfLocSection()); emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); DwarfStrSectionSym = - emitSectionSym(Asm, TLOF.getDwarfStrSection(), "section_str"); + emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string"); + if (useSplitDwarf()) + DwarfStrDWOSectionSym = + emitSectionSym(Asm, TLOF.getDwarfStrDWOSection(), "skel_string"); DwarfDebugRangeSectionSym = emitSectionSym(Asm, TLOF.getDwarfRangesSection(), "debug_range"); @@ -2107,23 +2115,21 @@ void DwarfDebug::emitDebugPubTypes() { } } -// Emit visible names into a debug str section. -void DwarfDebug::emitDebugStr() { - // Check to see if it is worth the effort. - if (InfoHolder.getStringPool()->empty()) return; +// Emit strings into a string section. +void DwarfUnits::emitStrings(const MCSection *Section) { + + if (StringPool->empty()) return; // Start the dwarf str section. - Asm->OutStreamer.SwitchSection( - Asm->getObjFileLowering().getDwarfStrSection()); + Asm->OutStreamer.SwitchSection(Section); // Get all of the string pool entries and put them in an array by their ID so // we can sort them. SmallVector<std::pair<unsigned, - StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; + StringMapEntry<std::pair<MCSymbol*, unsigned> >*>, 64> Entries; for (StringMap<std::pair<MCSymbol*, unsigned> >::iterator - I = InfoHolder.getStringPool()->begin(), - E = InfoHolder.getStringPool()->end(); + I = StringPool->begin(), E = StringPool->end(); I != E; ++I) Entries.push_back(std::make_pair(I->second.second, &*I)); @@ -2140,6 +2146,12 @@ void DwarfDebug::emitDebugStr() { } } +// Emit visible names into a debug str section. +void DwarfDebug::emitDebugStr() { + DwarfUnits &Holder = useSplitDwarf() ? SkeletonHolder : InfoHolder; + Holder.emitStrings(Asm->getObjFileLowering().getDwarfStrSection()); +} + // Emit visible names into a debug loc section. void DwarfDebug::emitDebugLoc() { if (DotDebugLocEntries.empty()) @@ -2363,7 +2375,7 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) { DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++, DIUnit.getLanguage(), Die, Asm, - this, &InfoHolder); + this, &SkeletonHolder); // FIXME: This should be the .dwo file. NewCU->addString(Die, dwarf::DW_AT_GNU_dwo_name, FN); @@ -2440,3 +2452,11 @@ void DwarfDebug::emitDebugAbbrevDWO() { emitAbbrevs(Asm->getObjFileLowering().getDwarfAbbrevDWOSection(), &Abbreviations); } + +// Emit the .debug_str.dwo section for separated dwarf. This contains the +// string section and is identical in format to traditional .debug_str +// sections. +void DwarfDebug::emitDebugStrDWO() { + assert(useSplitDwarf() && "No split dwarf?"); + InfoHolder.emitStrings(Asm->getObjFileLowering().getDwarfStrDWOSection()); +} |