diff --git a/include/llvm/DebugInfo.h b/include/llvm/DebugInfo.h index 5c74b172e9f..d05b3287443 100644 --- a/include/llvm/DebugInfo.h +++ b/include/llvm/DebugInfo.h @@ -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); diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index f6ffc039dcb..f63fa1a22d0 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -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()); }