diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-05-27 18:37:38 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-05-27 18:37:38 +0000 |
commit | 7f91686f07df6adfe101b8835d01aa8e32128c6c (patch) | |
tree | af530bf4638128c1fd99978ede92d1873bf6840b /llvm/lib/CodeGen/AsmPrinter | |
parent | 0c1c3113e80a30ac86a0d061e8e5fb860e5b0aff (diff) | |
download | bcm5719-llvm-7f91686f07df6adfe101b8835d01aa8e32128c6c.tar.gz bcm5719-llvm-7f91686f07df6adfe101b8835d01aa8e32128c6c.zip |
DebugInfo: Separate out the addition of subprogram attribute additions so that they can be added later depending on whether or not the function is inlined.
llvm-svn: 209673
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 24 | ||||
-rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h | 2 |
2 files changed, 17 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 8d8c6181e1d..c6e47ec0720 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1374,24 +1374,32 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) { // Construct the context before querying for the existence of the DIE in case // such construction creates the DIE (as is the case for member function // declarations). - DIScope Context = resolve(SP.getContext()); - DIE *ContextDIE = getOrCreateContextDIE(Context); + DIE *ContextDIE = getOrCreateContextDIE(resolve(SP.getContext())); if (DIE *SPDie = getDIE(SP)) return SPDie; - DIE *DeclDie = nullptr; - StringRef DeclLinkageName; if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { // Add subprogram definitions to the CU die directly. ContextDIE = &getUnitDie(); - DeclDie = getOrCreateSubprogramDIE(SPDecl); - DeclLinkageName = SPDecl.getLinkageName(); + // Build the decl now to ensure it preceeds the definition. + getOrCreateSubprogramDIE(SPDecl); } // DW_TAG_inlined_subroutine may refer to this DIE. DIE &SPDie = createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, SP); + applySubprogramAttributes(SP, SPDie); + return &SPDie; +} + +void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie) { + DIE *DeclDie = nullptr; + StringRef DeclLinkageName; + if (DISubprogram SPDecl = SP.getFunctionDeclaration()) { + DeclDie = getOrCreateSubprogramDIE(SPDecl); + DeclLinkageName = SPDecl.getLinkageName(); + } // Add function template parameters. addTemplateParams(SPDie, SP.getTemplateParams()); @@ -1409,7 +1417,7 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) { // Refer to the function declaration where all the other attributes will be // found. addDIEEntry(SPDie, dwarf::DW_AT_specification, *DeclDie); - return &SPDie; + return; } // Constructors and operators for anonymous aggregates do not have names. @@ -1486,8 +1494,6 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) { if (SP.isExplicit()) addFlag(SPDie, dwarf::DW_AT_explicit); - - return &SPDie; } // Return const expression if value is a GEP to access merged global diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h index e44f256c3a3..7025b712f0e 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -401,6 +401,8 @@ public: /// getOrCreateSubprogramDIE - Create new DIE using SP. DIE *getOrCreateSubprogramDIE(DISubprogram SP); + void applySubprogramAttributes(DISubprogram SP, DIE &SPDie); + /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the /// given DIType. DIE *getOrCreateTypeDIE(const MDNode *N); |