diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index fc54a2925be..86389f89783 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -101,7 +101,7 @@ static const ConstantExpr *getMergedGlobalExpr(const Value *V) { /// getOrCreateGlobalVariableDIE - get or create global variable DIE. DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE( - const DIGlobalVariable *GV) { + const DIGlobalVariable *GV, DIE *ContextDIE) { // Check for pre-existence. if (DIE *Die = getDIE(GV)) return Die; @@ -113,7 +113,8 @@ DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE( // Construct the context before querying for the existence of the DIE in // case such construction creates the DIE. - DIE *ContextDIE = getOrCreateContextDIE(GVContext); + if (ContextDIE == nullptr) + ContextDIE = getOrCreateContextDIE(GVContext); // Add to map. DIE *VariableDIE = &createAndAddDIE(GV->getTag(), *ContextDIE, GV); @@ -335,17 +336,16 @@ void DwarfCompileUnit::constructScopeDIE( // null and the children will be added to the scope DIE. createScopeChildrenDIE(Scope, Children, &ChildScopeCount); - // Skip imported directives in gmlt-like data. - if (!includeMinimalInlineScopes()) { - // There is no need to emit empty lexical block DIE. - for (const auto &E : DD->findImportedEntitiesForScope(DS)) - Children.push_back( - constructImportedEntityDIE(cast<DIImportedEntity>(E.second))); - } + + DwarfDebug::LocalDeclMapRange LocalDeclNodeRangeForScope(nullptr, nullptr); + // Skip local decls in gmlt-like data. + if (!includeMinimalInlineScopes()) + LocalDeclNodeRangeForScope = DD->findLocalDeclNodesForScope(DS); // If there are only other scopes as children, put them directly in the // parent instead, as this scope would serve no purpose. - if (Children.size() == ChildScopeCount) { + if (Children.size() == ChildScopeCount && + empty(LocalDeclNodeRangeForScope)) { FinalChildren.insert(FinalChildren.end(), std::make_move_iterator(Children.begin()), std::make_move_iterator(Children.end())); @@ -353,6 +353,15 @@ void DwarfCompileUnit::constructScopeDIE( } ScopeDIE = constructLexicalScopeDIE(Scope); assert(ScopeDIE && "Scope DIE should not be null."); + + for (const auto &DI : LocalDeclNodeRangeForScope) { + if (auto *IE = dyn_cast<DIImportedEntity>(DI.second)) + Children.push_back(constructImportedEntityDIE(IE)); + else if (auto *GV = dyn_cast<DIGlobalVariable>(DI.second)) + getOrCreateGlobalVariableDIE(GV, ScopeDIE); + else if (auto *RT = dyn_cast<DIType>(DI.second)) + getOrCreateTypeDIE(RT, ScopeDIE); + } } // Add children |

