summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/Verifier.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2016-03-28 21:06:26 +0000
committerAdrian Prantl <aprantl@apple.com>2016-03-28 21:06:26 +0000
commitfaebbb053d4971a68d10df9a4f3d5db5aeed0afd (patch)
tree77cb00300206f881742871634dfc12bf33f5146c /llvm/lib/IR/Verifier.cpp
parent64fa75391cba60721f7b4d07e6fe6126b76809a5 (diff)
downloadbcm5719-llvm-faebbb053d4971a68d10df9a4f3d5db5aeed0afd.tar.gz
bcm5719-llvm-faebbb053d4971a68d10df9a4f3d5db5aeed0afd.zip
Add an IR Verifier check for orphaned DICompileUnits.
A DICompileUnit that is not listed in llvm.dbg.cu will cause assertion failures and/or crashes in the backend. The Verifier should reject this. rdar://problem/25369499 llvm-svn: 264657
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r--llvm/lib/IR/Verifier.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 0cd24633499..a6f2306996f 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -196,6 +196,9 @@ class Verifier : public InstVisitor<Verifier>, VerifierSupport {
/// \brief Keep track of the metadata nodes that have been checked already.
SmallPtrSet<const Metadata *, 32> MDNodes;
+ /// Track all DICompileUnits visited.
+ SmallPtrSet<const Metadata *, 2> CUVisited;
+
/// \brief Track unresolved string-based type references.
SmallDenseMap<const MDString *, const MDNode *, 32> UnresolvedTypeRefs;
@@ -302,7 +305,9 @@ public:
visitModuleFlags(M);
visitModuleIdents(M);
- // Verify type referneces last.
+ verifyCompileUnits();
+
+ // Verify type references last.
verifyTypeRefs();
return !Broken;
@@ -444,12 +449,15 @@ private:
void verifyFrameRecoverIndices();
void verifySiblingFuncletUnwinds();
- // Module-level debug info verification...
+ /// @{
+ /// Module-level debug info verification...
void verifyTypeRefs();
+ void verifyCompileUnits();
template <class MapTy>
void verifyBitPieceExpression(const DbgInfoIntrinsic &I,
const MapTy &TypeRefs);
void visitUnresolvedTypeRef(const MDString *S, const MDNode *N);
+ /// @}
};
} // End anonymous namespace
@@ -969,6 +977,7 @@ void Verifier::visitDICompileUnit(const DICompileUnit &N) {
Assert(Op && isa<DIMacroNode>(Op), "invalid macro ref", &N, Op);
}
}
+ CUVisited.insert(&N);
}
void Verifier::visitDISubprogram(const DISubprogram &N) {
@@ -4251,6 +4260,18 @@ void Verifier::visitUnresolvedTypeRef(const MDString *S, const MDNode *N) {
Assert(false, "unresolved type ref", S, N);
}
+void Verifier::verifyCompileUnits() {
+ auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
+ SmallPtrSet<const Metadata *, 2> Listed;
+ if (CUs)
+ Listed.insert(CUs->op_begin(), CUs->op_end());
+ Assert(
+ std::all_of(CUVisited.begin(), CUVisited.end(),
+ [&Listed](const Metadata *CU) { return Listed.count(CU); }),
+ "All DICompileUnits must be listed in llvm.dbg.cu");
+ CUVisited.clear();
+}
+
void Verifier::verifyTypeRefs() {
auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
if (!CUs)
OpenPOWER on IntegriCloud