forked from OSchip/llvm-project
parent
8e90d221f1
commit
27549023b0
|
@ -137,6 +137,8 @@ LexicalScope *LexicalScopes::findLexicalScope(DebugLoc DL) {
|
|||
/// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc. If
|
||||
/// not available then create new lexical scope.
|
||||
LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) {
|
||||
if (DL.isUnknown())
|
||||
return nullptr;
|
||||
MDNode *Scope = nullptr;
|
||||
MDNode *InlinedAt = nullptr;
|
||||
DL.getScopeAndInlinedAt(Scope, InlinedAt, MF->getFunction()->getContext());
|
||||
|
@ -172,9 +174,12 @@ LexicalScope *LexicalScopes::getOrCreateRegularScope(MDNode *Scope) {
|
|||
std::make_tuple(Parent, DIDescriptor(Scope),
|
||||
nullptr, false)).first;
|
||||
|
||||
if (!Parent && DIDescriptor(Scope).isSubprogram() &&
|
||||
DISubprogram(Scope).describes(MF->getFunction()))
|
||||
if (!Parent) {
|
||||
assert(DIDescriptor(Scope).isSubprogram());
|
||||
assert(DISubprogram(Scope).describes(MF->getFunction()));
|
||||
assert(!CurrentFnLexicalScope);
|
||||
CurrentFnLexicalScope = &I->second;
|
||||
}
|
||||
|
||||
return &I->second;
|
||||
}
|
||||
|
|
|
@ -568,6 +568,34 @@ bool DISubprogram::Verify() const {
|
|||
if (isLValueReference() && isRValueReference())
|
||||
return false;
|
||||
|
||||
// If a DISubprogram has an llvm::Function*, then scope chains from all
|
||||
// instructions within the function should lead to this DISubprogram.
|
||||
if (auto *F = getFunction()) {
|
||||
LLVMContext &Ctxt = F->getContext();
|
||||
for (auto &BB : *F) {
|
||||
for (auto &I : BB) {
|
||||
DebugLoc DL = I.getDebugLoc();
|
||||
if (DL.isUnknown())
|
||||
continue;
|
||||
|
||||
MDNode *Scope = nullptr;
|
||||
MDNode *IA = nullptr;
|
||||
// walk the inlined-at scopes
|
||||
while (DL.getScopeAndInlinedAt(Scope, IA, F->getContext()), IA)
|
||||
DL = DebugLoc::getFromDILocation(IA);
|
||||
DL.getScopeAndInlinedAt(Scope, IA, Ctxt);
|
||||
assert(!IA);
|
||||
while (!DIDescriptor(Scope).isSubprogram()) {
|
||||
DILexicalBlockFile D(Scope);
|
||||
Scope = D.isLexicalBlockFile()
|
||||
? D.getScope()
|
||||
: DebugLoc::getFromDILexicalBlock(Scope).getScope(Ctxt);
|
||||
}
|
||||
if (!DISubprogram(Scope).describes(F))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return DbgNode->getNumOperands() == 9 && getNumHeaderFields() == 12;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue