1 ; RUN: llc -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s 2 ; 3 ; PR22296: In this testcase the DBG_VALUE describing "p5" becomes unavailable 4 ; because the register its address is in is clobbered and we (currently) aren't 5 ; smart enough to realize that the value is rematerialized immediately after the 6 ; DBG_VALUE and/or is actually a stack slot. 7 ; 8 ; Test that we handle this situation gracefully by omitting the DW_AT_location 9 ; and not asserting. 10 ; Note that this check may XPASS in the future if DbgValueHistoryCalculator 11 ; becoms smarter. That would be fine, too. 12 ; 13 ; CHECK: DW_TAG_subprogram 14 ; CHECK: linkage_name{{.*}}_Z2f21A 15 ; CHECK: DW_TAG_formal_parameter 16 ; CHECK-NOT: DW_AT_location 17 ; CHECK-NEXT: DW_AT_name {{.*}}"p5" 18 ; 19 ; // Compile at -O1 20 ; struct A { 21 ; int *m1; 22 ; int m2; 23 ; }; 24 ; 25 ; void f1(int *p1, int p2); 26 ; void __attribute__((always_inline)) f2(A p5) { f1(p5.m1, p5.m2); } 27 ; 28 ; void func(void*); 29 ; void func(const int &, const int&); 30 ; int cond(); 31 ; void f() { 32 ; while (cond()) { 33 ; int x; 34 ; func(x, 0); 35 ; while (cond()) { 36 ; char y; 37 ; func(&y); 38 ; char j; 39 ; func(&j); 40 ; char I; 41 ; func(&I); 42 ; func(0, 0); 43 ; A g; 44 ; g.m1 = &x; 45 ; f2(g); 46 ; } 47 ; } 48 ; } 49 ; ModuleID = 'test.cpp' 50 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" 51 target triple = "x86_64-apple-macosx10.10.0" 52 53 %struct.A = type { i32*, i32 } 54 55 ; Function Attrs: alwaysinline ssp uwtable 56 define void @_Z2f21A(i32* %p5.coerce0, i32 %p5.coerce1) #0 !dbg !11 { 57 entry: 58 tail call void @llvm.dbg.value(metadata i32* %p5.coerce0, i64 0, metadata !16, metadata !33), !dbg !34 59 tail call void @llvm.dbg.value(metadata i32 %p5.coerce1, i64 0, metadata !16, metadata !35), !dbg !34 60 tail call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !16, metadata !36), !dbg !34 61 tail call void @_Z2f1Pii(i32* %p5.coerce0, i32 %p5.coerce1), !dbg !37 62 ret void, !dbg !38 63 } 64 65 ; Function Attrs: nounwind readnone 66 declare void @llvm.dbg.declare(metadata, metadata, metadata) #1 67 68 declare void @_Z2f1Pii(i32*, i32) #2 69 70 ; Function Attrs: ssp uwtable 71 define void @_Z1fv() #3 !dbg !17 { 72 entry: 73 %x = alloca i32, align 4 74 %ref.tmp = alloca i32, align 4 75 %y = alloca i8, align 1 76 %j = alloca i8, align 1 77 %I = alloca i8, align 1 78 %ref.tmp5 = alloca i32, align 4 79 %ref.tmp6 = alloca i32, align 4 80 %call11 = call i32 @_Z4condv(), !dbg !39 81 %tobool12 = icmp eq i32 %call11, 0, !dbg !39 82 br i1 %tobool12, label %while.end7, label %while.body, !dbg !40 83 84 while.cond.loopexit: ; preds = %while.body4, %while.body 85 %call = call i32 @_Z4condv(), !dbg !39 86 %tobool = icmp eq i32 %call, 0, !dbg !39 87 br i1 %tobool, label %while.end7, label %while.body, !dbg !40 88 89 while.body: ; preds = %entry, %while.cond.loopexit 90 store i32 0, i32* %ref.tmp, align 4, !dbg !41, !tbaa !42 91 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46 92 call void @_Z4funcRKiS0_(i32* dereferenceable(4) %x, i32* dereferenceable(4) %ref.tmp), !dbg !47 93 %call29 = call i32 @_Z4condv(), !dbg !48 94 %tobool310 = icmp eq i32 %call29, 0, !dbg !48 95 br i1 %tobool310, label %while.cond.loopexit, label %while.body4, !dbg !49 96 97 while.body4: ; preds = %while.body, %while.body4 98 call void @llvm.dbg.value(metadata i8* %y, i64 0, metadata !23, metadata !36), !dbg !50 99 call void @_Z4funcPv(i8* %y), !dbg !51 100 call void @llvm.dbg.value(metadata i8* %j, i64 0, metadata !26, metadata !36), !dbg !52 101 call void @_Z4funcPv(i8* %j), !dbg !53 102 call void @llvm.dbg.value(metadata i8* %I, i64 0, metadata !27, metadata !36), !dbg !54 103 call void @_Z4funcPv(i8* %I), !dbg !55 104 store i32 0, i32* %ref.tmp5, align 4, !dbg !56, !tbaa !42 105 store i32 0, i32* %ref.tmp6, align 4, !dbg !57, !tbaa !42 106 call void @_Z4funcRKiS0_(i32* dereferenceable(4) %ref.tmp5, i32* dereferenceable(4) %ref.tmp6), !dbg !58 107 call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !28, metadata !36), !dbg !59 108 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !28, metadata !33), !dbg !59 109 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46 110 call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !60, metadata !33), !dbg !62 111 call void @llvm.dbg.value(metadata i32 undef, i64 0, metadata !60, metadata !35), !dbg !62 112 call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !60, metadata !36), !dbg !62 113 call void @_Z2f1Pii(i32* %x, i32 undef), !dbg !63 114 %call2 = call i32 @_Z4condv(), !dbg !48 115 %tobool3 = icmp eq i32 %call2, 0, !dbg !48 116 br i1 %tobool3, label %while.cond.loopexit, label %while.body4, !dbg !49 117 118 while.end7: ; preds = %while.cond.loopexit, %entry 119 ret void, !dbg !64 120 } 121 122 declare i32 @_Z4condv() 123 124 declare void @_Z4funcRKiS0_(i32* dereferenceable(4), i32* dereferenceable(4)) 125 126 declare void @_Z4funcPv(i8*) 127 128 ; Function Attrs: nounwind readnone 129 declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1 130 131 attributes #0 = { alwaysinline ssp uwtable } 132 attributes #1 = { nounwind readnone } 133 attributes #3 = { ssp uwtable } 134 135 !llvm.dbg.cu = !{!0} 136 !llvm.module.flags = !{!29, !30, !31} 137 !llvm.ident = !{!32} 138 139 !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.7.0 (trunk 227088) (llvm/trunk 227091)", isOptimized: true, emissionKind: 1, file: !1, enums: !2, retainedTypes: !3, subprograms: !10, globals: !2, imports: !2) 140 !1 = !DIFile(filename: "test.cpp", directory: "") 141 !2 = !{} 142 !3 = !{!4} 143 !4 = !DICompositeType(tag: DW_TAG_structure_type, name: "A", line: 1, size: 128, align: 64, file: !1, elements: !5, identifier: "_ZTS1A") 144 !5 = !{!6, !9} 145 !6 = !DIDerivedType(tag: DW_TAG_member, name: "m1", line: 2, size: 64, align: 64, file: !1, scope: !"_ZTS1A", baseType: !7) 146 !7 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !8) 147 !8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed) 148 !9 = !DIDerivedType(tag: DW_TAG_member, name: "m2", line: 3, size: 32, align: 32, offset: 64, file: !1, scope: !"_ZTS1A", baseType: !8) 149 !10 = !{!11, !17} 150 !11 = distinct !DISubprogram(name: "f2", linkageName: "_Z2f21A", line: 7, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 7, file: !1, scope: !12, type: !13, variables: !15) 151 !12 = !DIFile(filename: "test.cpp", directory: "") 152 !13 = !DISubroutineType(types: !14) 153 !14 = !{null, !"_ZTS1A"} 154 !15 = !{!16} 155 !16 = !DILocalVariable(name: "p5", line: 7, arg: 1, scope: !11, file: !12, type: !"_ZTS1A") 156 !17 = distinct !DISubprogram(name: "f", linkageName: "_Z1fv", line: 12, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 12, file: !1, scope: !12, type: !18, variables: !20) 157 !18 = !DISubroutineType(types: !19) 158 !19 = !{null} 159 !20 = !{!21, !23, !26, !27, !28} 160 !21 = !DILocalVariable(name: "x", line: 14, scope: !22, file: !12, type: !8) 161 !22 = distinct !DILexicalBlock(line: 13, column: 18, file: !1, scope: !17) 162 !23 = !DILocalVariable(name: "y", line: 17, scope: !24, file: !12, type: !25) 163 !24 = distinct !DILexicalBlock(line: 16, column: 20, file: !1, scope: !22) 164 !25 = !DIBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char) 165 !26 = !DILocalVariable(name: "j", line: 19, scope: !24, file: !12, type: !25) 166 !27 = !DILocalVariable(name: "I", line: 21, scope: !24, file: !12, type: !25) 167 !28 = !DILocalVariable(name: "g", line: 24, scope: !24, file: !12, type: !"_ZTS1A") 168 !29 = !{i32 2, !"Dwarf Version", i32 2} 169 !30 = !{i32 2, !"Debug Info Version", i32 3} 170 !31 = !{i32 1, !"PIC Level", i32 2} 171 !32 = !{!"clang version 3.7.0 (trunk 227088) (llvm/trunk 227091)"} 172 !33 = !DIExpression(DW_OP_bit_piece, 0, 8) 173 !34 = !DILocation(line: 7, column: 42, scope: !11) 174 !35 = !DIExpression(DW_OP_bit_piece, 8, 4) 175 !36 = !DIExpression() 176 !37 = !DILocation(line: 7, column: 48, scope: !11) 177 !38 = !DILocation(line: 7, column: 66, scope: !11) 178 !39 = !DILocation(line: 13, column: 10, scope: !17) 179 !40 = !DILocation(line: 13, column: 3, scope: !17) 180 !41 = !DILocation(line: 15, column: 13, scope: !22) 181 !42 = !{!43, !43, i64 0} 182 !43 = !{!"int", !44, i64 0} 183 !44 = !{!"omnipotent char", !45, i64 0} 184 !45 = !{!"Simple C/C++ TBAA"} 185 !46 = !DILocation(line: 14, column: 9, scope: !22) 186 !47 = !DILocation(line: 15, column: 5, scope: !22) 187 !48 = !DILocation(line: 16, column: 12, scope: !22) 188 !49 = !DILocation(line: 16, column: 5, scope: !22) 189 !50 = !DILocation(line: 17, column: 12, scope: !24) 190 !51 = !DILocation(line: 18, column: 7, scope: !24) 191 !52 = !DILocation(line: 19, column: 12, scope: !24) 192 !53 = !DILocation(line: 20, column: 7, scope: !24) 193 !54 = !DILocation(line: 21, column: 12, scope: !24) 194 !55 = !DILocation(line: 22, column: 7, scope: !24) 195 !56 = !DILocation(line: 23, column: 12, scope: !24) 196 !57 = !DILocation(line: 23, column: 15, scope: !24) 197 !58 = !DILocation(line: 23, column: 7, scope: !24) 198 !59 = !DILocation(line: 24, column: 9, scope: !24) 199 !60 = !DILocalVariable(name: "p5", line: 7, arg: 1, scope: !11, file: !12, type: !"_ZTS1A") 200 !61 = distinct !DILocation(line: 26, column: 7, scope: !24) 201 !62 = !DILocation(line: 7, column: 42, scope: !11, inlinedAt: !61) 202 !63 = !DILocation(line: 7, column: 48, scope: !11, inlinedAt: !61) 203 !64 = !DILocation(line: 29, column: 1, scope: !17) 204