mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-04 09:37:20 +00:00
Improve explicit memory ownership of DIEs
Now that the subtle constructScopeDIE has been refactored into two functions - one returning memory to take ownership of, one returning a pointer to already owning memory - push unique_ptr through more APIs. I think this completes most of the unique_ptr ownership of DIEs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207442 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
becd8e75b8
commit
7c17e94756
@ -421,12 +421,13 @@ void DwarfDebug::addScopeRangeList(DwarfCompileUnit &TheCU, DIE &ScopeDIE,
|
||||
|
||||
// Construct new DW_TAG_lexical_block for this scope and attach
|
||||
// DW_AT_low_pc/DW_AT_high_pc labels.
|
||||
DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
std::unique_ptr<DIE>
|
||||
DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
if (isLexicalScopeDIENull(Scope))
|
||||
return nullptr;
|
||||
|
||||
DIE *ScopeDIE = new DIE(dwarf::DW_TAG_lexical_block);
|
||||
auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_lexical_block);
|
||||
if (Scope->isAbstractScope())
|
||||
return ScopeDIE;
|
||||
|
||||
@ -454,8 +455,9 @@ DIE *DwarfDebug::constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
|
||||
|
||||
// This scope represents inlined body of a function. Construct DIE to
|
||||
// represent this concrete inlined copy of the function.
|
||||
DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
std::unique_ptr<DIE>
|
||||
DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
|
||||
assert(!ScopeRanges.empty() &&
|
||||
"LexicalScope does not have instruction markers!");
|
||||
@ -470,7 +472,7 @@ DIE *DwarfDebug::constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
|
||||
auto ScopeDIE = make_unique<DIE>(dwarf::DW_TAG_inlined_subroutine);
|
||||
TheCU.addDIEEntry(*ScopeDIE, dwarf::DW_AT_abstract_origin, *OriginDIE);
|
||||
|
||||
// If we have multiple ranges, emit them into the range section.
|
||||
@ -539,8 +541,8 @@ DIE *DwarfDebug::createScopeChildrenDIE(
|
||||
ObjectPointer = Children.back().get();
|
||||
}
|
||||
for (LexicalScope *LS : Scope->getChildren())
|
||||
if (DIE *Nested = constructScopeDIE(TheCU, LS))
|
||||
Children.push_back(std::unique_ptr<DIE>(Nested));
|
||||
if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
|
||||
Children.push_back(std::move(Nested));
|
||||
return ObjectPointer;
|
||||
}
|
||||
|
||||
@ -582,8 +584,8 @@ DIE *DwarfDebug::constructSubprogramScopeDIE(DwarfCompileUnit &TheCU, LexicalSco
|
||||
}
|
||||
|
||||
// Construct a DIE for this scope.
|
||||
DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope) {
|
||||
if (!Scope || !Scope->getScopeNode())
|
||||
return nullptr;
|
||||
|
||||
@ -599,7 +601,7 @@ DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
|
||||
// We try to create the scope DIE first, then the children DIEs. This will
|
||||
// avoid creating un-used children then removing them later when we find out
|
||||
// the scope DIE is null.
|
||||
DIE *ScopeDIE = nullptr;
|
||||
std::unique_ptr<DIE> ScopeDIE;
|
||||
if (Scope->getInlinedAt()) {
|
||||
ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
|
||||
if (!ScopeDIE)
|
||||
@ -629,8 +631,7 @@ DIE *DwarfDebug::constructScopeDIE(DwarfCompileUnit &TheCU,
|
||||
assert(ScopeDIE && "Scope DIE should not be null.");
|
||||
for (ImportedEntityMap::const_iterator i = Range.first; i != Range.second;
|
||||
++i)
|
||||
constructImportedEntityDIE(TheCU, i->second, ScopeDIE);
|
||||
|
||||
constructImportedEntityDIE(TheCU, i->second, *ScopeDIE);
|
||||
}
|
||||
|
||||
// Add children
|
||||
@ -739,11 +740,11 @@ void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
DIImportedEntity Module(N);
|
||||
assert(Module.Verify());
|
||||
if (DIE *D = TheCU.getOrCreateContextDIE(Module.getContext()))
|
||||
constructImportedEntityDIE(TheCU, Module, D);
|
||||
constructImportedEntityDIE(TheCU, Module, *D);
|
||||
}
|
||||
|
||||
void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
const MDNode *N, DIE *Context) {
|
||||
const MDNode *N, DIE &Context) {
|
||||
DIImportedEntity Module(N);
|
||||
assert(Module.Verify());
|
||||
return constructImportedEntityDIE(TheCU, Module, Context);
|
||||
@ -751,11 +752,10 @@ void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
|
||||
void DwarfDebug::constructImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
const DIImportedEntity &Module,
|
||||
DIE *Context) {
|
||||
DIE &Context) {
|
||||
assert(Module.Verify() &&
|
||||
"Use one of the MDNode * overloads to handle invalid metadata");
|
||||
assert(Context && "Should always have a context for an imported_module");
|
||||
DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), *Context, Module);
|
||||
DIE &IMDie = TheCU.createAndAddDIE(Module.getTag(), Context, Module);
|
||||
DIE *EntityDie;
|
||||
DIDescriptor Entity = resolve(Module.getEntity());
|
||||
if (Entity.isNameSpace())
|
||||
|
@ -359,14 +359,17 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
|
||||
/// \brief Construct new DW_TAG_lexical_block for this scope and
|
||||
/// attach DW_AT_low_pc/DW_AT_high_pc labels.
|
||||
DIE *constructLexicalScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope);
|
||||
std::unique_ptr<DIE> constructLexicalScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope);
|
||||
|
||||
/// \brief This scope represents inlined body of a function. Construct
|
||||
/// DIE to represent this concrete inlined copy of the function.
|
||||
DIE *constructInlinedScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope);
|
||||
std::unique_ptr<DIE> constructInlinedScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope);
|
||||
|
||||
/// \brief Construct a DIE for this scope.
|
||||
DIE *constructScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope);
|
||||
std::unique_ptr<DIE> constructScopeDIE(DwarfCompileUnit &TheCU,
|
||||
LexicalScope *Scope);
|
||||
/// \brief Construct a DIE for this scope.
|
||||
DIE *constructSubprogramScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope);
|
||||
/// A helper function to create children of a Scope DIE.
|
||||
@ -496,11 +499,11 @@ class DwarfDebug : public AsmPrinterHandler {
|
||||
|
||||
/// \brief Construct import_module DIE.
|
||||
void constructImportedEntityDIE(DwarfCompileUnit &TheCU, const MDNode *N,
|
||||
DIE *Context);
|
||||
DIE &Context);
|
||||
|
||||
/// \brief Construct import_module DIE.
|
||||
void constructImportedEntityDIE(DwarfCompileUnit &TheCU,
|
||||
const DIImportedEntity &Module, DIE *Context);
|
||||
const DIImportedEntity &Module, DIE &Context);
|
||||
|
||||
/// \brief Register a source line with debug info. Returns the unique
|
||||
/// label that was emitted and which provides correspondence to the
|
||||
|
Loading…
x
Reference in New Issue
Block a user