From d94d5bbbf91589aafbf9c902f3839d3a51db6484 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 20 Mar 2015 19:26:58 +0000 Subject: [PATCH] Verifier: Check that !dbg attachments have the right type A WIP patch makes `DIDescriptor` accessors more strict, which in turn causes the `DebugInfoFinder` to crash on wrongly typed `!dbg` attachments. Catch that error up front in `Verifier::visitInstruction()`. Also remove a test that we "handle" invalid `!dbg` attachments, added back in r99938. We don't want to handle those anymore. Note: I'm *not* recursing and verifying the debug info graph reachable from this node; that work is already done by `verifyDebugInfo()`. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232834 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Verifier.cpp | 7 ++++ .../2010-03-30-InvalidDbgInfoCrash.ll | 36 ------------------- test/DebugInfo/location-verifier.ll | 2 +- test/Verifier/dbg.ll | 12 +++++++ 4 files changed, 20 insertions(+), 37 deletions(-) delete mode 100644 test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll create mode 100644 test/Verifier/dbg.ll diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index ce765b14420..4f0e3388d58 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -2556,6 +2556,13 @@ void Verifier::visitInstruction(Instruction &I) { &I); } + // Don't recurse into !dbg attachments (leave that for verifyDebugInfo()), + // but at least check that it's a legal type. + if (MDNode *N = I.getDebugLoc().getAsMDNode()) { + Assert(isa(N), + "invalid !dbg metadata attachment", &I, N); + } + InstsInThisBlock.insert(&I); } diff --git a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll b/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll deleted file mode 100644 index 8bc6c6a0b3a..00000000000 --- a/test/DebugInfo/2010-03-30-InvalidDbgInfoCrash.ll +++ /dev/null @@ -1,36 +0,0 @@ -; RUN: llc < %s -o /dev/null - -define void @baz(i32 %i) nounwind ssp { -entry: - call void @llvm.dbg.declare(metadata !0, metadata !1, metadata !MDExpression()), !dbg !0 - ret void, !dbg !0 -} - -declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone - -!llvm.dbg.cu = !{!5} -!llvm.module.flags = !{!22} - -!0 = !{{ [0 x i8] }** undef} -!1 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "x", line: 11, scope: !2, file: !4, type: !9) -!2 = distinct !MDLexicalBlock(line: 8, column: 0, file: !20, scope: !3) -!3 = !MDSubprogram(name: "baz", linkageName: "baz", line: 8, isLocal: true, isDefinition: true, virtualIndex: 6, isOptimized: false, file: !20, scope: null, type: !6) -!4 = !MDFile(filename: "2007-12-VarArrayDebug.c", directory: "/Users/sabre/llvm/test/FrontendC/") -!5 = !MDCompileUnit(language: DW_LANG_C89, producer: "4.2.1 (Based on Apple Inc. build 5658) (LLVM build)", isOptimized: true, emissionKind: 0, file: !20, enums: !21, retainedTypes: !21) -!6 = !MDSubroutineType(types: !7) -!7 = !{null, !8} -!8 = !MDBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) -!9 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, file: !20, scope: !4, baseType: !10) -!10 = !MDCompositeType(tag: DW_TAG_structure_type, line: 11, size: 8, align: 8, file: !20, scope: !3, elements: !11) -!11 = !{!12} -!12 = !MDDerivedType(tag: DW_TAG_member, name: "b", line: 11, size: 8, align: 8, file: !20, scope: !10, baseType: !13) -!13 = !MDDerivedType(tag: DW_TAG_typedef, name: "A", line: 11, file: !20, scope: !3, baseType: !14) -!14 = !MDCompositeType(tag: DW_TAG_array_type, size: 8, align: 8, file: !20, scope: !4, baseType: !15, elements: !16) -!15 = !MDBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char) -!16 = !{!17} -!17 = !MDSubrange(count: 1) -!18 = !{!"llvm.mdnode.fwdref.19"} -!19 = !{!"llvm.mdnode.fwdref.23"} -!20 = !MDFile(filename: "2007-12-VarArrayDebug.c", directory: "/Users/sabre/llvm/test/FrontendC/") -!21 = !{i32 0} -!22 = !{i32 1, !"Debug Info Version", i32 3} diff --git a/test/DebugInfo/location-verifier.ll b/test/DebugInfo/location-verifier.ll index d35c7323669..f49fd591578 100644 --- a/test/DebugInfo/location-verifier.ll +++ b/test/DebugInfo/location-verifier.ll @@ -29,5 +29,5 @@ attributes #0 = { nounwind ssp uwtable } !11 = !{i32 1, !"PIC Level", i32 2} !12 = !{!"clang version 3.7.0 "} ; An old-style MDLocation should not pass verify. -; CHECK: DISubprogram does not Verify +; CHECK: invalid !dbg metadata attachment !13 = !{i32 2, i32 2, !4, null} diff --git a/test/Verifier/dbg.ll b/test/Verifier/dbg.ll new file mode 100644 index 00000000000..20b80ff2efe --- /dev/null +++ b/test/Verifier/dbg.ll @@ -0,0 +1,12 @@ +; RUN: not llvm-as -disable-output <%s 2>&1 | FileCheck %s + +define void @foo() { + ret void, !dbg !{} +} + +; CHECK: invalid !dbg metadata attachment +; CHECK-NEXT: ret void, !dbg ![[LOC:[0-9]+]] +; CHECK-NEXT: ![[LOC]] = !{} + +!llvm.module.flags = !{!0} +!0 = !{i32 2, !"Debug Info Version", i32 3}