From 43ed8aefd3b11630f66d262db2fcb2cfbf2e09bf Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Fri, 10 Oct 2014 06:39:26 +0000 Subject: [PATCH] Sink most of DwarfDebug::constructAbstractSubprogramScopeDIE down into DwarfCompileUnit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219476 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 29 +++++++++++++++++++++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.h | 2 ++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 26 +++--------------- lib/CodeGen/AsmPrinter/DwarfUnit.h | 12 ++++----- 4 files changed, 40 insertions(+), 29 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index ec5c2ba399e..617df1b762f 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -621,4 +621,33 @@ DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope, return ObjectPointer; } +DIE & +DwarfCompileUnit::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) { + DISubprogram SP(Scope->getScopeNode()); + + DIE *ContextDIE; + + // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with + // the important distinction that the DIDescriptor is not associated with the + // DIE (since the DIDescriptor will be associated with the concrete DIE, if + // any). It could be refactored to some common utility function. + if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { + ContextDIE = &getUnitDie(); + getOrCreateSubprogramDIE(SPDecl); + } else + ContextDIE = getOrCreateContextDIE(resolve(SP.getContext())); + + // Passing null as the associated DIDescriptor because the abstract definition + // shouldn't be found by lookup. + DIE &AbsDef = + createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, DIDescriptor()); + applySubprogramAttributesToDefinition(SP, AbsDef); + + if (getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly) + addUInt(AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); + if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, AbsDef)) + addDIEEntry(AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); + return AbsDef; +} + } // end llvm namespace diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index 9b97a51d371..caa6efc121d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -120,6 +120,8 @@ public: void constructSubprogramScopeDIE(LexicalScope *Scope); DIE *createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE); + + DIE &constructAbstractSubprogramScopeDIE(LexicalScope *Scope); }; } // end llvm namespace diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index b461674ad63..a02118566bc 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -335,7 +335,7 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) { assert(Scope->isAbstractScope()); assert(!Scope->getInlinedAt()); - DISubprogram SP(Scope->getScopeNode()); + const MDNode *SP = Scope->getScopeNode(); DIE *&AbsDef = AbstractSPDies[SP]; if (AbsDef) @@ -346,28 +346,8 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) { // Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram // was inlined from another compile unit. DwarfCompileUnit &SPCU = *SPMap[SP]; - DIE *ContextDIE; - - // Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with - // the important distinction that the DIDescriptor is not associated with the - // DIE (since the DIDescriptor will be associated with the concrete DIE, if - // any). It could be refactored to some common utility function. - if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { - ContextDIE = &SPCU.getUnitDie(); - SPCU.getOrCreateSubprogramDIE(SPDecl); - } else - ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext())); - - // Passing null as the associated DIDescriptor because the abstract definition - // shouldn't be found by lookup. - AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, - DIDescriptor()); - SPCU.applySubprogramAttributesToDefinition(SP, *AbsDef); - - if (SPCU.getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly) - SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined); - if (DIE *ObjectPointer = SPCU.createAndAddScopeChildren(Scope, *AbsDef)) - SPCU.addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer); + + AbsDef = &SPCU.constructAbstractSubprogramScopeDIE(Scope); } void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const { diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index b8029c37246..8c5e1528e5c 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -444,6 +444,12 @@ protected: /// none currently exists, create a new ID and insert it in the line table. virtual unsigned getOrCreateSourceID(StringRef File, StringRef Directory) = 0; + /// resolve - Look in the DwarfDebug map for the MDNode that + /// corresponds to the reference. + template T resolve(DIRef Ref) const { + return DD->resolve(Ref); + } + private: /// constructTypeDIE - Construct basic type die from DIBasicType. void constructTypeDIE(DIE &Buffer, DIBasicType BTy); @@ -499,12 +505,6 @@ private: /// information entry. DIEEntry *createDIEEntry(DIE &Entry); - /// resolve - Look in the DwarfDebug map for the MDNode that - /// corresponds to the reference. - template T resolve(DIRef Ref) const { - return DD->resolve(Ref); - } - /// If this is a named finished type then include it in the list of types for /// the accelerator tables. void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE &TyDIE); -- 2.34.1