From 64f824c9d181c8ee78cba5b00fa7be0e5a0900a5 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Thu, 27 Dec 2012 02:14:01 +0000 Subject: 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 --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 52 ++++++++++++++++++++++++----------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 22 +++++++++++---- test/DebugInfo/X86/fission-cu.ll | 4 +-- test/DebugInfo/X86/stringpool.ll | 4 +-- 4 files changed, 57 insertions(+), 25 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 >*>, 64> Entries; + StringMapEntry >*>, 64> Entries; for (StringMap >::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()); +} diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 870b588cf7..59e4890dec 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -210,15 +210,17 @@ class DwarfUnits { // A pointer to all units in the section. SmallVector CUs; - // Collection of strings for this unit. + // Collection of strings for this unit and assorted symbols. StrPool *StringPool; unsigned NextStringPoolNumber; + std::string StringPref; public: DwarfUnits(AsmPrinter *AP, FoldingSet *AS, - std::vector *A, StrPool *SP) : + std::vector *A, + StrPool *SP, const char *Pref) : Asm(AP), AbbreviationsSet(AS), Abbreviations(A), - StringPool(SP), NextStringPoolNumber(0) {} + StringPool(SP), NextStringPoolNumber(0), StringPref(Pref) {} /// \brief Compute the size and offset of a DIE given an incoming Offset. unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); @@ -237,6 +239,9 @@ public: void emitUnits(DwarfDebug *, const MCSection *, const MCSection *, const MCSymbol *); + /// \brief Emit all of the strings to the section given. + void emitStrings(const MCSection *); + /// \brief Returns the entry into the start of the pool. MCSymbol *getStringPoolSym(); @@ -364,7 +369,7 @@ class DwarfDebug { MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; MCSymbol *DwarfDebugLocSectionSym; MCSymbol *FunctionBeginSym, *FunctionEndSym; - MCSymbol *DwarfAbbrevDWOSectionSym; + MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym; // As an optimization, there is no need to emit an entry in the directory // table for the same directory as DW_at_comp_dir. @@ -394,12 +399,16 @@ class DwarfDebug { // The CU left in the original object file for separated debug info. CompileUnit *SkeletonCU; - // Used to uniquely define abbreviations for the skeleton emission. + // Used to uniquely define abbreviations for the skeleton emission. FoldingSet SkeletonAbbrevSet; // A list of all the unique abbreviations in use. std::vector SkeletonAbbrevs; + // List of strings used in the skeleton. + StrPool SkeletonStringPool; + + // Holder for the skeleton information. DwarfUnits SkeletonHolder; private: @@ -514,6 +523,9 @@ private: /// \brief Emit the debug abbrev dwo section. void emitDebugAbbrevDWO(); + /// \brief Emit the debug str dwo section. + void emitDebugStrDWO(); + /// \brief Create new CompileUnit for the given metadata node with tag /// DW_TAG_compile_unit. CompileUnit *constructCompileUnit(const MDNode *N); diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll index f22874fe9c..28d4fb0497 100644 --- a/test/DebugInfo/X86/fission-cu.ll +++ b/test/DebugInfo/X86/fission-cu.ll @@ -20,10 +20,10 @@ ; DW_AT_ranges_base, DW_AT_addr_base. ; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000035] = "baz.c") +; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.c") ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) -; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x0000003b] = "/usr/local/google/home/echristo/tmp") +; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000006] = "/usr/local/google/home/echristo/tmp") ; Make sure there's only one compile unit for now. ; CHECK-NOT: DW_TAG_compile_unit diff --git a/test/DebugInfo/X86/stringpool.ll b/test/DebugInfo/X86/stringpool.ll index caf12c2756..21b0d09a86 100644 --- a/test/DebugInfo/X86/stringpool.ll +++ b/test/DebugInfo/X86/stringpool.ll @@ -15,7 +15,7 @@ !7 = metadata !{i32 720932, null, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] ; Verify that we refer to 'yyyy' with a relocation. -; LINUX: .long .Lstring3 # DW_AT_name +; LINUX: .long .Linfo_string3 # DW_AT_name ; LINUX-NEXT: .long 38 # DW_AT_type ; LINUX-NEXT: # DW_AT_external ; LINUX-NEXT: .byte 1 # DW_AT_decl_file @@ -25,7 +25,7 @@ ; LINUX-NEXT: .quad yyyy ; Verify that we refer to 'yyyy' without a relocation. -; DARWIN: Lset5 = Lstring3-Lsection_str ## DW_AT_name +; DARWIN: Lset5 = Linfo_string3-Linfo_string ## DW_AT_name ; DARWIN-NEXT: .long Lset5 ; DARWIN-NEXT: .long 39 ## DW_AT_type ; DARWIN-NEXT: .byte 1 ## DW_AT_external -- cgit v1.2.3