Debug Info Finder: add processScope to actually handle the Scope.
authorManman Ren <manman.ren@gmail.com>
Mon, 22 Jul 2013 20:28:53 +0000 (20:28 +0000)
committerManman Ren <manman.ren@gmail.com>
Mon, 22 Jul 2013 20:28:53 +0000 (20:28 +0000)
Instead of just adding the scope to the list, we actually handle the scope.

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

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

index 5c74b172e9ff4bc06f79e1ac022be385df0249e2..d05b3287443ba515d48298b05b0f90b9d34574a0 100644 (file)
@@ -756,6 +756,8 @@ namespace llvm {
     /// processLocation - Process DILocation.
     void processLocation(DILocation Loc);
 
+    void processScope(DIScope Scope);
+
     /// addCompileUnit - Add compile unit into CUs.
     bool addCompileUnit(DICompileUnit CU);
 
index f6ffc039dcb0ac8e22eae3042403ce1a99a9d783..f63fa1a22d072274b1a6db157c8bdc5ceff787ad 100644 (file)
@@ -857,7 +857,7 @@ void DebugInfoFinder::processModule(const Module &M) {
       for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) {
         DIGlobalVariable DIG(GVs.getElement(i));
         if (addGlobalVariable(DIG)) {
-          addScope(DIG.getContext());
+          processScope(DIG.getContext());
           processType(DIG.getType());
         }
       }
@@ -897,7 +897,7 @@ void DebugInfoFinder::processLocation(DILocation Loc) {
 void DebugInfoFinder::processType(DIType DT) {
   if (!addType(DT))
     return;
-  addScope(DT.getContext());
+  processScope(DT.getContext());
   if (DT.isCompositeType()) {
     DICompositeType DCT(DT);
     processType(DCT.getTypeDerivedFrom());
@@ -915,6 +915,26 @@ void DebugInfoFinder::processType(DIType DT) {
   }
 }
 
+void DebugInfoFinder::processScope(DIScope Scope) {
+  if (Scope.isType()) {
+    DIType Ty(Scope);
+    processType(Ty);
+    return;
+  }
+  if (!addScope(Scope))
+    return;
+  if (Scope.isLexicalBlock()) {
+    DILexicalBlock LB(Scope);
+    processScope(LB.getContext());
+  } else if (Scope.isLexicalBlockFile()) {
+    DILexicalBlockFile LBF = DILexicalBlockFile(Scope);
+    processScope(LBF.getScope());
+  } else if (Scope.isNameSpace()) {
+    DINameSpace NS(Scope);
+    processScope(NS.getContext());
+  }
+}
+
 /// processLexicalBlock
 void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {
   DIScope Context = LB.getContext();
@@ -932,7 +952,7 @@ void DebugInfoFinder::processLexicalBlock(DILexicalBlock LB) {
 void DebugInfoFinder::processSubprogram(DISubprogram SP) {
   if (!addSubprogram(SP))
     return;
-  addScope(SP.getContext());
+  processScope(SP.getContext());
   processType(SP.getType());
 }