mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-27 14:24:40 +00:00
Revise debug info machinery to digest nested functions and classes.
A certain GDB testsuite case (local.cc) has a function nested inside a class nested inside another function. GCC presents the innermost function to llvm-convert first. Heretofore, the debug info mistakenly placed the inner function at module scope. This patch walks the GCC context links and instantiates the outer class and function so the debug info is properly nested. Radar 7426545. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100530 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -800,12 +800,26 @@ void DwarfDebug::addToContextOwner(DIE *Die, DIDescriptor Context) {
|
||||
} else if (Context.isNameSpace()) {
|
||||
DIE *ContextDIE = getOrCreateNameSpace(DINameSpace(Context.getNode()));
|
||||
ContextDIE->addChild(Die);
|
||||
} else if (Context.isSubprogram()) {
|
||||
DIE *ContextDIE = createSubprogramDIE(DISubprogram(Context.getNode()),
|
||||
/*MakeDecl=*/false);
|
||||
ContextDIE->addChild(Die);
|
||||
} else if (DIE *ContextDIE = ModuleCU->getDIE(Context.getNode()))
|
||||
ContextDIE->addChild(Die);
|
||||
else
|
||||
ModuleCU->addDie(Die);
|
||||
}
|
||||
|
||||
/// isFunctionContext - True if given Context is nested within a function.
|
||||
bool DwarfDebug::isFunctionContext(DIE *context) {
|
||||
if (context == (DIE *)0)
|
||||
return false;
|
||||
if (context->getTag() == dwarf::DW_TAG_subprogram)
|
||||
return true;
|
||||
else
|
||||
return isFunctionContext(context->getParent());
|
||||
}
|
||||
|
||||
/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
|
||||
/// given DIType.
|
||||
DIE *DwarfDebug::getOrCreateTypeDIE(DIType Ty) {
|
||||
@ -987,6 +1001,10 @@ void DwarfDebug::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
||||
if (DIDescriptor(ContainingType.getNode()).isCompositeType())
|
||||
addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4,
|
||||
getOrCreateTypeDIE(DIType(ContainingType.getNode())));
|
||||
else {
|
||||
DIDescriptor Context = CTy.getContext();
|
||||
addToContextOwner(&Buffer, Context);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -1802,19 +1820,15 @@ void DwarfDebug::constructGlobalVariableDIE(MDNode *N) {
|
||||
void DwarfDebug::constructSubprogramDIE(MDNode *N) {
|
||||
DISubprogram SP(N);
|
||||
|
||||
// Check for pre-existence.
|
||||
if (ModuleCU->getDIE(N))
|
||||
return;
|
||||
|
||||
if (!SP.isDefinition())
|
||||
// This is a method declaration which will be handled while constructing
|
||||
// class type.
|
||||
return;
|
||||
|
||||
DIE *SubprogramDie = createSubprogramDIE(SP);
|
||||
|
||||
// Add to map.
|
||||
ModuleCU->insertDIE(N, SubprogramDie);
|
||||
// Check for pre-existence.
|
||||
DIE *SubprogramDie = ModuleCU->getDIE(N);
|
||||
if (!SubprogramDie)
|
||||
SubprogramDie = createSubprogramDIE(SP);
|
||||
|
||||
// Add to context owner.
|
||||
addToContextOwner(SubprogramDie, SP.getContext());
|
||||
|
Reference in New Issue
Block a user