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 | 75325b9f658e1d61d129270ffa5d30bad655d3c4 (patch) | |
tree | 7efa813403c6807f7284c2d3a57c2376343bb0ec /lib/CodeGen/AsmPrinter | |
parent | 3efc250128c86a4109a24e02f1baf7fba6e168d9 (diff) | |
download | llvm-75325b9f658e1d61d129270ffa5d30bad655d3c4.tar.gz llvm-75325b9f658e1d61d129270ffa5d30bad655d3c4.tar.bz2 llvm-75325b9f658e1d61d129270ffa5d30bad655d3c4.tar.xz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209673 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 24 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfUnit.h | 2 |
2 files changed, 17 insertions, 9 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 8d8c6181e1..c6e47ec072 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/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/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index e44f256c3a..7025b712f0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/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); |