Support for nested functions/classes in debug output. Radar 7424645.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105492 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Stuart Hastings
2010-06-04 22:36:03 +00:00
parent 93031ac032
commit 0f1b813567
4 changed files with 44 additions and 21 deletions

View File

@@ -866,6 +866,10 @@ void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
} else if (Context.isNameSpace()) {
DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context));
ContextDIE->addChild(Die);
} else if (Context.isSubprogram()) {
DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context),
/*MakeDecl=*/false);
ContextDIE->addChild(Die);
} else if (DIE *ContextDIE = getCompileUnit(Context)->getDIE(Context))
ContextDIE->addChild(Die);
else
@@ -1055,6 +1059,10 @@ void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
if (DIDescriptor(ContainingType).isCompositeType())
addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
getOrCreateTypeDIE(DIType(ContainingType)));
else {
DIDescriptor Context = CTy.getContext();
addToContextOwner(&Buffer, Context);
}
break;
}
default:
@@ -1329,6 +1337,9 @@ DIE *DwarfDebug::createSubprogramDIE(const DISubprogram &SP, bool MakeDecl) {
// DW_TAG_inlined_subroutine may refer to this DIE.
SPCU->insertDIE(SP, SPDie);
// Add to context owner.
addToContextOwner(SPDie, SP.getContext());
return SPDie;
}
@@ -2341,8 +2352,14 @@ DbgScope *DwarfDebug::getOrCreateDbgScope(const MDNode *Scope, const MDNode *Inl
}
if (!WScope->getParent()) {
// The SPName check is the "old way," kept here for backwards
// compatibility with the existing .ll test cases in the LLVM
// test suite. The debug info for some functions omits any
// linkage name because it confuses GDB. Updated front-ends
// should include a Function * that we can check instead.
StringRef SPName = DISubprogram(Scope).getLinkageName();
if (SPName == Asm->MF->getFunction()->getName())
if ((SPName == Asm->MF->getFunction()->getName()) ||
(DISubprogram(Scope).getFunction() == Asm->MF->getFunction()))
CurrentFnDbgScope = WScope;
}