summaryrefslogtreecommitdiff
path: root/lib/CodeGen/AsmPrinter
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2014-05-27 18:37:38 +0000
committerDavid Blaikie <dblaikie@gmail.com>2014-05-27 18:37:38 +0000
commit75325b9f658e1d61d129270ffa5d30bad655d3c4 (patch)
tree7efa813403c6807f7284c2d3a57c2376343bb0ec /lib/CodeGen/AsmPrinter
parent3efc250128c86a4109a24e02f1baf7fba6e168d9 (diff)
downloadllvm-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.cpp24
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfUnit.h2
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);