diff options
| author | Keno Fischer <kfischer@college.harvard.edu> | 2016-01-07 22:18:37 +0000 |
|---|---|---|
| committer | Keno Fischer <kfischer@college.harvard.edu> | 2016-01-07 22:18:37 +0000 |
| commit | b3326be6add34fa7addb86eb9c2f4483be569b4b (patch) | |
| tree | ed5fd8ab70b756c23be46d8ee8c517b33ee7af4e /llvm/test/DebugInfo/X86 | |
| parent | 72132002314240b320c8ba3f4a04921cb87dce77 (diff) | |
| download | bcm5719-llvm-b3326be6add34fa7addb86eb9c2f4483be569b4b.tar.gz bcm5719-llvm-b3326be6add34fa7addb86eb9c2f4483be569b4b.zip | |
[Verifier] Check that debug values have proper size
Summary:
Teach the Verifier to make sure that the storage size given to llvm.dbg.declare
or the value size given to llvm.dbg.value agree with what is declared in
DebugInfo. This is implicitly assumed in a number of passes (e.g. in SROA).
Additionally this catches a number of common mistakes, such as passing a
pointer when a value was intended or vice versa.
One complication comes from stack coloring which modifies the original IR when
it merges allocas in order to make sure that if AA falls back to the IR it gets
the correct result. However, given this new invariant, indiscriminately
replacing one alloca by a different (differently sized one) is no longer valid.
Fix this by just undefing out any use of the alloca in a dbg.declare in this
case.
Additionally, I had to fix a number of test cases. Of particular note:
- I regenerated dbg-changes-codegen-branch-folding.ll from the given source as
it was affected by the bug fixed in r256077
- two-cus-from-same-file.ll was changed to avoid having a variable-typed debug
variable as that would depend on the target, even though this test is
supposed to be generic
- I had to manually declared size/align for reference type. See also the
discussion for D14275/r253186.
- fpstack-debuginstr-kill.ll required changing `double` to `long double`
- most others were just a question of adding OP_deref
Reviewers: aprantl
Differential Revision: http://reviews.llvm.org/D14276
llvm-svn: 257105
Diffstat (limited to 'llvm/test/DebugInfo/X86')
| -rw-r--r-- | llvm/test/DebugInfo/X86/bbjoin.ll | 6 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/dbg-value-dag-combine.ll | 4 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/dbg-value-isel.ll | 2 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/dbg-value-terminator.ll | 3 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/elf-names.ll | 2 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/nodebug_with_debug_loc.ll | 4 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/nophysreg.ll | 10 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/rvalue-ref.ll | 2 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/sret.ll | 2 |
9 files changed, 18 insertions, 17 deletions
diff --git a/llvm/test/DebugInfo/X86/bbjoin.ll b/llvm/test/DebugInfo/X86/bbjoin.ll index 8061a8d2ce9..385cb6cc779 100644 --- a/llvm/test/DebugInfo/X86/bbjoin.ll +++ b/llvm/test/DebugInfo/X86/bbjoin.ll @@ -30,9 +30,9 @@ entry: call void @llvm.lifetime.start(i64 4, i8* %0) #4, !dbg !14 tail call void @llvm.dbg.value(metadata i32 23, i64 0, metadata !9, metadata !15), !dbg !16 store i32 23, i32* %x, align 4, !dbg !16, !tbaa !17 - tail call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !15), !dbg !16 + tail call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !DIExpression(DW_OP_deref)), !dbg !16 call void @g(i32* nonnull %x) #4, !dbg !21 - call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !15), !dbg !16 + call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !DIExpression(DW_OP_deref)), !dbg !16 %1 = load i32, i32* %x, align 4, !dbg !22, !tbaa !17 %cmp = icmp eq i32 %1, 42, !dbg !24 br i1 %cmp, label %if.then, label %if.end, !dbg !25 @@ -44,7 +44,7 @@ if.then: ; preds = %entry if.end: ; preds = %if.then, %entry %2 = phi i32 [ 43, %if.then ], [ %1, %entry ], !dbg !27 - call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !15), !dbg !16 + call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !9, metadata !DIExpression(DW_OP_deref)), !dbg !16 call void @llvm.lifetime.end(i64 4, i8* %0) #4, !dbg !28 ret i32 %2, !dbg !29 } diff --git a/llvm/test/DebugInfo/X86/dbg-value-dag-combine.ll b/llvm/test/DebugInfo/X86/dbg-value-dag-combine.ll index 6243be8aa4a..39d533fa3ca 100644 --- a/llvm/test/DebugInfo/X86/dbg-value-dag-combine.ll +++ b/llvm/test/DebugInfo/X86/dbg-value-dag-combine.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s | FileCheck %s -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" -target triple = "x86_64-apple-darwin10.0.0" +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32" +target triple = "i686-apple-darwin" ; PR 9817 diff --git a/llvm/test/DebugInfo/X86/dbg-value-isel.ll b/llvm/test/DebugInfo/X86/dbg-value-isel.ll index ae76beb8140..e673410ab26 100644 --- a/llvm/test/DebugInfo/X86/dbg-value-isel.ll +++ b/llvm/test/DebugInfo/X86/dbg-value-isel.ll @@ -86,7 +86,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnon !2 = distinct !DICompileUnit(language: DW_LANG_C89, producer: "clc", isOptimized: false, emissionKind: 1, file: !20, enums: !21, retainedTypes: !21, subprograms: !19, imports: null) !3 = !DISubroutineType(types: !4) !4 = !{null, !5} -!5 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 32, align: 32, scope: !2, baseType: !6) +!5 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align:64, scope: !2, baseType: !6) !6 = !DIDerivedType(tag: DW_TAG_typedef, name: "uint", file: !20, scope: !2, baseType: !7) !7 = !DIBasicType(tag: DW_TAG_base_type, name: "unsigned int", size: 32, align: 32, encoding: DW_ATE_unsigned) !8 = !DILocalVariable(name: "ip", line: 1, arg: 1, scope: !0, file: !1, type: !5) diff --git a/llvm/test/DebugInfo/X86/dbg-value-terminator.ll b/llvm/test/DebugInfo/X86/dbg-value-terminator.ll index 8b8bdec18ab..45b5886dc73 100644 --- a/llvm/test/DebugInfo/X86/dbg-value-terminator.ll +++ b/llvm/test/DebugInfo/X86/dbg-value-terminator.ll @@ -7,6 +7,7 @@ ; ; CHECK-LABEL: test: ; CHECK: ##DEBUG_VALUE: foo:i + %a = type { i32, i32 } define hidden fastcc %a* @test() #1 !dbg !1 { @@ -87,7 +88,7 @@ VEC_edge_base_index.exit7.i: ; preds = %"3.i5.i" "44.i": ; preds = %"42.i" %2 = load %a*, %a** undef, align 8, !dbg !12 %3 = bitcast %a* %2 to %a*, !dbg !12 - call void @llvm.dbg.value(metadata %a* %3, i64 0, metadata !6, metadata !DIExpression()), !dbg !12 + call void @llvm.dbg.value(metadata %a* %3, i64 0, metadata !6, metadata !DIExpression(DW_OP_deref)), !dbg !12 br label %may_unswitch_on.exit, !dbg !12 "45.i": ; preds = %"38.i" diff --git a/llvm/test/DebugInfo/X86/elf-names.ll b/llvm/test/DebugInfo/X86/elf-names.ll index 2c857192762..219847cdf9a 100644 --- a/llvm/test/DebugInfo/X86/elf-names.ll +++ b/llvm/test/DebugInfo/X86/elf-names.ll @@ -81,7 +81,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnon !20 = !DISubprogram(name: "D", line: 4, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 4, file: !6, scope: !10, type: !21) !21 = !DISubroutineType(types: !22) !22 = !{null, !9, !23} -!23 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !24) +!23 = !DIDerivedType(tag: DW_TAG_reference_type, size: 64, align: 64, baseType: !24) !24 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !10) !27 = !{!29} !29 = !DILocalVariable(name: "this", line: 12, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !5, file: !6, type: !30) diff --git a/llvm/test/DebugInfo/X86/nodebug_with_debug_loc.ll b/llvm/test/DebugInfo/X86/nodebug_with_debug_loc.ll index 4ccf22bdc5a..1bf96c02fe1 100644 --- a/llvm/test/DebugInfo/X86/nodebug_with_debug_loc.ll +++ b/llvm/test/DebugInfo/X86/nodebug_with_debug_loc.ll @@ -58,8 +58,8 @@ entry: for.body: ; preds = %for.body, %entry %iter.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ] call void @llvm.lifetime.start(i64 4, i8* %0), !dbg !26 - call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !16, metadata !DIExpression()) #3, !dbg !26 - call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !27, metadata !DIExpression()) #3, !dbg !29 + call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !16, metadata !DIExpression(DW_OP_deref)) #3, !dbg !26 + call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !27, metadata !DIExpression(DW_OP_deref)) #3, !dbg !29 call void @_Z4sinkPKv(i8* undef) #3, !dbg !29 call void @_Z4sinkPKv(i8* %0) #3, !dbg !30 call void @llvm.lifetime.end(i64 4, i8* %0), !dbg !31 diff --git a/llvm/test/DebugInfo/X86/nophysreg.ll b/llvm/test/DebugInfo/X86/nophysreg.ll index ddf014b43b7..db9cabf3c7c 100644 --- a/llvm/test/DebugInfo/X86/nophysreg.ll +++ b/llvm/test/DebugInfo/X86/nophysreg.ll @@ -88,25 +88,25 @@ while.cond.loopexit: ; preds = %while.body4, %while while.body: ; preds = %entry, %while.cond.loopexit store i32 0, i32* %ref.tmp, align 4, !dbg !41, !tbaa !42 - call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46 + call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !DIExpression(DW_OP_deref)), !dbg !46 call void @_Z4funcRKiS0_(i32* dereferenceable(4) %x, i32* dereferenceable(4) %ref.tmp), !dbg !47 %call29 = call i32 @_Z4condv(), !dbg !48 %tobool310 = icmp eq i32 %call29, 0, !dbg !48 br i1 %tobool310, label %while.cond.loopexit, label %while.body4, !dbg !49 while.body4: ; preds = %while.body, %while.body4 - call void @llvm.dbg.value(metadata i8* %y, i64 0, metadata !23, metadata !36), !dbg !50 + call void @llvm.dbg.value(metadata i8* %y, i64 0, metadata !23, metadata !DIExpression(DW_OP_deref)), !dbg !50 call void @_Z4funcPv(i8* %y), !dbg !51 - call void @llvm.dbg.value(metadata i8* %j, i64 0, metadata !26, metadata !36), !dbg !52 + call void @llvm.dbg.value(metadata i8* %j, i64 0, metadata !26, metadata !DIExpression(DW_OP_deref)), !dbg !52 call void @_Z4funcPv(i8* %j), !dbg !53 - call void @llvm.dbg.value(metadata i8* %I, i64 0, metadata !27, metadata !36), !dbg !54 + call void @llvm.dbg.value(metadata i8* %I, i64 0, metadata !27, metadata !DIExpression(DW_OP_deref)), !dbg !54 call void @_Z4funcPv(i8* %I), !dbg !55 store i32 0, i32* %ref.tmp5, align 4, !dbg !56, !tbaa !42 store i32 0, i32* %ref.tmp6, align 4, !dbg !57, !tbaa !42 call void @_Z4funcRKiS0_(i32* dereferenceable(4) %ref.tmp5, i32* dereferenceable(4) %ref.tmp6), !dbg !58 call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !28, metadata !36), !dbg !59 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !28, metadata !33), !dbg !59 - call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46 + call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !DIExpression(DW_OP_deref)), !dbg !46 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !60, metadata !33), !dbg !62 call void @llvm.dbg.value(metadata i32 undef, i64 0, metadata !60, metadata !35), !dbg !62 call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !60, metadata !36), !dbg !62 diff --git a/llvm/test/DebugInfo/X86/rvalue-ref.ll b/llvm/test/DebugInfo/X86/rvalue-ref.ll index c72a3aa2c04..a348b1d8d25 100644 --- a/llvm/test/DebugInfo/X86/rvalue-ref.ll +++ b/llvm/test/DebugInfo/X86/rvalue-ref.ll @@ -30,7 +30,7 @@ declare i32 @printf(i8*, ...) !6 = !DIFile(filename: "foo.cpp", directory: "/Users/echristo/tmp") !7 = !DISubroutineType(types: !8) !8 = !{null, !9} -!9 = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, baseType: !10) +!9 = !DIDerivedType(tag: DW_TAG_rvalue_reference_type, size: 64, align: 64, baseType: !10) !10 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) !11 = !DILocalVariable(name: "i", line: 4, arg: 1, scope: !5, file: !6, type: !9) !12 = !DILocation(line: 4, column: 17, scope: !5) diff --git a/llvm/test/DebugInfo/X86/sret.ll b/llvm/test/DebugInfo/X86/sret.ll index 45af2821741..e48ed6567da 100644 --- a/llvm/test/DebugInfo/X86/sret.ll +++ b/llvm/test/DebugInfo/X86/sret.ll @@ -284,7 +284,7 @@ attributes #7 = { builtin nounwind } !19 = !DISubprogram(name: "A", line: 5, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 5, file: !1, scope: !"_ZTS1A", type: !20) !20 = !DISubroutineType(types: !21) !21 = !{null, !17, !22} -!22 = !DIDerivedType(tag: DW_TAG_reference_type, baseType: !23) +!22 = !DIDerivedType(tag: DW_TAG_reference_type, size: 64, align: 64, baseType: !23) !23 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !"_ZTS1A") !25 = !DISubprogram(name: "operator=", linkageName: "_ZN1AaSERKS_", line: 7, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 7, file: !1, scope: !"_ZTS1A", type: !26) !26 = !DISubroutineType(types: !27) |

