Debug Info Finder: use processDeclare and processValue to list debug info
authorManman Ren <manman.ren@gmail.com>
Tue, 23 Jul 2013 00:22:51 +0000 (00:22 +0000)
committerManman Ren <manman.ren@gmail.com>
Tue, 23 Jul 2013 00:22:51 +0000 (00:22 +0000)
MDNodes used by DbgDeclareInst and DbgValueInst.

Another 16 testing cases failed and they are disabled with
-disable-debug-info-verifier.
A total of 34 cases are disabled with -disable-debug-info-verifier and will be
corrected.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186902 91177308-0d34-0410-b5e6-96231b3b80d8

19 files changed:
include/llvm/DebugInfo.h
lib/IR/DebugInfo.cpp
lib/IR/Verifier.cpp
test/Assembler/functionlocal-metadata.ll
test/CodeGen/ARM/2010-04-15-ScavengerDebugValue.ll
test/CodeGen/ARM/debug-info-blocks.ll
test/CodeGen/X86/2010-02-01-DbgValueCrash.ll
test/CodeGen/X86/2010-06-01-DeadArg-DbgInfo.ll
test/CodeGen/X86/2010-11-02-DbgParameter.ll
test/CodeGen/X86/dbg-declare-arg.ll
test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll
test/DebugInfo/2010-05-03-DisableFramePtr.ll
test/DebugInfo/2010-05-03-OriginDIE.ll
test/DebugInfo/2010-10-01-crash.ll
test/DebugInfo/X86/earlydup-crash.ll
test/DebugInfo/X86/pr12831.ll
test/DebugInfo/inheritance.ll
test/Linker/2011-08-18-unique-class-type.ll
test/Transforms/LoopRotate/dbgvalue.ll

index d05b3287443ba515d48298b05b0f90b9d34574a0..53b1bdd560535e940bf8fa2d8ec53d4587bfbb57 100644 (file)
@@ -31,6 +31,7 @@ namespace llvm {
   class Type;
   class Value;
   class DbgDeclareInst;
+  class DbgValueInst;
   class Instruction;
   class MDNode;
   class NamedMDNode;
@@ -734,12 +735,23 @@ namespace llvm {
   /// cleanseInlinedVariable - Remove inlined scope from the variable.
   DIVariable cleanseInlinedVariable(MDNode *DV, LLVMContext &VMContext);
 
+  /// DebugInfoFinder tries to list all debug info MDNodes in a module. To
+  /// list debug info MDNodes used by an instruction, DebugInfoFinder uses
+  /// processDeclare and processValue. processModule will go through
+  /// all DICompileUnits and list debug info MDNodes used by the CUs.
   class DebugInfoFinder {
   public:
     /// processModule - Process entire module and collect debug info
     /// anchors.
     void processModule(const Module &M);
 
+    /// processDeclare - Process DbgDeclareInst.
+    void processDeclare(const DbgDeclareInst *DDI);
+    /// Process DbgValueInst.
+    void processValue(const DbgValueInst *DVI);
+
+    /// Clear all lists.
+    void reset();
   private:
     /// processType - Process DIType.
     void processType(DIType DT);
@@ -750,9 +762,6 @@ namespace llvm {
     /// processSubprogram - Process DISubprogram.
     void processSubprogram(DISubprogram SP);
 
-    /// processDeclare - Process DbgDeclareInst.
-    void processDeclare(const DbgDeclareInst *DDI);
-
     /// processLocation - Process DILocation.
     void processLocation(DILocation Loc);
 
index f63fa1a22d072274b1a6db157c8bdc5ceff787ad..9d88ce0e50b3714b317223545cfb05141960b47e 100644 (file)
@@ -847,6 +847,15 @@ bool llvm::isSubprogramContext(const MDNode *Context) {
 // DebugInfoFinder implementations.
 //===----------------------------------------------------------------------===//
 
+void DebugInfoFinder::reset() {
+  CUs.clear();
+  SPs.clear();
+  GVs.clear();
+  TYs.clear();
+  Scopes.clear();
+  NodesSeen.clear();
+}
+
 /// processModule - Process entire module and collect debug info.
 void DebugInfoFinder::processModule(const Module &M) {
   if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
@@ -970,6 +979,19 @@ void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
   processType(DIVariable(N).getType());
 }
 
+void DebugInfoFinder::processValue(const DbgValueInst *DVI) {
+  MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
+  if (!N) return;
+
+  DIDescriptor DV(N);
+  if (!DV.isVariable())
+    return;
+
+  if (!NodesSeen.insert(DV))
+    return;
+  processType(DIVariable(N).getType());
+}
+
 /// addType - Add type into Tys.
 bool DebugInfoFinder::addType(DIType DT) {
   if (!DT.isValid())
index fa53a4ee69406aed8856564a3eb5dd69ca5bace1..b22d21177226fdfc53fa7485cd5bebfa4ab88ffe 100644 (file)
@@ -147,6 +147,9 @@ namespace {
     /// the same personality function.
     const Value *PersonalityFn;
 
+    /// Finder keeps track of all debug info MDNodes in a Module.
+    DebugInfoFinder Finder;
+
     Verifier()
       : FunctionPass(ID), Broken(false),
         action(AbortProcessAction), Mod(0), Context(0), DT(0),
@@ -162,6 +165,7 @@ namespace {
     bool doInitialization(Module &M) {
       Mod = &M;
       Context = &M.getContext();
+      Finder.reset();
 
       // We must abort before returning back to the pass manager, or else the
       // pass manager may try to run other passes on the broken module.
@@ -2144,7 +2148,17 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
     MDNode *MD = cast<MDNode>(CI.getArgOperand(0));
     Assert1(MD->getNumOperands() == 1,
                 "invalid llvm.dbg.declare intrinsic call 2", &CI);
+    if (!DisableDebugInfoVerifier)
+      Finder.processDeclare(cast<DbgDeclareInst>(&CI));
   } break;
+  case Intrinsic::dbg_value: { //llvm.dbg.value
+    if (!DisableDebugInfoVerifier) {
+      Assert1(CI.getArgOperand(0) && isa<MDNode>(CI.getArgOperand(0)),
+              "invalid llvm.dbg.value intrinsic call 1", &CI);
+      Finder.processValue(cast<DbgValueInst>(&CI));
+    }
+    break;
+  }
   case Intrinsic::memcpy:
   case Intrinsic::memmove:
   case Intrinsic::memset:
@@ -2209,7 +2223,6 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
 void Verifier::verifyDebugInfo(Module &M) {
   // Verify Debug Info.
   if (!DisableDebugInfoVerifier) {
-    DebugInfoFinder Finder;
     Finder.processModule(M);
 
     for (DebugInfoFinder::iterator I = Finder.compile_unit_begin(),
index 216587d98a72638153cf07981c282f1cc56c0077..5b815742298b97e7f7c627cf6311dac333d83e83 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-as < %s | llvm-dis | FileCheck %s
+; RUN: llvm-as -disable-debug-info-verifier < %s | llvm-dis | FileCheck %s
 
 define void @Foo(i32 %a, i32 %b) {
 entry:
index 05581c3f16cf16a5256e620cbec2312e60cb62d8..016e827f42f3f605c309310615512ef3526503e9 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s
+; RUN: llc -disable-debug-info-verifier < %s
 ; PR6847
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:64-n32"
 target triple = "armv4t-apple-darwin10"
index fc21860cd5336677cba3e41929f11bbe06d534a5..9942a6e5d150039d2a5216671a212322e796aa40 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -O0 < %s | FileCheck %s
+; RUN: llc -O0 -disable-debug-info-verifier < %s | FileCheck %s
 ; CHECK: @DEBUG_VALUE: mydata <- [SP+{{[0-9]+}}]
 ; Radar 9331779
 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
index 2113263c0ac3d6ac2315399ab5f94256c79c1972..eda25c10fbc6cc251123b953409e09c3fed24e8c 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -O1 < %s
+; RUN: llc -O1 -disable-debug-info-verifier < %s
 ; ModuleID = 'pr6157.bc'
 ; formerly crashed in SelectionDAGBuilder
 
index 25223ca1cbd9fe19443e37600632261ff67f61d6..b85754542fb3c16390610b57fd335efe7c29b531 100644 (file)
@@ -1,5 +1,5 @@
-; RUN: llc -O2 < %s | FileCheck %s
-; RUN: llc -O2 -regalloc=basic < %s | FileCheck %s
+; RUN: llc -O2 -disable-debug-info-verifier < %s | FileCheck %s
+; RUN: llc -O2 -regalloc=basic -disable-debug-info-verifier < %s | FileCheck %s
 ; Test to check that unused argument 'this' is not undefined in debug info.
 
 target triple = "x86_64-apple-darwin10.2"
index 8719f738b7cc13d6d51969be0e5d425a1e85ecd6..11775d23f4ff8a7e913655e98bc546522ecdd370 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -O2 -asm-verbose < %s | FileCheck %s
+; RUN: llc -O2 -disable-debug-info-verifier -asm-verbose < %s | FileCheck %s
 ; Radar 8616981
 
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
index f7e0c91cdff252b258e5923891b556dd9d7143bd..81efe8ea65bbaae605bd48d4ba2052b1374a1439 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -O0 -fast-isel=false < %s | FileCheck %s
+; RUN: llc -O0 -fast-isel=false -disable-debug-info-verifier < %s | FileCheck %s
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
 target triple = "x86_64-apple-macosx10.6.7"
 ;Radar 9321650
index accdf8a86cb70ef8c35f40f882bc8509505c0c67..d31c128013bf04c2a42a50ec06cd9b9105a85ac2 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc < %s -o /dev/null
+; RUN: llc -disable-debug-info-verifier < %s -o /dev/null
 
 define void @baz(i32 %i) nounwind ssp {
 entry:
index 4061bdc834d7878c178faccc405da3ddf7813e2d..27c7e192a77f46774e1bae236e6c0764a51046d3 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc  -o /dev/null -disable-non-leaf-fp-elim < %s
+; RUN: llc  -disable-debug-info-verifier -o /dev/null -disable-non-leaf-fp-elim < %s
 ; Radar 7937664
 %struct.AppleEvent = type opaque
 
index 1ade04504631b2419f006eb479247d7ceb17af77..c9ace896c7cb21a247ed56cdb390598b3b803876 100644 (file)
@@ -1,5 +1,5 @@
 
-;RUN: llc < %s -o /dev/null
+;RUN: llc -disable-debug-info-verifier < %s -o /dev/null
 ;Radar 7937109
 
 %struct.anon = type { i64, i32, i32, i32, [1 x i32] }
index c4161b49426dc2f2758e93b442b7fe01890d8112..ed6ea0480f41091b418286d2855d017c0db2c7e8 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc -O0 %s -o /dev/null
+; RUN: llc -O0 -disable-debug-info-verifier %s -o /dev/null
 ; XFAIL: hexagon
 ; PR 8235
 
index 5bd0c7e0bb74554661949321b1e527cc213f3de1..2ac8b2eed17084d7463cc221d2ab86b2c98c333b 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc %s -mtriple=i386-apple-macosx10.6.7 -o /dev/null
+; RUN: llc -disable-debug-info-verifier %s -mtriple=i386-apple-macosx10.6.7 -o /dev/null
 
 ; This used to crash because early dup was not ignoring debug instructions.
 
index 295c018c5e13f223f324b2537b9bc86d0a9b94ce..43fd53814ffbb5f7e91e493e2a70906669689e06 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc %s -mtriple=x86_64-unknown-linux-gnu -o /dev/null
+; RUN: llc -disable-debug-info-verifier %s -mtriple=x86_64-unknown-linux-gnu -o /dev/null
 
 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
index a689cb228181e61858510b4bfa00cfa4aee48105..24eb79ea612638d873768112c4aa0f4df30c7977 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llc %s -o /dev/null
+; RUN: llc -disable-debug-info-verifier %s -o /dev/null
 ; PR 2613.
 
 %struct.__class_type_info_pseudo = type { %struct.__type_info_pseudo }
index 328e83bd07b948f05440ca5e44df1855f84d4192..65b5a0acca58d62eb2dea2ce8e8ceccdb85d8378 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: llvm-link %s %p/2011-08-18-unique-class-type2.ll -S -o - | FileCheck %s
+; RUN: llvm-link -disable-debug-info-verifier %s %p/2011-08-18-unique-class-type2.ll -S -o - | FileCheck %s
 ; CHECK: DW_TAG_class_type
 ; CHECK-NOT: DW_TAG_class_type
 ; Test to check there is only one MDNode for class A after linking.
index f4b6184604e26013bf269022da2f64311eed85ba..8b9e2ba52e2ea29ce78ef94846f11732a59da0ed 100644 (file)
@@ -1,4 +1,4 @@
-; RUN: opt -S -loop-rotate < %s | FileCheck %s
+; RUN: opt -S -loop-rotate -disable-debug-info-verifier < %s | FileCheck %s
 
 declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
 declare void @llvm.dbg.value(metadata, i64, metadata) nounwind readnone