diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-06-27 05:31:49 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-06-27 05:31:49 +0000 |
commit | 150f5b89206d080955b84d303f78e54864c4070f (patch) | |
tree | c1ca4bc53aa05275dd2e93252cfda3876f1a9cad /lib/IR | |
parent | a4e84da0b442bf9413befd6647ed405c2b4a2d96 (diff) | |
download | llvm-150f5b89206d080955b84d303f78e54864c4070f.tar.gz llvm-150f5b89206d080955b84d303f78e54864c4070f.tar.bz2 llvm-150f5b89206d080955b84d303f78e54864c4070f.tar.xz |
Revert "Revert "PR20038: DebugInfo: Inlined call sites where the caller has debug info but the call itself has no debug location.""
This reverts commit r211724.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211871 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r-- | lib/IR/DebugInfo.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index db9e56defa..2023be313b 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -532,6 +532,32 @@ bool DISubprogram::Verify() const { if (isLValueReference() && isRValueReference()) return false; + 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() == 20; } |