mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
Sink most of DwarfDebug::constructAbstractSubprogramScopeDIE down into DwarfCompileUnit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219476 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c08f0e3743
commit
43ed8aefd3
@ -621,4 +621,33 @@ DIE *DwarfCompileUnit::createAndAddScopeChildren(LexicalScope *Scope,
|
||||
return ObjectPointer;
|
||||
}
|
||||
|
||||
DIE &
|
||||
DwarfCompileUnit::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
DISubprogram SP(Scope->getScopeNode());
|
||||
|
||||
DIE *ContextDIE;
|
||||
|
||||
// Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
|
||||
// the important distinction that the DIDescriptor is not associated with the
|
||||
// DIE (since the DIDescriptor will be associated with the concrete DIE, if
|
||||
// any). It could be refactored to some common utility function.
|
||||
if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
|
||||
ContextDIE = &getUnitDie();
|
||||
getOrCreateSubprogramDIE(SPDecl);
|
||||
} else
|
||||
ContextDIE = getOrCreateContextDIE(resolve(SP.getContext()));
|
||||
|
||||
// Passing null as the associated DIDescriptor because the abstract definition
|
||||
// shouldn't be found by lookup.
|
||||
DIE &AbsDef =
|
||||
createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE, DIDescriptor());
|
||||
applySubprogramAttributesToDefinition(SP, AbsDef);
|
||||
|
||||
if (getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
|
||||
addUInt(AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, AbsDef))
|
||||
addDIEEntry(AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
|
||||
return AbsDef;
|
||||
}
|
||||
|
||||
} // end llvm namespace
|
||||
|
@ -120,6 +120,8 @@ public:
|
||||
void constructSubprogramScopeDIE(LexicalScope *Scope);
|
||||
|
||||
DIE *createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE);
|
||||
|
||||
DIE &constructAbstractSubprogramScopeDIE(LexicalScope *Scope);
|
||||
};
|
||||
|
||||
} // end llvm namespace
|
||||
|
@ -335,7 +335,7 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
assert(Scope->isAbstractScope());
|
||||
assert(!Scope->getInlinedAt());
|
||||
|
||||
DISubprogram SP(Scope->getScopeNode());
|
||||
const MDNode *SP = Scope->getScopeNode();
|
||||
|
||||
DIE *&AbsDef = AbstractSPDies[SP];
|
||||
if (AbsDef)
|
||||
@ -346,28 +346,8 @@ void DwarfDebug::constructAbstractSubprogramScopeDIE(LexicalScope *Scope) {
|
||||
// Find the subprogram's DwarfCompileUnit in the SPMap in case the subprogram
|
||||
// was inlined from another compile unit.
|
||||
DwarfCompileUnit &SPCU = *SPMap[SP];
|
||||
DIE *ContextDIE;
|
||||
|
||||
// Some of this is duplicated from DwarfUnit::getOrCreateSubprogramDIE, with
|
||||
// the important distinction that the DIDescriptor is not associated with the
|
||||
// DIE (since the DIDescriptor will be associated with the concrete DIE, if
|
||||
// any). It could be refactored to some common utility function.
|
||||
if (DISubprogram SPDecl = SP.getFunctionDeclaration()) {
|
||||
ContextDIE = &SPCU.getUnitDie();
|
||||
SPCU.getOrCreateSubprogramDIE(SPDecl);
|
||||
} else
|
||||
ContextDIE = SPCU.getOrCreateContextDIE(resolve(SP.getContext()));
|
||||
|
||||
// Passing null as the associated DIDescriptor because the abstract definition
|
||||
// shouldn't be found by lookup.
|
||||
AbsDef = &SPCU.createAndAddDIE(dwarf::DW_TAG_subprogram, *ContextDIE,
|
||||
DIDescriptor());
|
||||
SPCU.applySubprogramAttributesToDefinition(SP, *AbsDef);
|
||||
|
||||
if (SPCU.getCUNode().getEmissionKind() != DIBuilder::LineTablesOnly)
|
||||
SPCU.addUInt(*AbsDef, dwarf::DW_AT_inline, None, dwarf::DW_INL_inlined);
|
||||
if (DIE *ObjectPointer = SPCU.createAndAddScopeChildren(Scope, *AbsDef))
|
||||
SPCU.addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);
|
||||
AbsDef = &SPCU.constructAbstractSubprogramScopeDIE(Scope);
|
||||
}
|
||||
|
||||
void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
|
||||
|
@ -444,6 +444,12 @@ protected:
|
||||
/// none currently exists, create a new ID and insert it in the line table.
|
||||
virtual unsigned getOrCreateSourceID(StringRef File, StringRef Directory) = 0;
|
||||
|
||||
/// resolve - Look in the DwarfDebug map for the MDNode that
|
||||
/// corresponds to the reference.
|
||||
template <typename T> T resolve(DIRef<T> Ref) const {
|
||||
return DD->resolve(Ref);
|
||||
}
|
||||
|
||||
private:
|
||||
/// constructTypeDIE - Construct basic type die from DIBasicType.
|
||||
void constructTypeDIE(DIE &Buffer, DIBasicType BTy);
|
||||
@ -499,12 +505,6 @@ private:
|
||||
/// information entry.
|
||||
DIEEntry *createDIEEntry(DIE &Entry);
|
||||
|
||||
/// resolve - Look in the DwarfDebug map for the MDNode that
|
||||
/// corresponds to the reference.
|
||||
template <typename T> T resolve(DIRef<T> Ref) const {
|
||||
return DD->resolve(Ref);
|
||||
}
|
||||
|
||||
/// If this is a named finished type then include it in the list of types for
|
||||
/// the accelerator tables.
|
||||
void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE &TyDIE);
|
||||
|
Loading…
Reference in New Issue
Block a user