summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-11-10 22:34:29 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-11-10 22:34:29 +0000
commit01b55b4a808d04cbff7b62f55eaeb62019340bc0 (patch)
treeb86f0307b14541484419b5d5ed310802f0abca33 /lib
parent950dba04e0ac7a0ae4d47b43b60f620e053ce26b (diff)
downloadllvm-01b55b4a808d04cbff7b62f55eaeb62019340bc0.tar.gz
llvm-01b55b4a808d04cbff7b62f55eaeb62019340bc0.tar.bz2
llvm-01b55b4a808d04cbff7b62f55eaeb62019340bc0.tar.xz
Check in getOrCreateSubprogramDIE if a declaration exists and if so output
it first. This is a more general fix to pr11300. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@144324 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp13
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp12
2 files changed, 12 insertions, 13 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index d440a74619..657763a8fc 100644
--- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -934,6 +934,12 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
if (SPDie)
return SPDie;
+ DISubprogram SPDecl = SP.getFunctionDeclaration();
+ DIE *DeclDie = NULL;
+ if (SPDecl.isSubprogram()) {
+ DeclDie = getOrCreateSubprogramDIE(SPDecl);
+ }
+
SPDie = new DIE(dwarf::DW_TAG_subprogram);
// DW_TAG_inlined_subroutine may refer to this DIE.
@@ -952,8 +958,13 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
// If this DIE is going to refer declaration info using AT_specification
// then there is no need to add other attributes.
- if (SP.getFunctionDeclaration().isSubprogram())
+ if (DeclDie) {
+ // Refer function declaration directly.
+ addDIEEntry(SPDie, dwarf::DW_AT_specification, dwarf::DW_FORM_ref4,
+ DeclDie);
+
return SPDie;
+ }
// Constructors and operators for anonymous aggregates do not have names.
if (!SP.getName().empty())
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index 5d05a3cc3a..581f04bf2b 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -598,20 +598,8 @@ void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
// class type.
return;
- DISubprogram SPDecl = SP.getFunctionDeclaration();
- DIE *DeclDie = NULL;
- if (SPDecl.isSubprogram()) {
- DeclDie = TheCU->getOrCreateSubprogramDIE(SPDecl);
- }
-
DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
- if (DeclDie) {
- // Refer function declaration directly.
- TheCU->addDIEEntry(SubprogramDie, dwarf::DW_AT_specification,
- dwarf::DW_FORM_ref4, DeclDie);
- }
-
// Add to map.
TheCU->insertDIE(N, SubprogramDie);