diff options
author | Adrian Prantl <aprantl@apple.com> | 2016-03-28 21:06:26 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2016-03-28 21:06:26 +0000 |
commit | faebbb053d4971a68d10df9a4f3d5db5aeed0afd (patch) | |
tree | 77cb00300206f881742871634dfc12bf33f5146c /llvm/lib/IR/Verifier.cpp | |
parent | 64fa75391cba60721f7b4d07e6fe6126b76809a5 (diff) | |
download | bcm5719-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.cpp | 25 |
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) |