mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
One MDNode may be used to create regular DIE as well as abstract DIE.
Keep track of abstract subprogram DIEs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107822 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bcc8017c73
commit
8aa61477e3
@ -1389,6 +1389,7 @@ static bool isSubprogramContext(const MDNode *Context) {
|
||||
DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
|
||||
CompileUnit *SPCU = getCompileUnit(SPNode);
|
||||
DIE *SPDie = SPCU->getDIE(SPNode);
|
||||
|
||||
assert(SPDie && "Unable to find subprogram DIE!");
|
||||
DISubprogram SP(SPNode);
|
||||
|
||||
@ -1422,6 +1423,14 @@ DIE *DwarfDebug::updateSubprogramScopeDIE(const MDNode *SPNode) {
|
||||
SPCU->addDie(SPDie);
|
||||
}
|
||||
|
||||
// Pick up abstract subprogram DIE.
|
||||
if (DIE *AbsSPDIE = AbstractSPDies.lookup(SPNode)) {
|
||||
SPDie = new DIE(dwarf::DW_TAG_subprogram);
|
||||
addDIEEntry(SPDie, dwarf::DW_AT_abstract_origin,
|
||||
dwarf::DW_FORM_ref4, AbsSPDIE);
|
||||
SPCU->addDie(SPDie);
|
||||
}
|
||||
|
||||
addLabel(SPDie, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr,
|
||||
Asm->GetTempSymbol("func_begin", Asm->getFunctionNumber()));
|
||||
addLabel(SPDie, dwarf::DW_AT_high_pc, dwarf::DW_FORM_addr,
|
||||
@ -1695,8 +1704,12 @@ DIE *DwarfDebug::constructScopeDIE(DbgScope *Scope) {
|
||||
ScopeDIE = constructInlinedScopeDIE(Scope);
|
||||
else if (DS.isSubprogram()) {
|
||||
ProcessedSPNodes.insert(DS);
|
||||
if (Scope->isAbstractScope())
|
||||
if (Scope->isAbstractScope()) {
|
||||
ScopeDIE = getCompileUnit(DS)->getDIE(DS);
|
||||
// Note down abstract DIE.
|
||||
if (ScopeDIE)
|
||||
AbstractSPDies.insert(std::make_pair(DS, ScopeDIE));
|
||||
}
|
||||
else
|
||||
ScopeDIE = updateSubprogramScopeDIE(DS);
|
||||
}
|
||||
|
@ -156,6 +156,9 @@ class DwarfDebug {
|
||||
/// not included DbgScopeMap. AbstractScopes owns its DbgScope*s.
|
||||
DenseMap<const MDNode *, DbgScope *> AbstractScopes;
|
||||
|
||||
/// AbstractSPDies - Collection of abstract subprogram DIEs.
|
||||
DenseMap<const MDNode *, DIE *> AbstractSPDies;
|
||||
|
||||
/// AbstractScopesList - Tracks abstract scopes constructed while processing
|
||||
/// a function. This list is cleared during endFunction().
|
||||
SmallVector<DbgScope *, 4>AbstractScopesList;
|
||||
|
Loading…
Reference in New Issue
Block a user