summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp33
1 files changed, 21 insertions, 12 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index d3309c1e6e8..6960ec94551 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -509,6 +509,21 @@ DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
return ScopeDIE;
}
+static std::unique_ptr<DIE> constructVariableDIE(DwarfCompileUnit &TheCU,
+ DbgVariable &DV,
+ const LexicalScope &Scope,
+ DIE *&ObjectPointer) {
+ AbstractOrInlined AOI = AOI_None;
+ if (Scope.isAbstractScope())
+ AOI = AOI_Abstract;
+ else if (Scope.getInlinedAt())
+ AOI = AOI_Inlined;
+ auto Var = TheCU.constructVariableDIE(DV, AOI);
+ if (DV.isObjectPointer())
+ ObjectPointer = Var.get();
+ return Var;
+}
+
DIE *DwarfDebug::createScopeChildrenDIE(
DwarfCompileUnit &TheCU, LexicalScope *Scope,
SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
@@ -517,12 +532,9 @@ DIE *DwarfDebug::createScopeChildrenDIE(
// Collect arguments for current function.
if (LScopes.isCurrentFunctionScope(Scope)) {
for (DbgVariable *ArgDV : CurrentFnArguments)
- if (ArgDV) {
+ if (ArgDV)
Children.push_back(
- TheCU.constructVariableDIE(*ArgDV, Scope->isAbstractScope()));
- if (ArgDV->isObjectPointer())
- ObjectPointer = Children.back().get();
- }
+ constructVariableDIE(TheCU, *ArgDV, *Scope, ObjectPointer));
// If this is a variadic function, add an unspecified parameter.
DISubprogram SP(Scope->getScopeNode());
@@ -535,12 +547,9 @@ DIE *DwarfDebug::createScopeChildrenDIE(
}
// Collect lexical scope children first.
- for (DbgVariable *DV : ScopeVariables.lookup(Scope)) {
- Children.push_back(
- TheCU.constructVariableDIE(*DV, Scope->isAbstractScope()));
- if (DV->isObjectPointer())
- ObjectPointer = Children.back().get();
- }
+ for (DbgVariable *DV : ScopeVariables.lookup(Scope))
+ Children.push_back(constructVariableDIE(TheCU, *DV, *Scope, ObjectPointer));
+
for (LexicalScope *LS : Scope->getChildren())
if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
Children.push_back(std::move(Nested));
@@ -897,7 +906,7 @@ void DwarfDebug::collectDeadVariables() {
if (!DV.isVariable())
continue;
DbgVariable NewVar(DV, nullptr, this);
- SPDIE->addChild(SPCU->constructVariableDIE(NewVar, false));
+ SPDIE->addChild(SPCU->constructVariableDIE(NewVar));
}
}
}
OpenPOWER on IntegriCloud