From 08f8f21b91e4a805ea71f48c1b04795a14da0f75 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Fri, 8 Apr 2016 00:01:32 +0000 Subject: [PATCH] [IR/Verifier] Fix (yet another) crash. We need to check that if we reference a retainedType from DICompileUnit we're actually referencing a DICompositeType. llvm-svn: 265752 --- llvm/lib/IR/Verifier.cpp | 22 ++++++++++++++-------- llvm/test/Verifier/dbg-invalid-retaintypes.ll | 10 ++++++++++ 2 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 llvm/test/Verifier/dbg-invalid-retaintypes.ll diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index fc9cc7d..abb0e9b 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4380,14 +4380,20 @@ void Verifier::verifyTypeRefs() { // Visit all the compile units again to map the type references. SmallDenseMap TypeRefs; - for (auto *MD : CUs->operands()) - if (auto *CU = dyn_cast(MD)) - for (DIType *Op : CU->getRetainedTypes()) - if (auto *T = dyn_cast_or_null(Op)) - if (auto *S = T->getRawIdentifier()) { - UnresolvedTypeRefs.erase(S); - TypeRefs.insert(std::make_pair(S, T)); - } + for (auto *MD : CUs->operands()) { + auto *CU = dyn_cast(MD); + if (!CU) + continue; + auto *Array = CU->getRawRetainedTypes(); + if (!Array || !isa(Array)) + continue; + for (DIType *Op : CU->getRetainedTypes()) + if (auto *T = dyn_cast_or_null(Op)) + if (auto *S = T->getRawIdentifier()) { + UnresolvedTypeRefs.erase(S); + TypeRefs.insert(std::make_pair(S, T)); + } + } // Verify debug info intrinsic bit piece expressions. This needs a second // pass through the intructions, since we haven't built TypeRefs yet when diff --git a/llvm/test/Verifier/dbg-invalid-retaintypes.ll b/llvm/test/Verifier/dbg-invalid-retaintypes.ll new file mode 100644 index 0000000..fa14ae8 --- /dev/null +++ b/llvm/test/Verifier/dbg-invalid-retaintypes.ll @@ -0,0 +1,10 @@ +; RUN: not llvm-as -disable-output <%s 2>&1 | FileCheck %s +; CHECK: assembly parsed, but does not verify + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.0 (trunk 131941)", isOptimized: true, emissionKind: FullDebug, file: !2, retainedTypes: !1) +!1 = distinct !DISubprogram(name: "main", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 1, scope: !2) +!2 = !DIFile(filename: "/davide/test", directory: "/") +!3 = !{i32 1, !"Debug Info Version", i32 3} -- 2.7.4