Skip instructions until new scope is seen.
authorDevang Patel <dpatel@apple.com>
Thu, 1 Apr 2010 17:32:01 +0000 (17:32 +0000)
committerDevang Patel <dpatel@apple.com>
Thu, 1 Apr 2010 17:32:01 +0000 (17:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100117 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfDebug.cpp

index 8f8c7f8bfee69a38bfeaf7e68da1f98ee6f07bf9..45c8dadfbab88f19ba6638448f1c9d43f690d9a9 100644 (file)
@@ -2146,6 +2146,8 @@ bool DwarfDebug::extractScopeInformation() {
 
   DenseMap<const MachineInstr *, unsigned> MIIndexMap;
   unsigned MIIndex = 0;
+  MDNode *PrevScope = NULL;
+  MDNode *PrevInlinedAt = NULL;
   // Scan each instruction and create scopes. First build working set of scopes.
   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
        I != E; ++I) {
@@ -2159,17 +2161,23 @@ bool DwarfDebug::extractScopeInformation() {
       if (DL.isUnknown()) continue;
       DILocation DLT = MF->getDILocation(DL);
       DIScope DLTScope = DLT.getScope();
-      if (!DLTScope.getNode()) continue;
+      MDNode *NewScope = DLTScope.getNode();
+      if (!NewScope) continue;
       // There is no need to create another DIE for compile unit. For all
       // other scopes, create one DbgScope now. This will be translated
       // into a scope DIE at the end.
       if (DLTScope.isCompileUnit()) continue;
-      createDbgScope(DLTScope.getNode(), DLT.getOrigLocation().getNode());
+      MDNode *NewInlinedAt = DLT.getOrigLocation().getNode();
+      if (NewScope == PrevScope && NewInlinedAt == PrevInlinedAt) continue;
+      createDbgScope(NewScope, NewInlinedAt);
+      PrevScope = NewScope;
+      PrevInlinedAt = NewInlinedAt;
     }
   }
 
-
   // Build scope hierarchy using working set of scopes.
+  PrevScope = NULL;
+  PrevInlinedAt = NULL;
   for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
        I != E; ++I) {
     for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
@@ -2181,14 +2189,18 @@ bool DwarfDebug::extractScopeInformation() {
       if (DL.isUnknown())  continue;
       DILocation DLT = MF->getDILocation(DL);
       DIScope DLTScope = DLT.getScope();
-      if (!DLTScope.getNode()) continue;
+      MDNode *NewScope = DLTScope.getNode();
+      if (!NewScope) continue;
       // There is no need to create another DIE for compile unit. For all
       // other scopes, create one DbgScope now. This will be translated
       // into a scope DIE at the end.
       if (DLTScope.isCompileUnit()) continue;
-      DbgScope *Scope = getUpdatedDbgScope(DLTScope.getNode(), MInsn, 
-                                           DLT.getOrigLocation().getNode());
+      MDNode *NewInlinedAt = DLT.getOrigLocation().getNode();
+      if (NewScope == PrevScope && NewInlinedAt == PrevInlinedAt) continue;
+      DbgScope *Scope = getUpdatedDbgScope(NewScope, MInsn, NewInlinedAt);
       Scope->setLastInsn(MInsn);
+      PrevScope = NewScope;
+      PrevInlinedAt = NewInlinedAt;
     }
   }