/// 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());
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;
}
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;
}