summaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2014-06-27 05:31:49 +0000
committerDavid Blaikie <dblaikie@gmail.com>2014-06-27 05:31:49 +0000
commit150f5b89206d080955b84d303f78e54864c4070f (patch)
treec1ca4bc53aa05275dd2e93252cfda3876f1a9cad /lib/IR
parenta4e84da0b442bf9413befd6647ed405c2b4a2d96 (diff)
downloadllvm-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.cpp26
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;
}