Extract subprogram and compile unit information from the debug info attached to an...
authorDevang Patel <dpatel@apple.com>
Wed, 7 Oct 2009 22:04:08 +0000 (22:04 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 7 Oct 2009 22:04:08 +0000 (22:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83491 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/DebugInfo.h
lib/Analysis/DebugInfo.cpp

index 53c5120de064f1f414cb7615dc1ac9d73e98ff27..d494bf5f2251ab9ba196a172d4abfb56dfe62d01 100644 (file)
@@ -679,7 +679,10 @@ bool getLocationInfo(const Value *V, std::string &DisplayName,
     /// processType - Process DIType.
     void processType(DIType DT);
 
-    /// processSubprogram - Enumberate DISubprogram.
+    /// processLexicalBlock - Process DILexicalBlock.
+    void processLexicalBlock(DILexicalBlock LB);
+
+    /// processSubprogram - Process DISubprogram.
     void processSubprogram(DISubprogram SP);
 
     /// processStopPoint - Process DbgStopPointInst.
index 1d6e3a6e44efd27b4aa9195c4f66561528526cc5..1436aa909e5960582c543a0a790d3cb709bad02e 100644 (file)
@@ -966,6 +966,12 @@ void DIFactory::InsertDeclare(Value *Storage, DIVariable D,
 /// processModule - Process entire module and collect debug info.
 void DebugInfoFinder::processModule(Module &M) {
 
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+  MetadataContext &TheMetadata = M.getContext().getMetadata();
+  unsigned MDDbgKind = TheMetadata.getMDKind("dbg");
+  if (!MDDbgKind)
+    return;
+#endif
   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
     for (Function::iterator FI = (*I).begin(), FE = (*I).end(); FI != FE; ++FI)
       for (BasicBlock::iterator BI = (*FI).begin(), BE = (*FI).end(); BI != BE;
@@ -980,6 +986,18 @@ void DebugInfoFinder::processModule(Module &M) {
           processRegionEnd(DRE);
         else if (DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
           processDeclare(DDI);
+#ifdef ATTACH_DEBUG_INFO_TO_AN_INSN
+        else if (MDNode *L = TheMetadata.getMD(MDDbgKind, BI)) {
+          DILocation Loc(L);
+          DIScope S(Loc.getScope().getNode());
+          if (S.isCompileUnit())
+            addCompileUnit(DICompileUnit(S.getNode()));
+          else if (S.isSubprogram())
+            processSubprogram(DISubprogram(S.getNode()));
+          else if (S.isLexicalBlock())
+            processLexicalBlock(DILexicalBlock(S.getNode()));
+        }
+#endif
       }
 
   NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.gv");
@@ -1021,6 +1039,17 @@ void DebugInfoFinder::processType(DIType DT) {
   }
 }
 
+/// processLexicalBlock
+void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {
+  if (LB.isNull())
+    return;
+  DIScope Context = LB.getContext();
+  if (Context.isLexicalBlock())
+    return processLexicalBlock(DILexicalBlock(Context.getNode()));
+  else
+    return processSubprogram(DISubprogram(Context.getNode()));
+}
+
 /// processSubprogram - Process DISubprogram.
 void DebugInfoFinder::processSubprogram(DISubprogram SP) {
   if (SP.isNull())