DebugInfo: Implement MDLocation::getInlinedAtScope()

Write `MDLocation::getInlinedAtScope()` and use it to re-implement
`DebugLoc::getScopeNode()` (and simplify `DISubprogram::Verify()`).
This follows the inlined-at linked list and returns the scope of the
deepest/last location.

llvm-svn: 233568
This commit is contained in:
Duncan P. N. Exon Smith 2015-03-30 17:41:24 +00:00
parent 29e36dc0c6
commit 8f7bc7919b
3 changed files with 12 additions and 6 deletions

View File

@ -949,6 +949,16 @@ public:
return cast_or_null<MDLocation>(getRawInlinedAt());
}
/// \brief Get the scope where this is inlined.
///
/// Walk through \a getInlinedAt() and return \a getScope() from the deepest
/// location.
MDLocalScope *getInlinedAtScope() const {
if (auto *IA = getInlinedAt())
return IA->getInlinedAtScope();
return getScope();
}
Metadata *getRawScope() const { return getOperand(0); }
Metadata *getRawInlinedAt() const {
if (getNumOperands() == 2)

View File

@ -349,9 +349,7 @@ bool DISubprogram::Verify() const {
continue;
// walk the inlined-at scopes
while (MDLocation *IA = DL->getInlinedAt())
DL = IA;
MDScope *Scope = DL->getScope();
MDScope *Scope = DL->getInlinedAtScope();
if (!Scope)
return false;
while (!isa<MDSubprogram>(Scope)) {

View File

@ -33,9 +33,7 @@ void DebugLoc::getScopeAndInlinedAt(MDNode *&Scope, MDNode *&IA) const {
}
MDNode *DebugLoc::getScopeNode() const {
if (MDNode *InlinedAt = getInlinedAt())
return DebugLoc::getFromDILocation(InlinedAt).getScopeNode();
return getScope();
return cast<MDLocation>(Loc)->getInlinedAtScope();
}
DebugLoc DebugLoc::getFnDebugLoc() const {