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:
David Blaikie 2014-10-10 06:39:26 +00:00
parent c08f0e3743
commit 43ed8aefd3
4 changed files with 39 additions and 28 deletions

View File

@ -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

View File

@ -120,6 +120,8 @@ public:
void constructSubprogramScopeDIE(LexicalScope *Scope);
DIE *createAndAddScopeChildren(LexicalScope *Scope, DIE &ScopeDIE);
DIE &constructAbstractSubprogramScopeDIE(LexicalScope *Scope);
};
} // end llvm namespace

View File

@ -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 {

View File

@ -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);