diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 77bb77d4a5f..2269686d2e2 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -865,7 +865,7 @@ void DwarfDebug::collectDeadVariables() { for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) { DIVariable DV(Variables.getElement(vi)); assert(DV.isVariable()); - DbgVariable NewVar(DV, nullptr, this); + DbgVariable NewVar(DV, this); auto VariableDie = SPCU->constructVariableDIE(NewVar); SPCU->applyVariableAttributes(NewVar, *VariableDie); SPDIE->addChild(std::move(VariableDie)); @@ -1086,32 +1086,31 @@ DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) { return getExistingAbstractVariable(DV, Cleansed); } -DbgVariable *DwarfDebug::createAbstractVariable(DIVariable &Var, - LexicalScope *Scope) { - auto AbsDbgVariable = make_unique(Var, nullptr, this); +void DwarfDebug::createAbstractVariable(const DIVariable &Var, + LexicalScope *Scope) { + auto AbsDbgVariable = make_unique(Var, this); addScopeVariable(Scope, AbsDbgVariable.get()); - return (AbstractVariables[Var] = std::move(AbsDbgVariable)).get(); + AbstractVariables[Var] = std::move(AbsDbgVariable); } -DbgVariable *DwarfDebug::getOrCreateAbstractVariable(DIVariable &DV, - const MDNode *ScopeNode) { +void DwarfDebug::ensureAbstractVariableIsCreated(const DIVariable &DV, + const MDNode *ScopeNode) { DIVariable Cleansed = DV; - if (DbgVariable *Var = getExistingAbstractVariable(DV, Cleansed)) - return Var; + if (getExistingAbstractVariable(DV, Cleansed)) + return; - return createAbstractVariable(Cleansed, - LScopes.getOrCreateAbstractScope(ScopeNode)); + createAbstractVariable(Cleansed, LScopes.getOrCreateAbstractScope(ScopeNode)); } -DbgVariable *DwarfDebug::findAbstractVariable(DIVariable &DV, - const MDNode *ScopeNode) { +void +DwarfDebug::ensureAbstractVariableIsCreatedIfScoped(const DIVariable &DV, + const MDNode *ScopeNode) { DIVariable Cleansed = DV; - if (DbgVariable *Var = getExistingAbstractVariable(DV, Cleansed)) - return Var; + if (getExistingAbstractVariable(DV, Cleansed)) + return; if (LexicalScope *Scope = LScopes.findAbstractScope(ScopeNode)) - return createAbstractVariable(Cleansed, Scope); - return nullptr; + createAbstractVariable(Cleansed, Scope); } // If Var is a current function argument then add it to CurrentFnArguments list. @@ -1150,9 +1149,8 @@ void DwarfDebug::collectVariableInfoFromMMITable( if (!Scope) continue; - DbgVariable *AbsDbgVariable = - findAbstractVariable(DV, Scope->getScopeNode()); - ConcreteVariables.push_back(make_unique(DV, AbsDbgVariable, this)); + ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); + ConcreteVariables.push_back(make_unique(DV, this)); DbgVariable *RegVar = ConcreteVariables.back().get(); RegVar->setFrameIndex(VI.Slot); addScopeVariable(Scope, RegVar); @@ -1220,8 +1218,8 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { Processed.insert(DV); const MachineInstr *MInsn = Ranges.front().first; assert(MInsn->isDebugValue() && "History must begin with debug value"); - DbgVariable *AbsVar = findAbstractVariable(DV, Scope->getScopeNode()); - ConcreteVariables.push_back(make_unique(MInsn, AbsVar, this)); + ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); + ConcreteVariables.push_back(make_unique(MInsn, this)); DbgVariable *RegVar = ConcreteVariables.back().get(); addScopeVariable(Scope, RegVar); @@ -1278,8 +1276,8 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { if (!Processed.insert(DV)) continue; if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) { - ConcreteVariables.push_back(make_unique( - DV, findAbstractVariable(DV, Scope->getScopeNode()), this)); + ensureAbstractVariableIsCreatedIfScoped(DV, Scope->getScopeNode()); + ConcreteVariables.push_back(make_unique(DV, this)); addScopeVariable(Scope, ConcreteVariables.back().get()); } } @@ -1563,7 +1561,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { assert(DV && DV.isVariable()); if (!ProcessedVars.insert(DV)) continue; - getOrCreateAbstractVariable(DV, DV.getContext()); + ensureAbstractVariableIsCreated(DV, DV.getContext()); } constructAbstractSubprogramScopeDIE(TheCU, AScope); } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 8445b74798f..f2aa80845a0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -72,25 +72,21 @@ class DbgVariable { DIVariable Var; // Variable Descriptor. DIE *TheDIE; // Variable DIE. unsigned DotDebugLocOffset; // Offset in DotDebugLocEntries. - DbgVariable *AbsVar; // Corresponding Abstract variable, if any. const MachineInstr *MInsn; // DBG_VALUE instruction of the variable. int FrameIndex; DwarfDebug *DD; public: /// Construct a DbgVariable from a DIVariable. - /// AbstractVar may be NULL. - DbgVariable(DIVariable V, DbgVariable *AbstractVar, DwarfDebug *DD) - : Var(V), TheDIE(nullptr), DotDebugLocOffset(~0U), AbsVar(AbstractVar), - MInsn(nullptr), FrameIndex(~0), DD(DD) {} + DbgVariable(DIVariable V, DwarfDebug *DD) + : Var(V), TheDIE(nullptr), DotDebugLocOffset(~0U), MInsn(nullptr), + FrameIndex(~0), DD(DD) {} /// Construct a DbgVariable from a DEBUG_VALUE. /// AbstractVar may be NULL. - DbgVariable(const MachineInstr *DbgValue, DbgVariable *AbstractVar, - DwarfDebug *DD) - : Var(DbgValue->getDebugVariable()), - TheDIE(nullptr), DotDebugLocOffset(~0U), AbsVar(AbstractVar), - MInsn(DbgValue), FrameIndex(~0), DD(DD) {} + DbgVariable(const MachineInstr *DbgValue, DwarfDebug *DD) + : Var(DbgValue->getDebugVariable()), TheDIE(nullptr), + DotDebugLocOffset(~0U), MInsn(DbgValue), FrameIndex(~0), DD(DD) {} // Accessors. DIVariable getVariable() const { return Var; } @@ -99,7 +95,6 @@ public: void setDotDebugLocOffset(unsigned O) { DotDebugLocOffset = O; } unsigned getDotDebugLocOffset() const { return DotDebugLocOffset; } StringRef getName() const { return Var.getName(); } - DbgVariable *getAbstractVariable() const { return AbsVar; } const MachineInstr *getMInsn() const { return MInsn; } int getFrameIndex() const { return FrameIndex; } void setFrameIndex(int FI) { FrameIndex = FI; } @@ -347,10 +342,11 @@ class DwarfDebug : public AsmPrinterHandler { DbgVariable *getExistingAbstractVariable(const DIVariable &DV, DIVariable &Cleansed); DbgVariable *getExistingAbstractVariable(const DIVariable &DV); - DbgVariable *createAbstractVariable(DIVariable &DV, LexicalScope *Scope); - DbgVariable *getOrCreateAbstractVariable(DIVariable &Var, - const MDNode *Scope); - DbgVariable *findAbstractVariable(DIVariable &Var, const MDNode *Scope); + void createAbstractVariable(const DIVariable &DV, LexicalScope *Scope); + void ensureAbstractVariableIsCreated(const DIVariable &Var, + const MDNode *Scope); + void ensureAbstractVariableIsCreatedIfScoped(const DIVariable &Var, + const MDNode *Scope); /// \brief Find DIE for the given subprogram and attach appropriate /// DW_AT_low_pc and DW_AT_high_pc attributes. If there are global