From: David Blaikie Date: Thu, 9 Oct 2014 20:21:36 +0000 (+0000) Subject: Sink DwarfDebug::constructSubprogramScopeDIE down into DwarfCompileUnit X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=7cb5e0f56d42694c2eda0ce112fe5680779be5f2 Sink DwarfDebug::constructSubprogramScopeDIE down into DwarfCompileUnit git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219436 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 52da4e77411..13bd12ee204 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -569,4 +569,44 @@ DIE *DwarfCompileUnit::createScopeChildrenDIE( return ObjectPointer; } +void DwarfCompileUnit::constructSubprogramScopeDIE(LexicalScope *Scope) { + assert(Scope && Scope->getScopeNode()); + assert(!Scope->getInlinedAt()); + assert(!Scope->isAbstractScope()); + DISubprogram Sub(Scope->getScopeNode()); + + assert(Sub.isSubprogram()); + + DD->getProcessedSPNodes().insert(Sub); + + DIE &ScopeDIE = updateSubprogramScopeDIE(Sub); + + // Collect arguments for current function. + DIE *ObjectPointer = nullptr; + for (DbgVariable *ArgDV : DD->getCurrentFnArguments()) + if (ArgDV) + ScopeDIE.addChild(constructVariableDIE(*ArgDV, *Scope, ObjectPointer)); + + // If this is a variadic function, add an unspecified parameter. + DITypeArray FnArgs = Sub.getType().getTypeArray(); + // If we have a single element of null, it is a function that returns void. + // If we have more than one elements and the last one is null, it is a + // variadic function. + if (FnArgs.getNumElements() > 1 && + !FnArgs.getElement(FnArgs.getNumElements() - 1)) + ScopeDIE.addChild(make_unique(dwarf::DW_TAG_unspecified_parameters)); + + // Collect lexical scope children first. + // ObjectPointer might be a local (non-argument) local variable if it's a + // block's synthetic this pointer. + if (DIE *BlockObjPtr = + DD->createAndAddScopeChildren(*this, Scope, ScopeDIE)) { + assert(!ObjectPointer && "multiple object pointers can't be described"); + ObjectPointer = BlockObjPtr; + } + + if (ObjectPointer) + addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer); +} + } // end llvm namespace diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index b9a8a5ee1c0..fb6a867cc7d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -115,6 +115,9 @@ public: DIE *createScopeChildrenDIE(LexicalScope *Scope, SmallVectorImpl> &Children, unsigned *ChildScopeCount = nullptr); + + /// \brief Construct a DIE for this subprogram scope. + void constructSubprogramScopeDIE(LexicalScope *Scope); }; } // end llvm namespace diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 2b71f845383..49afdf275e3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -384,48 +384,6 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU, SPCU.addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); } -void DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU, - LexicalScope *Scope) { - assert(Scope && Scope->getScopeNode()); - assert(!Scope->getInlinedAt()); - assert(!Scope->isAbstractScope()); - DISubprogram Sub(Scope->getScopeNode()); - - assert(Sub.isSubprogram()); - - ProcessedSPNodes.insert(Sub); - - DIE &ScopeDIE = TheCU.updateSubprogramScopeDIE(Sub); - - // Collect arguments for current function. - assert(LScopes.isCurrentFunctionScope(Scope)); - DIE *ObjectPointer = nullptr; - for (DbgVariable *ArgDV : CurrentFnArguments) - if (ArgDV) - ScopeDIE.addChild( - TheCU.constructVariableDIE(*ArgDV, *Scope, ObjectPointer)); - - // If this is a variadic function, add an unspecified parameter. - DITypeArray FnArgs = Sub.getType().getTypeArray(); - // If we have a single element of null, it is a function that returns void. - // If we have more than one elements and the last one is null, it is a - // variadic function. - if (FnArgs.getNumElements() > 1 && - !FnArgs.getElement(FnArgs.getNumElements() - 1)) - ScopeDIE.addChild(make_unique(dwarf::DW_TAG_unspecified_parameters)); - - // Collect lexical scope children first. - // ObjectPointer might be a local (non-argument) local variable if it's a - // block's synthetic this pointer. - if (DIE *BlockObjPtr = createAndAddScopeChildren(TheCU, Scope, ScopeDIE)) { - assert(!ObjectPointer && "multiple object pointers can't be described"); - ObjectPointer = BlockObjPtr; - } - - if (ObjectPointer) - TheCU.addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer); -} - void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const { if (!GenerateGnuPubSections) return; @@ -1489,7 +1447,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) { constructAbstractSubprogramScopeDIE(TheCU, AScope); } - constructSubprogramScopeDIE(TheCU, FnScope); + TheCU.constructSubprogramScopeDIE(FnScope); // Clear debug info // Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 099b136ad23..7d72602792f 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -349,15 +349,9 @@ class DwarfDebug : public AsmPrinterHandler { void ensureAbstractVariableIsCreatedIfScoped(const DIVariable &Var, const MDNode *Scope); - DIE *createAndAddScopeChildren(DwarfCompileUnit &TheCU, LexicalScope *Scope, - DIE &ScopeDIE); /// \brief Construct a DIE for this abstract scope. void constructAbstractSubprogramScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope); - /// \brief Construct a DIE for this subprogram scope. - void constructSubprogramScopeDIE(DwarfCompileUnit &TheCU, - LexicalScope *Scope); - /// \brief Emit initial Dwarf sections with a label at the start of each one. void emitSectionLabels(); @@ -680,6 +674,17 @@ public: } ScopeVariablesMap &getScopeVariables() { return ScopeVariables; } + + SmallPtrSet &getProcessedSPNodes() { + return ProcessedSPNodes; + } + + SmallVector &getCurrentFnArguments() { + return CurrentFnArguments; + } + + DIE *createAndAddScopeChildren(DwarfCompileUnit &TheCU, LexicalScope *Scope, + DIE &ScopeDIE); }; } // End of namespace llvm