mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user