forked from OSchip/llvm-project
When we're updating the subprogram scope DIE, we want to determine if we're
updating an abstract DIE or not. If we are, then we use that. Its children will be added on later, as well as the object pointer attribute. Otherwise, this function may be called with a concrete DIE twice and adding the children and object pointer attribute to it twice. <rdar://problem/12401423&12600340> llvm-svn: 167524
This commit is contained in:
parent
a1046ece32
commit
d9bb9b611b
|
@ -307,6 +307,13 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
|
|||
assert(SPDie && "Unable to find subprogram DIE!");
|
||||
DISubprogram SP(SPNode);
|
||||
|
||||
// Pick up abstract subprogram DIE.
|
||||
if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
|
||||
SPDie = new DIE(dwarf::DW_TAG_subprogram);
|
||||
SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
|
||||
dwarf::DW_FORM_ref4, AbsSPDIE);
|
||||
SPCU->addDie(SPDie);
|
||||
} else {
|
||||
DISubprogram SPDecl = SP.getFunctionDeclaration();
|
||||
if (!SPDecl.isSubprogram()) {
|
||||
// There is not any need to generate specification DIE for a function
|
||||
|
@ -342,12 +349,6 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(CompileUnit *SPCU,
|
|||
SPCU->addDie(SPDie);
|
||||
}
|
||||
}
|
||||
// Pick up abstract subprogram DIE.
|
||||
if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
|
||||
SPDie = new DIE(dwarf::DW_TAG_subprogram);
|
||||
SPCU->addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
|
||||
dwarf::DW_FORM_ref4, AbsSPDIE);
|
||||
SPCU->addDie(SPDie);
|
||||
}
|
||||
|
||||
SPCU->addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
|
||||
|
|
Loading…
Reference in New Issue