From: David Blaikie Date: Fri, 6 Dec 2013 19:38:46 +0000 (+0000) Subject: DebugInfo: Ensure unit IDs (for non-skeletal units) match thein index in the list X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5877a5b8a2c43ad0610f01b453d4891ae81cc911;p=oota-llvm.git DebugInfo: Ensure unit IDs (for non-skeletal units) match thein index in the list This simplifies reasoning about the code and enables simple navigation from a skeleton to its full unit. (currently there are no type unit skeletons, so the skeleton list doesn't have the same ID == index property) Eventually we should get rid of this ID and just store the labels we need as the IDs are allowing this code to create difficult to manage/understand associations (loops over non-skeletal units are implicitly referencing their skeletal units during pub* emission, for example). It may be necessary to have some kind of skeleton->full unit association and a more direct pointer or similar device would be preferable than an index. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196600 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index dffd4e03e27..7d780d1c2ed 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -179,7 +179,7 @@ static unsigned getDwarfVersionFromModule(const Module *M) { DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) : Asm(A), MMI(Asm->MMI), FirstCU(0), SourceIdMap(DIEValueAllocator), - PrevLabel(NULL), GlobalCUIndexCount(0), GlobalRangeCount(0), + PrevLabel(NULL), GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator), SkeletonHolder(A, "skel_string", DIEValueAllocator) { @@ -747,8 +747,10 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit DIUnit) { CompilationDir = DIUnit.getDirectory(); DIE *Die = new DIE(dwarf::DW_TAG_compile_unit); - CompileUnit *NewCU = new CompileUnit(GlobalCUIndexCount++, Die, DIUnit, Asm, - this, &InfoHolder); + CompileUnit *NewCU = new CompileUnit(InfoHolder.getUnits().size(), Die, + DIUnit, Asm, this, &InfoHolder); + InfoHolder.addUnit(NewCU); + FileIDCUMap[NewCU->getUniqueID()] = 0; // Call this to emit a .file directive if it wasn't emitted for the source @@ -816,8 +818,6 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit DIUnit) { if (!FirstCU) FirstCU = NewCU; - InfoHolder.addUnit(NewCU); - CUMap.insert(std::make_pair(DIUnit, NewCU)); CUDieMap.insert(std::make_pair(Die, NewCU)); return NewCU; @@ -3048,8 +3048,10 @@ void DwarfDebug::addTypeUnitType(uint16_t Language, DIE *RefDie, } } else { DIE *UnitDie = new DIE(dwarf::DW_TAG_type_unit); - TypeUnit *NewTU = new TypeUnit(GlobalCUIndexCount++, UnitDie, Language, Asm, - this, &InfoHolder); + TypeUnit *NewTU = new TypeUnit(InfoHolder.getUnits().size(), UnitDie, + Language, Asm, this, &InfoHolder); + InfoHolder.addUnit(NewTU); + NewTU->addUInt(UnitDie, dwarf::DW_AT_language, dwarf::DW_FORM_data2, Language); @@ -3077,8 +3079,6 @@ void DwarfDebug::addTypeUnitType(uint16_t Language, DIE *RefDie, // Remove the References vector and add the type hash. I->second.first = Signature; I->second.second = NULL; - - InfoHolder.addUnit(NewTU); } // Populate all the signatures. diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index d188735f870..567301dab64 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -437,9 +437,6 @@ class DwarfDebug : public AsmPrinterHandler { // table for the same directory as DW_AT_comp_dir. StringRef CompilationDir; - // Counter for assigning globally unique IDs for CUs. - unsigned GlobalCUIndexCount; - // Counter for assigning globally unique IDs for ranges. unsigned GlobalRangeCount; diff --git a/test/DebugInfo/X86/generate-odr-hash.ll b/test/DebugInfo/X86/generate-odr-hash.ll index 11a145c188c..e76d6cc148e 100644 --- a/test/DebugInfo/X86/generate-odr-hash.ll +++ b/test/DebugInfo/X86/generate-odr-hash.ll @@ -76,6 +76,9 @@ ; Check that we generate a hash for wombat and the value, but not for the ; anonymous type contained within. +; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7) +; CHECK: DW_TAG_structure_type +; CHECK-NEXT: debug_str{{.*}}"wombat" ; CHECK: DW_TAG_type_unit ; CHECK: DW_TAG_structure_type ; The signature for the outer 'wombat' type - this can be FileChecked once the @@ -87,9 +90,6 @@ ; CHECK-NOT: DW_AT_GNU_odr_signature ; CHECK: DW_TAG_member ; CHECK-NEXT: debug_str{{.*}}"a" -; CHECK-LABEL: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7) -; CHECK: DW_TAG_structure_type -; CHECK-NEXT: debug_str{{.*}}"wombat" ; Use the unit size as a rough hash/identifier for the unit we're dealing with ; it happens to be unambiguous at the moment, but it's hardly ideal. @@ -108,12 +108,12 @@ ; CHECK-NEXT: unit_size = 0x0000002f ; CHECK-NEXT: Offset Name ; CHECK-NEXT: "walrus" -; CHECK-NEXT: unit_size = 0x0000003f -; CHECK-NEXT: Offset Name -; CHECK-NEXT: "int" ; CHECK-NEXT: unit_size = 0x00000036 ; CHECK-NEXT: Offset Name ; CHECK-NEXT: "wombat" +; CHECK-NEXT: unit_size = 0x0000003f +; CHECK-NEXT: Offset Name +; CHECK-NEXT: "int" %struct.bar = type { i8 } %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }