Debug Info Verifier: enable public functions of Finder to update the type map.
authorManman Ren <manman.ren@gmail.com>
Sun, 17 Nov 2013 18:42:37 +0000 (18:42 +0000)
committerManman Ren <manman.ren@gmail.com>
Sun, 17 Nov 2013 18:42:37 +0000 (18:42 +0000)
We used to depend on running processModule before the other public functions
such as processDeclare, processValue and processLocation. We are now relaxing
the constraint by adding a module argument to the three functions and
letting the three functions to initialize the type map. This will be used in
a follow-on patch that collects nodes reachable from a Function.

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

include/llvm/DebugInfo.h
lib/IR/DebugInfo.cpp
lib/IR/Verifier.cpp

index 0a070fe5305a420c69cd2325eba2a2e649792474..e73fda87059b5ec2cd6f45d6461203776c0c1874 100644 (file)
@@ -766,16 +766,19 @@ public:
   void processModule(const Module &M);
 
   /// processDeclare - Process DbgDeclareInst.
-  void processDeclare(const DbgDeclareInst *DDI);
+  void processDeclare(const Module &M, const DbgDeclareInst *DDI);
   /// Process DbgValueInst.
-  void processValue(const DbgValueInst *DVI);
+  void processValue(const Module &M, const DbgValueInst *DVI);
   /// processLocation - Process DILocation.
-  void processLocation(DILocation Loc);
+  void processLocation(const Module &M, DILocation Loc);
 
   /// Clear all lists.
   void reset();
 
 private:
+  /// Initialize TypeIdentifierMap.
+  void IntializeTypeMap(const Module &M);
+
   /// processType - Process DIType.
   void processType(DIType DT);
 
@@ -828,6 +831,8 @@ private:
   SmallVector<MDNode *, 8> Scopes; // Scopes
   SmallPtrSet<MDNode *, 64> NodesSeen;
   DITypeIdentifierMap TypeIdentifierMap;
+  /// Specify if TypeIdentifierMap is initialized.
+  bool TypeMapInitialized;
 };
 } // end namespace llvm
 
index bb6d5d2891921acabcddf77f8a2fabd2e12aac43..c9e19456a848729a519487f966849d18bf1bf4ff 100644 (file)
@@ -951,12 +951,21 @@ void DebugInfoFinder::reset() {
   Scopes.clear();
   NodesSeen.clear();
   TypeIdentifierMap.clear();
+  TypeMapInitialized = false;
+}
+
+void DebugInfoFinder::IntializeTypeMap(const Module &M) {
+  if (!TypeMapInitialized)
+    if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
+      TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
+      TypeMapInitialized = true;
+    }
 }
 
 /// processModule - Process entire module and collect debug info.
 void DebugInfoFinder::processModule(const Module &M) {
+  IntializeTypeMap(M);
   if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) {
-    TypeIdentifierMap = generateDITypeIdentifierMap(CU_Nodes);
     for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) {
       DICompileUnit CU(CU_Nodes->getOperand(i));
       addCompileUnit(CU);
@@ -993,11 +1002,12 @@ void DebugInfoFinder::processModule(const Module &M) {
 }
 
 /// processLocation - Process DILocation.
-void DebugInfoFinder::processLocation(DILocation Loc) {
+void DebugInfoFinder::processLocation(const Module &M, DILocation Loc) {
   if (!Loc)
     return;
+  IntializeTypeMap(M);
   processScope(Loc.getScope());
-  processLocation(Loc.getOrigLocation());
+  processLocation(M, Loc.getOrigLocation());
 }
 
 /// processType - Process DIType.
@@ -1084,10 +1094,12 @@ void DebugInfoFinder::processSubprogram(DISubprogram SP) {
 }
 
 /// processDeclare - Process DbgDeclareInst.
-void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
+void DebugInfoFinder::processDeclare(const Module &M,
+                                     const DbgDeclareInst *DDI) {
   MDNode *N = dyn_cast<MDNode>(DDI->getVariable());
   if (!N)
     return;
+  IntializeTypeMap(M);
 
   DIDescriptor DV(N);
   if (!DV.isVariable())
@@ -1099,10 +1111,11 @@ void DebugInfoFinder::processDeclare(const DbgDeclareInst *DDI) {
   processType(DIVariable(N).getType());
 }
 
-void DebugInfoFinder::processValue(const DbgValueInst *DVI) {
+void DebugInfoFinder::processValue(const Module &M, const DbgValueInst *DVI) {
   MDNode *N = dyn_cast<MDNode>(DVI->getVariable());
   if (!N)
     return;
+  IntializeTypeMap(M);
 
   DIDescriptor DV(N);
   if (!DV.isVariable())
index 8ce48bed28f6b22ebcfe6e91aa94baece11af3d5..32acfbd9ccc73bac97870f2d1e1254fd2c888480 100644 (file)
@@ -2125,7 +2125,7 @@ void Verifier::visitInstruction(Instruction &I) {
 
   if (!DisableDebugInfoVerifier) {
     MD = I.getMetadata(LLVMContext::MD_dbg);
-    Finder.processLocation(DILocation(MD));
+    Finder.processLocation(*Mod, DILocation(MD));
   }
 
   InstsInThisBlock.insert(&I);
@@ -2303,13 +2303,13 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
     Assert1(MD->getNumOperands() == 1,
                 "invalid llvm.dbg.declare intrinsic call 2", &CI);
     if (!DisableDebugInfoVerifier)
-      Finder.processDeclare(cast<DbgDeclareInst>(&CI));
+      Finder.processDeclare(*Mod, 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));
+      Finder.processValue(*Mod, cast<DbgValueInst>(&CI));
     }
     break;
   }