[llvm] r195776 - DwarfDebug: Include type units in accelerator tables.

David Blaikie dblaikie at gmail.com
Tue Nov 26 11:14:34 PST 2013


Author: dblaikie
Date: Tue Nov 26 13:14:34 2013
New Revision: 195776

URL: http://llvm.org/viewvc/llvm-project?rev=195776&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
    llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=195776&r1=195775&r2=195776&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Nov 26 13:14:34 2013
@@ -1063,10 +1063,10 @@ void DwarfDebug::finalizeModuleInfo() {
   computeInlinedDIEs();
 
   // Handle anything that needs to be done on a per-cu basis.
-  for (DenseMap<const MDNode *, CompileUnit *>::iterator CUI = CUMap.begin(),
-                                                         CUE = CUMap.end();
-       CUI != CUE; ++CUI) {
-    CompileUnit *TheCU = CUI->second;
+  for (SmallVectorImpl<CompileUnit *>::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<CompileUnit *>::iterator I = CUs.begin(), E = CUs.end();
+  for (SmallVectorImpl<CompileUnit *>::const_iterator I = CUs.begin(),
+                                                      E = CUs.end();
        I != E; ++I) {
     (*I)->setDebugInfoOffset(SecOffset);
 
@@ -2227,10 +2228,10 @@ void DwarfDebug::emitEndOfLineMatrix(uns
 void DwarfDebug::emitAccelNames() {
   DwarfAccelTable AT(
       DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset, dwarf::DW_FORM_data4));
-  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
-                                                         E = CUMap.end();
+  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
+                                                      E = getUnits().end();
        I != E; ++I) {
-    CompileUnit *TheCU = I->second;
+    CompileUnit *TheCU = *I;
     const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelNames();
     for (StringMap<std::vector<const DIE *> >::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<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
-                                                         E = CUMap.end();
+  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
+                                                      E = getUnits().end();
        I != E; ++I) {
-    CompileUnit *TheCU = I->second;
+    CompileUnit *TheCU = *I;
     const StringMap<std::vector<const DIE *> > &Names = TheCU->getAccelObjC();
     for (StringMap<std::vector<const DIE *> >::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<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
-                                                         E = CUMap.end();
+  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
+                                                      E = getUnits().end();
        I != E; ++I) {
-    CompileUnit *TheCU = I->second;
+    CompileUnit *TheCU = *I;
     const StringMap<std::vector<const DIE *> > &Names =
         TheCU->getAccelNamespace();
     for (StringMap<std::vector<const DIE *> >::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<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
-                                                         E = CUMap.end();
+  for (SmallVectorImpl<CompileUnit *>::const_iterator I = getUnits().begin(),
+                                                      E = getUnits().end();
        I != E; ++I) {
-    CompileUnit *TheCU = I->second;
+    CompileUnit *TheCU = *I;
     const StringMap<std::vector<std::pair<const DIE *, unsigned> > > &Names =
         TheCU->getAccelTypes();
     for (StringMap<
@@ -2428,9 +2429,10 @@ void DwarfDebug::emitDebugPubNames(bool
       GnuStyle ? Asm->getObjFileLowering().getDwarfGnuPubNamesSection()
                : Asm->getObjFileLowering().getDwarfPubNamesSection();
 
-  typedef DenseMap<const MDNode *, CompileUnit *> CUMapType;
-  for (CUMapType::iterator I = CUMap.begin(), E = CUMap.end(); I != E; ++I) {
-    CompileUnit *TheCU = I->second;
+  for (SmallVectorImpl<CompileUnit *>::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 ? Asm->getObjFileLowering().getDwarfGnuPubTypesSection()
                : Asm->getObjFileLowering().getDwarfPubTypesSection();
 
-  for (DenseMap<const MDNode *, CompileUnit *>::iterator I = CUMap.begin(),
-                                                         E = CUMap.end();
+  for (SmallVectorImpl<CompileUnit *>::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);
 

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=195776&r1=195775&r2=195776&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Nov 26 13:14:34 2013
@@ -258,6 +258,8 @@ public:
 
   ~DwarfUnits();
 
+  const SmallVectorImpl<CompileUnit *> &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<CompileUnit *> &getUnits() {
+    return InfoHolder.getUnits();
+  }
+
   /// \brief Find abstract variable associated with Var.
   DbgVariable *findAbstractVariable(DIVariable &Var, DebugLoc Loc);
 

Modified: llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll?rev=195776&r1=195775&r2=195776&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll (original)
+++ llvm/trunk/test/DebugInfo/X86/generate-odr-hash.ll Tue Nov 26 13:14:34 2013
@@ -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 }





More information about the llvm-commits mailing list