From: David Blaikie Date: Tue, 26 Nov 2013 19:14:34 +0000 (+0000) Subject: DwarfDebug: Include type units in accelerator tables. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9a9fe4da63f334f8766e839fb390d96747898f7b;p=oota-llvm.git DwarfDebug: Include type units in accelerator tables. Since type units aren't in the CUMap, use the DwarfUnits list to iterate over units for tasks such as accelerator table building. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index e1ffa05412f..5705b6abb4b 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1063,10 +1063,10 @@ void DwarfDebug::finalizeModuleInfo() { computeInlinedDIEs(); // Handle anything that needs to be done on a per-cu basis. - for (DenseMap::iterator CUI = CUMap.begin(), - CUE = CUMap.end(); - CUI != CUE; ++CUI) { - CompileUnit *TheCU = CUI->second; + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); + I != E; ++I) { + CompileUnit *TheCU = *I; // Emit DW_AT_containing_type attribute to connect types with their // vtable holding type. TheCU->constructContainingTypeDIEs(); @@ -1953,7 +1953,8 @@ void DwarfUnits::computeSizeAndOffsets() { // Iterate over each compile unit and set the size and offsets for each // DIE within each compile unit. All offsets are CU relative. - for (SmallVectorImpl::iterator I = CUs.begin(), E = CUs.end(); + for (SmallVectorImpl::const_iterator I = CUs.begin(), + E = CUs.end(); I != E; ++I) { (*I)->setDebugInfoOffset(SecOffset); @@ -2227,10 +2228,10 @@ void DwarfDebug::emitEndOfLineMatrix(unsigned SectionEnd) { void DwarfDebug::emitAccelNames() { DwarfAccelTable AT( DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); - for (DenseMap::iterator I = CUMap.begin(), - E = CUMap.end(); + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + CompileUnit *TheCU = *I; const StringMap > &Names = TheCU->getAccelNames(); for (StringMap >::const_iterator GI = Names.begin(), @@ -2260,10 +2261,10 @@ void DwarfDebug::emitAccelNames() { void DwarfDebug::emitAccelObjC() { DwarfAccelTable AT( DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); - for (DenseMap::iterator I = CUMap.begin(), - E = CUMap.end(); + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + CompileUnit *TheCU = *I; const StringMap > &Names = TheCU->getAccelObjC(); for (StringMap >::const_iterator GI = Names.begin(), @@ -2292,10 +2293,10 @@ void DwarfDebug::emitAccelObjC() { void DwarfDebug::emitAccelNamespaces() { DwarfAccelTable AT( DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4)); - for (DenseMap::iterator I = CUMap.begin(), - E = CUMap.end(); + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + CompileUnit *TheCU = *I; const StringMap > &Names = TheCU->getAccelNamespace(); for (StringMap >::const_iterator @@ -2331,10 +2332,10 @@ void DwarfDebug::emitAccelTypes() { Atoms.push_back( DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)); DwarfAccelTable AT(Atoms); - for (DenseMap::iterator I = CUMap.begin(), - E = CUMap.end(); + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + CompileUnit *TheCU = *I; const StringMap > > &Names = TheCU->getAccelTypes(); for (StringMap< @@ -2428,9 +2429,10 @@ void DwarfDebug::emitDebugPubNames(bool GnuStyle) { GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection() : Asm->getObjFileLowering().getDwarfPubNamesSection(); - typedef DenseMap CUMapType; - for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); + I != E; ++I) { + CompileUnit *TheCU = *I; unsigned ID = TheCU->getUniqueID(); // Start the dwarf pubnames section. @@ -2496,10 +2498,10 @@ void DwarfDebug::emitDebugPubTypes(bool GnuStyle) { GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection() : Asm->getObjFileLowering().getDwarfPubTypesSection(); - for (DenseMap::iterator I = CUMap.begin(), - E = CUMap.end(); + for (SmallVectorImpl::const_iterator I = getUnits().begin(), + E = getUnits().end(); I != E; ++I) { - CompileUnit *TheCU = I->second; + CompileUnit *TheCU = *I; // Start the dwarf pubtypes section. Asm->OutStreamer.SwitchSection(PSec); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index db2b92ef7af..c89e9dae773 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -258,6 +258,8 @@ public: ~DwarfUnits(); + const SmallVectorImpl &getUnits() { return CUs; } + /// \brief Compute the size and offset of a DIE given an incoming Offset. unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); @@ -479,10 +481,12 @@ class DwarfDebug { // Holder for the skeleton information. DwarfUnits SkeletonHolder; -private: - void addScopeVariable(LexicalScope *LS, DbgVariable *Var); + const SmallVectorImpl &getUnits() { + return InfoHolder.getUnits(); + } + /// \brief Find abstract variable associated with Var. DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc); diff --git a/test/DebugInfo/X86/generate-odr-hash.ll b/test/DebugInfo/X86/generate-odr-hash.ll index 8ff367fa675..df86576462e 100644 --- a/test/DebugInfo/X86/generate-odr-hash.ll +++ b/test/DebugInfo/X86/generate-odr-hash.ll @@ -91,11 +91,29 @@ ; CHECK: DW_TAG_structure_type ; CHECK-NEXT: debug_str{{.*}}"wombat" -; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit. +; 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. ; CHECK-LABEL: .debug_pubtypes contents: -; CHECK-NEXT: unit_offset = 0x00000000 -; CHECK-NEXT: Offset -; CHECK-NEXT: {{^$}} +; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit. +; CHECK-NEXT: unit_size = 0x00000174 +; CHECK-NEXT: Offset Name +; Type unit for 'bar' +; CHECK-NEXT: unit_size = 0x0000001f +; CHECK-NEXT: Offset Name +; CHECK-NEXT: "bar" +; CHECK-NEXT: unit_size = 0x00000059 +; CHECK-NEXT: Offset Name +; CHECK-NEXT: "int" +; CHECK-NEXT: "echidna::capybara::mongoose::fluffy" +; 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" %struct.bar = type { i8 } %"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }