1; RUN: mlir-translate -import-llvm -mlir-print-debuginfo -split-input-file %s | FileCheck %s 2 3; CHECK: #[[$UNKNOWN_LOC:.+]] = loc(unknown) 4 5; CHECK-LABEL: @module_loc( 6define i32 @module_loc(i32 %0) { 7entry: 8 br label %next 9end: 10 ; CHECK: ^{{.*}}(%{{.+}}: i32 loc(unknown)): 11 %1 = phi i32 [ %2, %next ] 12 ret i32 %1 13next: 14 ; CHECK: = llvm.mul %{{.+}}, %{{.+}} : i32 loc(#[[$UNKNOWN_LOC]]) 15 %2 = mul i32 %0, %0 16 br label %end 17} 18 19; // ----- 20 21; CHECK-LABEL: @instruction_loc 22define i32 @instruction_loc(i32 %arg1) { 23 ; CHECK: llvm.add {{.*}} loc(#[[FILE_LOC:.*]]) 24 %1 = add i32 %arg1, %arg1, !dbg !5 25 26 ; CHECK: llvm.mul {{.*}} loc(#[[CALLSITE_LOC:.*]]) 27 %2 = mul i32 %1, %1, !dbg !7 28 29 ret i32 %2 30} 31 32; CHECK-DAG: #[[RAW_FILE_LOC:.+]] = loc("debug-info.ll":1:2) 33; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "instruction_loc" 34; CHECK-DAG: #[[CALLEE:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "callee" 35; CHECK-DAG: #[[FILE_LOC]] = loc(fused<#[[SP]]>[#[[RAW_FILE_LOC]]]) 36; CHECK-DAG: #[[RAW_CALLEE_LOC:.+]] = loc("debug-info.ll":7:4) 37; CHECK-DAG: #[[CALLEE_LOC:.+]] = loc(fused<#[[CALLEE]]>[#[[RAW_CALLEE_LOC]]]) 38; CHECK-DAG: #[[RAW_CALLER_LOC:.+]] = loc("debug-info.ll":2:2) 39; CHECK-DAG: #[[CALLER_LOC:.+]] = loc(fused<#[[SP]]>[#[[RAW_CALLER_LOC]]]) 40; CHECK-DAG: #[[CALLSITE_LOC:.+]] = loc(callsite(#[[CALLEE_LOC]] at #[[CALLER_LOC]])) 41 42!llvm.dbg.cu = !{!1} 43!llvm.module.flags = !{!0} 44!0 = !{i32 2, !"Debug Info Version", i32 3} 45!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 46!2 = !DIFile(filename: "debug-info.ll", directory: "/") 47!3 = distinct !DISubprogram(name: "instruction_loc", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 48!4 = distinct !DISubprogram(name: "callee", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 49!5 = !DILocation(line: 1, column: 2, scope: !3) 50!6 = !DILocation(line: 2, column: 2, scope: !3) 51!7 = !DILocation(line: 7, column: 4, scope: !4, inlinedAt: !6) 52 53; // ----- 54 55; CHECK-LABEL: @lexical_block 56define i32 @lexical_block(i32 %arg1) { 57 ; CHECK: llvm.add {{.*}} loc(#[[LOC0:.*]]) 58 %1 = add i32 %arg1, %arg1, !dbg !6 59 60 ; CHECK: llvm.mul {{.*}} loc(#[[LOC1:.*]]) 61 %2 = mul i32 %arg1, %arg1, !dbg !7 62 63 ret i32 %2 64} 65; CHECK: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/"> 66; CHECK: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = 67; CHECK: #[[LB0:.+]] = #llvm.di_lexical_block<scope = #[[SP]]> 68; CHECK: #[[LB1:.+]] = #llvm.di_lexical_block<scope = #[[SP]], file = #[[FILE]], line = 2, column = 2> 69; CHECK: #[[LOC0]] = loc(fused<#[[LB0]]>[{{.*}}]) 70; CHECK: #[[LOC1]] = loc(fused<#[[LB1]]>[{{.*}}]) 71 72!llvm.dbg.cu = !{!1} 73!llvm.module.flags = !{!0} 74!0 = !{i32 2, !"Debug Info Version", i32 3} 75!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 76!2 = !DIFile(filename: "debug-info.ll", directory: "/") 77!3 = distinct !DISubprogram(name: "lexical_block", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 78!4 = !DILexicalBlock(scope: !3) 79!5 = !DILexicalBlock(scope: !3, file: !2, line: 2, column: 2) 80!6 = !DILocation(line: 1, column: 2, scope: !4) 81!7 = !DILocation(line: 2, column: 2, scope: !5) 82 83; // ----- 84 85; CHECK-LABEL: @lexical_block_file 86define i32 @lexical_block_file(i32 %arg1) { 87 ; CHECK: llvm.add {{.*}} loc(#[[LOC0:.*]]) 88 %1 = add i32 %arg1, %arg1, !dbg !6 89 90 ; CHECK: llvm.mul {{.*}} loc(#[[LOC1:.*]]) 91 %2 = mul i32 %arg1, %arg1, !dbg !7 92 93 ret i32 %2 94} 95; CHECK: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/"> 96; CHECK: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = 97; CHECK: #[[LB0:.+]] = #llvm.di_lexical_block_file<scope = #[[SP]], discriminator = 0> 98; CHECK: #[[LB1:.+]] = #llvm.di_lexical_block_file<scope = #[[SP]], file = #[[FILE]], discriminator = 0> 99; CHECK: #[[LOC0]] = loc(fused<#[[LB0]]>[ 100; CHECK: #[[LOC1]] = loc(fused<#[[LB1]]>[ 101 102!llvm.dbg.cu = !{!1} 103!llvm.module.flags = !{!0} 104!0 = !{i32 2, !"Debug Info Version", i32 3} 105!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 106!2 = !DIFile(filename: "debug-info.ll", directory: "/") 107!3 = distinct !DISubprogram(name: "lexical_block_file", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 108!4 = !DILexicalBlockFile(scope: !3, discriminator: 0) 109!5 = !DILexicalBlockFile(scope: !3, file: !2, discriminator: 0) 110!6 = !DILocation(line: 1, column: 2, scope: !4) 111!7 = !DILocation(line: 2, column: 2, scope: !5) 112 113; // ----- 114 115; CHECK-DAG: #[[NULL:.+]] = #llvm.di_null_type 116; CHECK-DAG: #[[INT1:.+]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int1"> 117; CHECK-DAG: #[[INT2:.+]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int2", sizeInBits = 32, encoding = DW_ATE_signed> 118; CHECK-DAG: #llvm.di_subroutine_type<types = #[[NULL]], #[[INT1]], #[[INT2]]> 119 120define void @basic_type() !dbg !3 { 121 ret void 122} 123 124!llvm.dbg.cu = !{!1} 125!llvm.module.flags = !{!0} 126!0 = !{i32 2, !"Debug Info Version", i32 3} 127!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 128!2 = !DIFile(filename: "debug-info.ll", directory: "/") 129!3 = distinct !DISubprogram(name: "basic_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4) 130!4 = !DISubroutineType(types: !5) 131!5 = !{null, !6, !7} 132!6 = !DIBasicType(name: "int1") 133!7 = !DIBasicType(name: "int2", encoding: DW_ATE_signed, size: 32) 134 135; // ----- 136 137; CHECK: #[[INT:.+]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int"> 138; CHECK: #[[PTR1:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[INT]]> 139; CHECK: #[[PTR2:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, name = "mypointer", baseType = #[[INT]], sizeInBits = 64, alignInBits = 32, offsetInBits = 4, extraData = #[[INT]]> 140; CHECK: #[[PTR3:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[INT]], dwarfAddressSpace = 3> 141; CHECK: #llvm.di_subroutine_type<types = #[[PTR1]], #[[PTR2]], #[[PTR3]]> 142 143define void @derived_type() !dbg !3 { 144 ret void 145} 146 147!llvm.dbg.cu = !{!1} 148!llvm.module.flags = !{!0} 149!0 = !{i32 2, !"Debug Info Version", i32 3} 150!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 151!2 = !DIFile(filename: "debug-info.ll", directory: "/") 152!3 = distinct !DISubprogram(name: "derived_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4) 153!4 = !DISubroutineType(types: !5) 154!5 = !{!7, !8, !9} 155!6 = !DIBasicType(name: "int") 156!7 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6) 157!8 = !DIDerivedType(name: "mypointer", tag: DW_TAG_pointer_type, baseType: !6, size: 64, align: 32, offset: 4, extraData: !6) 158!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !6, dwarfAddressSpace: 3) 159 160; // ----- 161 162; CHECK-DAG: #[[INT:.+]] = #llvm.di_basic_type<tag = DW_TAG_base_type, name = "int"> 163; CHECK-DAG: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/"> 164; CHECK-DAG: #[[VAR:.+]] = #llvm.di_local_variable<{{.*}}name = "size"> 165; CHECK-DAG: #[[GV:.+]] = #llvm.di_global_variable<{{.*}}name = "gv"{{.*}}> 166; CHECK-DAG: #[[COMP1:.+]] = #llvm.di_composite_type<tag = DW_TAG_array_type, name = "array1", line = 10, baseType = #[[INT]], sizeInBits = 128, alignInBits = 32> 167; CHECK-DAG: #[[COMP2:.+]] = #llvm.di_composite_type<{{.*}}, file = #[[FILE]], scope = #[[FILE]], baseType = #[[INT]]> 168; CHECK-DAG: #[[COMP3:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector, elements = #llvm.di_subrange<count = 4 : i64>> 169; CHECK-DAG: #[[COMP4:.+]] = #llvm.di_composite_type<{{.*}}, flags = Vector, elements = #llvm.di_subrange<lowerBound = 0 : i64, upperBound = 4 : i64, stride = 1 : i64>> 170; CHECK-DAG: #[[COMP5:.+]] = #llvm.di_composite_type<{{.*}}, name = "var_elements"{{.*}}elements = #llvm.di_subrange<count = #[[VAR]], stride = #[[GV]]>> 171; CHECK-DAG: #[[COMP6:.+]] = #llvm.di_composite_type<{{.*}}, name = "expr_elements"{{.*}}elements = #llvm.di_subrange<count = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>>> 172; CHECK-DAG: #[[COMP7:.+]] = #llvm.di_composite_type<{{.*}}, name = "expr_elements2"{{.*}}elements = #llvm.di_generic_subrange<count = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(16), DW_OP_deref]>, lowerBound = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(24), DW_OP_deref]>, stride = #llvm.di_expression<[DW_OP_push_object_address, DW_OP_plus_uconst(32), DW_OP_deref]>>> 173; CHECK-DAG: #llvm.di_subroutine_type<types = #[[COMP1]], #[[COMP2]], #[[COMP3]], #[[COMP4]], #[[COMP5]], #[[COMP6]], #[[COMP7]]> 174 175@gv = external global i64 176 177define void @composite_type() !dbg !3 { 178 ret void 179} 180 181!llvm.dbg.cu = !{!1} 182!llvm.module.flags = !{!0} 183!0 = !{i32 2, !"Debug Info Version", i32 3} 184!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 185!2 = !DIFile(filename: "debug-info.ll", directory: "/") 186!3 = distinct !DISubprogram(name: "composite_type", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, type: !4) 187!4 = !DISubroutineType(types: !5) 188!5 = !{!7, !8, !9, !10, !18, !22, !24} 189!6 = !DIBasicType(name: "int") 190!7 = !DICompositeType(tag: DW_TAG_array_type, name: "array1", line: 10, size: 128, align: 32, baseType: !6) 191!8 = !DICompositeType(tag: DW_TAG_array_type, name: "array2", file: !2, scope: !2, baseType: !6) 192!9 = !DICompositeType(tag: DW_TAG_array_type, name: "array3", flags: DIFlagVector, elements: !13, baseType: !6) 193!10 = !DICompositeType(tag: DW_TAG_array_type, name: "array4", flags: DIFlagVector, elements: !14, baseType: !6) 194!11 = !DISubrange(count: 4) 195!12 = !DISubrange(lowerBound: 0, upperBound: 4, stride: 1) 196!13 = !{!11} 197!14 = !{!12} 198!15 = !DISubrange(count: !16, stride: !23) 199!16 = !DILocalVariable(scope: !3, name: "size") 200!17 = !{!15} 201!18 = !DICompositeType(tag: DW_TAG_array_type, name: "var_elements", flags: DIFlagVector, elements: !17, baseType: !6) 202!19 = !DISubrange(count: !20) 203!20 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref) 204!21 = !{!19} 205!22 = !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements", flags: DIFlagVector, elements: !21, baseType: !6) 206!23 = !DIGlobalVariable(name: "gv", scope: !1, file: !2, line: 3, type: !6, isLocal: false, isDefinition: false) 207!24 = !DICompositeType(tag: DW_TAG_array_type, name: "expr_elements2", elements: !29, baseType: !6) 208!25 = !DIGenericSubrange(count: !26, lowerBound: !27, stride: !28) 209!26 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 16, DW_OP_deref) 210!27 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 24, DW_OP_deref) 211!28 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 32, DW_OP_deref) 212!29 = !{!25} 213 214 215; // ----- 216 217; CHECK-DAG: #[[FILE:.+]] = #llvm.di_file<"debug-info.ll" in "/"> 218; CHECK-DAG: #[[CU:.+]] = #llvm.di_compile_unit<id = distinct[0]<>, sourceLanguage = DW_LANG_C, file = #[[FILE]], isOptimized = false, emissionKind = None, nameTableKind = None> 219; Verify an empty subroutine types list is supported. 220; CHECK-DAG: #[[SP_TYPE:.+]] = #llvm.di_subroutine_type<callingConvention = DW_CC_normal> 221; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #[[CU]], scope = #[[FILE]], name = "subprogram", linkageName = "subprogram", file = #[[FILE]], line = 42, scopeLine = 42, subprogramFlags = Definition, type = #[[SP_TYPE]]> 222 223define void @subprogram() !dbg !3 { 224 ret void 225} 226 227!llvm.dbg.cu = !{!1} 228!llvm.module.flags = !{!0} 229!0 = !{i32 2, !"Debug Info Version", i32 3} 230!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2, nameTableKind: None) 231!2 = !DIFile(filename: "debug-info.ll", directory: "/") 232!3 = distinct !DISubprogram(name: "subprogram", linkageName: "subprogram", scope: !2, file: !2, line: 42, scopeLine: 42, spFlags: DISPFlagDefinition, unit: !1, type: !4) 233!4 = !DISubroutineType(cc: DW_CC_normal, types: !5) 234!5 = !{} 235!6 = !DIBasicType(name: "int") 236 237; // ----- 238 239; CHECK-LABEL: @func_loc 240define void @func_loc() !dbg !3 { 241 ret void 242} 243; CHECK-DAG: #[[NAME_LOC:.+]] = loc("func_loc") 244; CHECK-DAG: #[[FILE_LOC:.+]] = loc("debug-info.ll":42:0) 245; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "func_loc", file = #{{.*}}, line = 42, subprogramFlags = Definition> 246 247; CHECK: loc(fused<#[[SP]]>[#[[NAME_LOC]], #[[FILE_LOC]]] 248 249!llvm.dbg.cu = !{!1} 250!llvm.module.flags = !{!0} 251!0 = !{i32 2, !"Debug Info Version", i32 3} 252!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 253!2 = !DIFile(filename: "debug-info.ll", directory: "/") 254!3 = distinct !DISubprogram(name: "func_loc", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, line: 42) 255 256; // ----- 257 258; Verify the module location is set to the source filename. 259; CHECK: loc("debug-info.ll":0:0) 260source_filename = "debug-info.ll" 261 262; // ----- 263 264; NOTE: The debug intrinsics are reordered as a side-effect of the dominance- 265; preserving measures needed to import LLVM IR. 266 267; CHECK: #[[FILE:.+]] = #llvm.di_file< 268; CHECK: #[[$SP:.+]] = #llvm.di_subprogram< 269; CHECK: #[[$LABEL:.+]] = #llvm.di_label<scope = #[[$SP]], name = "label", file = #[[FILE]], line = 42> 270; CHECK: #[[$VAR1:.+]] = #llvm.di_local_variable<scope = #[[$SP]], name = "arg"> 271; CHECK: #[[$VAR0:.+]] = #llvm.di_local_variable<scope = #[[$SP]], name = "arg", file = #[[FILE]], line = 1, arg = 1, alignInBits = 32, type = #{{.*}}> 272 273; CHECK-LABEL: @intrinsic 274; CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]] 275; CHECK-SAME: %[[ARG1:[a-zA-Z0-9]+]] 276define void @intrinsic(i64 %0, ptr %1) { 277 ; CHECK: llvm.intr.dbg.declare #[[$VAR1]] = %[[ARG1]] : !llvm.ptr loc(#[[LOC1:.+]]) 278 ; CHECK: llvm.intr.dbg.value #[[$VAR0]] #llvm.di_expression<[DW_OP_deref, DW_OP_constu(3), DW_OP_plus, DW_OP_LLVM_convert(4, DW_ATE_signed)]> = %[[ARG0]] : i64 loc(#[[LOC0:.+]]) 279 ; CHECK: llvm.intr.dbg.value #[[$VAR0]] #llvm.di_expression<[DW_OP_deref, DW_OP_constu(3), DW_OP_plus, DW_OP_LLVM_fragment(3, 7)]> = %[[ARG0]] : i64 loc(#[[LOC0:.+]]) 280 call void @llvm.dbg.value(metadata i64 %0, metadata !5, metadata !DIExpression(DW_OP_deref, DW_OP_constu, 3, DW_OP_plus, DW_OP_LLVM_fragment, 3, 7)), !dbg !7 281 call void @llvm.dbg.value(metadata i64 %0, metadata !5, metadata !DIExpression(DW_OP_deref, DW_OP_constu, 3, DW_OP_plus, DW_OP_LLVM_convert, 4, DW_ATE_signed)), !dbg !7 282 call void @llvm.dbg.declare(metadata ptr %1, metadata !6, metadata !DIExpression()), !dbg !9 283 ; CHECK: llvm.intr.dbg.label #[[$LABEL]] loc(#[[LOC1:.+]]) 284 call void @llvm.dbg.label(metadata !10), !dbg !9 285 ret void 286} 287 288; CHECK: #[[LOC1]] = loc(fused<#[[$SP]]>[{{.*}}]) 289; CHECK: #[[LOC0]] = loc(fused<#[[$SP]]>[{{.*}}]) 290 291declare void @llvm.dbg.value(metadata, metadata, metadata) 292declare void @llvm.dbg.declare(metadata, metadata, metadata) 293declare void @llvm.dbg.label(metadata) 294 295!llvm.dbg.cu = !{!1} 296!llvm.module.flags = !{!0} 297!0 = !{i32 2, !"Debug Info Version", i32 3} 298!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 299!2 = !DIFile(filename: "debug-info.ll", directory: "/") 300!3 = distinct !DISubprogram(name: "intrinsic", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 301!4 = !DIBasicType(name: "int") 302!5 = !DILocalVariable(scope: !3, name: "arg", file: !2, line: 1, arg: 1, align: 32, type: !4); 303!6 = !DILocalVariable(scope: !3, name: "arg") 304!7 = !DILocation(line: 1, column: 2, scope: !3) 305!8 = !DILocation(line: 2, column: 2, scope: !3) 306!9 = !DILocation(line: 3, column: 2, scope: !3) 307!10 = !DILabel(scope: !3, name: "label", file: !2, line: 42) 308 309; // ----- 310 311; CHECK-LABEL: @class_method 312define void @class_method() { 313 ; CHECK: llvm.return loc(#[[LOC:.+]]) 314 ret void, !dbg !9 315} 316 317; Verify the cyclic subprogram is handled correctly. 318; CHECK-DAG: #[[SP_SELF:.+]] = #llvm.di_subprogram<recId = [[REC_ID:.+]], isRecSelf = true> 319; CHECK-DAG: #[[COMP:.+]] = #llvm.di_composite_type<tag = DW_TAG_class_type, name = "class_name", file = #{{.*}}, line = 42, flags = "TypePassByReference|NonTrivial", elements = #[[SP_SELF]]> 320; CHECK-DAG: #[[COMP_PTR:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP]], sizeInBits = 64> 321; CHECK-DAG: #[[SP_TYPE:.+]] = #llvm.di_subroutine_type<types = #{{.*}}, #[[COMP_PTR]]> 322; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<recId = [[REC_ID]], id = [[SP_ID:.+]], compileUnit = #{{.*}}, scope = #[[COMP]], name = "class_method", file = #{{.*}}, subprogramFlags = Definition, type = #[[SP_TYPE]]> 323; CHECK-DAG: #[[LOC]] = loc(fused<#[[SP]]> 324 325!llvm.dbg.cu = !{!1} 326!llvm.module.flags = !{!0} 327!0 = !{i32 2, !"Debug Info Version", i32 3} 328!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 329!2 = !DIFile(filename: "debug-info.ll", directory: "/") 330!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_name", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 331!4 = !{!5} 332!5 = distinct !DISubprogram(name: "class_method", scope: !3, file: !2, type: !6, spFlags: DISPFlagDefinition, unit: !1) 333!6 = !DISubroutineType(types: !7) 334!7 = !{null, !8} 335!8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer) 336!9 = !DILocation(line: 1, column: 2, scope: !5) 337 338; // ----- 339 340; Verify the cyclic composite type is handled correctly. 341; CHECK-DAG: #[[COMP_SELF:.+]] = #llvm.di_composite_type<recId = [[REC_ID:.+]], isRecSelf = true> 342; CHECK-DAG: #[[COMP_PTR_INNER:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP_SELF]]> 343; CHECK-DAG: #[[FIELD:.+]] = #llvm.di_derived_type<tag = DW_TAG_member, name = "call_field", baseType = #[[COMP_PTR_INNER]]> 344; CHECK-DAG: #[[COMP:.+]] = #llvm.di_composite_type<recId = [[REC_ID]], tag = DW_TAG_class_type, name = "class_field", file = #{{.*}}, line = 42, flags = "TypePassByReference|NonTrivial", elements = #[[FIELD]]> 345; CHECK-DAG: #[[COMP_PTR_OUTER:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP]]> 346; CHECK-DAG: #[[VAR0:.+]] = #llvm.di_local_variable<scope = #{{.*}}, name = "class_field", file = #{{.*}}, type = #[[COMP_PTR_OUTER]]> 347 348; CHECK: @class_field 349; CHECK-SAME: %[[ARG0:[a-zA-Z0-9]+]] 350define void @class_field(ptr %arg1) { 351 ; CHECK: llvm.intr.dbg.value #[[VAR0]] = %[[ARG0]] : !llvm.ptr 352 call void @llvm.dbg.value(metadata ptr %arg1, metadata !7, metadata !DIExpression()), !dbg !9 353 ret void 354} 355 356declare void @llvm.dbg.value(metadata, metadata, metadata) 357 358!llvm.dbg.cu = !{!1} 359!llvm.module.flags = !{!0} 360!0 = !{i32 2, !"Debug Info Version", i32 3} 361!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 362!2 = !DIFile(filename: "debug-info.ll", directory: "/") 363!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 364!4 = !{!6} 365!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer) 366!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5) 367!7 = !DILocalVariable(scope: !8, name: "class_field", file: !2, type: !5); 368!8 = distinct !DISubprogram(name: "class_field", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 369!9 = !DILocation(line: 1, column: 2, scope: !8) 370 371; // ----- 372 373; CHECK-DAG: #[[NULL:.+]] = #llvm.di_null_type 374; CHECK-DAG: #llvm.di_subroutine_type<types = #[[NULL]], #[[NULL]]> 375 376declare !dbg !3 void @variadic_func() 377 378!llvm.dbg.cu = !{!1} 379!llvm.module.flags = !{!0} 380!0 = !{i32 2, !"Debug Info Version", i32 3} 381!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 382!2 = !DIFile(filename: "debug-info.ll", directory: "/") 383!3 = !DISubprogram(name: "variadic_func", scope: !2, file: !2, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, type: !4) 384!4 = !DISubroutineType(types: !5) 385!5 = !{null, null} 386 387; // ----- 388 389define void @dbg_use_before_def(ptr %arg) { 390 ; CHECK: llvm.getelementptr 391 ; CHECK-NEXT: llvm.intr.dbg.value 392 call void @llvm.dbg.value(metadata ptr %dbg_arg, metadata !7, metadata !DIExpression()), !dbg !9 393 %dbg_arg = getelementptr double, ptr %arg, i64 16 394 ret void 395} 396 397declare void @llvm.dbg.value(metadata, metadata, metadata) 398 399!llvm.dbg.cu = !{!1} 400!llvm.module.flags = !{!0} 401!0 = !{i32 2, !"Debug Info Version", i32 3} 402!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 403!2 = !DIFile(filename: "debug-info.ll", directory: "/") 404!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 405!4 = !{!6} 406!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer) 407!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5) 408!7 = !DILocalVariable(scope: !8, name: "var", file: !2, type: !5); 409!8 = distinct !DISubprogram(name: "dbg_use_before_def", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 410!9 = !DILocation(line: 1, column: 2, scope: !8) 411 412; // ----- 413 414; This test checks that broken dominance doesn't break the metadata import. 415 416; CHECK-LABEL: @dbg_broken_dominance 417define void @dbg_broken_dominance(ptr %arg, i1 %cond) { 418 br i1 %cond, label %b1, label %b2 419b1: 420 br label %b3 421b2: 422 %dbg_arg = getelementptr double, ptr %arg, i64 16 423 ; CHECK: llvm.getelementptr 424 ; CHECK-NEXT: llvm.intr.dbg.value 425 br label %b3 426b3: 427 call void @llvm.dbg.value(metadata ptr %dbg_arg, metadata !7, metadata !DIExpression()), !dbg !9 428 ret void 429} 430 431declare void @llvm.dbg.value(metadata, metadata, metadata) 432 433!llvm.dbg.cu = !{!1} 434!llvm.module.flags = !{!0} 435!0 = !{i32 2, !"Debug Info Version", i32 3} 436!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 437!2 = !DIFile(filename: "debug-info.ll", directory: "/") 438!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 439!4 = !{!6} 440!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer) 441!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5) 442!7 = !DILocalVariable(scope: !8, name: "var", file: !2, type: !5); 443!8 = distinct !DISubprogram(name: "dbg_use_before_def", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 444!9 = !DILocation(line: 1, column: 2, scope: !8) 445 446; // ----- 447 448declare i64 @callee() 449declare i32 @personality(...) 450 451; CHECK-LABEL: @dbg_broken_dominance_invoke 452define void @dbg_broken_dominance_invoke() personality ptr @personality { 453 %1 = invoke i64 @callee() 454 to label %b1 unwind label %b2 455b1: 456; CHECK: llvm.intr.dbg.value 457 call void @llvm.dbg.value(metadata i64 %1, metadata !7, metadata !DIExpression()), !dbg !9 458 ret void 459b2: 460 %2 = landingpad { ptr, i32 } 461 cleanup 462 ret void 463} 464 465declare void @llvm.dbg.value(metadata, metadata, metadata) 466 467!llvm.dbg.cu = !{!1} 468!llvm.module.flags = !{!0} 469!0 = !{i32 2, !"Debug Info Version", i32 3} 470!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 471!2 = !DIFile(filename: "debug-info.ll", directory: "/") 472!7 = !DILocalVariable(scope: !8, name: "var", file: !2); 473!8 = distinct !DISubprogram(name: "dbg_broken_dominance_invoke", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 474!9 = !DILocation(line: 1, column: 2, scope: !8) 475 476; // ----- 477 478declare i64 @callee() 479declare i32 @personality(...) 480 481; CHECK-LABEL: @dbg_broken_dominance_invoke_reordered 482define void @dbg_broken_dominance_invoke_reordered() personality ptr @personality { 483 %1 = invoke i64 @callee() 484 to label %b2 unwind label %b1 485b1: 486; CHECK: landingpad 487; CHECK: llvm.intr.dbg.value 488 %2 = landingpad { ptr, i32 } 489 cleanup 490 call void @llvm.dbg.value(metadata i64 %1, metadata !7, metadata !DIExpression()), !dbg !9 491 ret void 492b2: 493 ret void 494} 495 496declare void @llvm.dbg.value(metadata, metadata, metadata) 497 498!llvm.dbg.cu = !{!1} 499!llvm.module.flags = !{!0} 500!0 = !{i32 2, !"Debug Info Version", i32 3} 501!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 502!2 = !DIFile(filename: "debug-info.ll", directory: "/") 503!7 = !DILocalVariable(scope: !8, name: "var", file: !2); 504!8 = distinct !DISubprogram(name: "dbg_broken_dominance_invoke", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 505!9 = !DILocation(line: 1, column: 2, scope: !8) 506 507; // ----- 508 509; CHECK-DAG: #[[NAMESPACE:.+]] = #llvm.di_namespace<name = "std", exportSymbols = false> 510; CHECK-DAG: #[[SUBPROGRAM:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #[[NAMESPACE]], name = "namespace" 511 512define void @namespace(ptr %arg) { 513 call void @llvm.dbg.value(metadata ptr %arg, metadata !7, metadata !DIExpression()), !dbg !9 514 ret void 515} 516 517declare void @llvm.dbg.value(metadata, metadata, metadata) 518 519!llvm.dbg.cu = !{!1} 520!llvm.module.flags = !{!0} 521!0 = !{i32 2, !"Debug Info Version", i32 3} 522!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 523!2 = !DIFile(filename: "debug-info.ll", directory: "/") 524!7 = !DILocalVariable(scope: !8, name: "var") 525!8 = distinct !DISubprogram(name: "namespace", scope: !10, file: !2, unit: !1); 526!9 = !DILocation(line: 1, column: 2, scope: !8) 527!10 = !DINamespace(name: "std", scope: null) 528 529; // ----- 530 531; CHECK-DAG: #[[SUBPROGRAM:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "noname_variable" 532; CHECK-DAG: #[[LOCAL_VARIABLE:.+]] = #llvm.di_local_variable<scope = #[[SUBPROGRAM]]> 533 534define void @noname_variable(ptr %arg) { 535 call void @llvm.dbg.value(metadata ptr %arg, metadata !7, metadata !DIExpression()), !dbg !9 536 ret void 537} 538 539declare void @llvm.dbg.value(metadata, metadata, metadata) 540 541!llvm.dbg.cu = !{!1} 542!llvm.module.flags = !{!0} 543!0 = !{i32 2, !"Debug Info Version", i32 3} 544!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 545!2 = !DIFile(filename: "debug-info.ll", directory: "/") 546!7 = !DILocalVariable(scope: !8) 547!8 = distinct !DISubprogram(name: "noname_variable", scope: !2, file: !2, unit: !1); 548!9 = !DILocation(line: 1, column: 2, scope: !8) 549 550; // ----- 551 552; CHECK: #[[SUBPROGRAM:.*]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, file = #{{.*}}, subprogramFlags = Definition> 553; CHECK: #[[FUNC_LOC:.*]] = loc(fused<#[[SUBPROGRAM]]>[{{.*}}]) 554define void @noname_subprogram(ptr %arg) !dbg !8 { 555 ret void 556} 557 558!llvm.dbg.cu = !{!1} 559!llvm.module.flags = !{!0} 560!0 = !{i32 2, !"Debug Info Version", i32 3} 561!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 562!2 = !DIFile(filename: "debug-info.ll", directory: "/") 563!8 = distinct !DISubprogram(scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1); 564 565; // ----- 566 567; CHECK: #[[MODULE:.+]] = #llvm.di_module< 568; CHECK-SAME: file = #{{.*}}, scope = #{{.*}}, name = "module", 569; CHECK-SAME: configMacros = "bar", includePath = "/", 570; CHECK-SAME: apinotes = "/", line = 42, isDecl = true 571; CHECK-SAME: > 572; CHECK: #[[SUBPROGRAM:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #[[MODULE]], name = "func_in_module" 573 574define void @func_in_module(ptr %arg) !dbg !8 { 575 ret void 576} 577 578!llvm.dbg.cu = !{!1} 579!llvm.module.flags = !{!0} 580!0 = !{i32 2, !"Debug Info Version", i32 3} 581!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 582!2 = !DIFile(filename: "debug-info.ll", directory: "/") 583!8 = distinct !DISubprogram(name: "func_in_module", scope: !10, file: !2, unit: !1); 584!10 = !DIModule(scope: !2, name: "module", configMacros: "bar", includePath: "/", apinotes: "/", file: !2, line: 42, isDecl: true) 585 586; // ----- 587 588; Verifies that import compile units respect the distinctness of the input. 589; CHECK-LABEL: @distinct_cu_func0 590define void @distinct_cu_func0() !dbg !4 { 591 ret void 592} 593 594define void @distinct_cu_func1() !dbg !5 { 595 ret void 596} 597 598!llvm.dbg.cu = !{!0, !1} 599!llvm.module.flags = !{!3} 600 601; CHECK-COUNT-2: #llvm.di_compile_unit<id = distinct[{{[0-9]+}}]<> 602 603!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !2, producer: "clang") 604!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !2, producer: "clang") 605!2 = !DIFile(filename: "other.cpp", directory: "/") 606!3 = !{i32 2, !"Debug Info Version", i32 3} 607!4 = distinct !DISubprogram(name: "func", linkageName: "func", scope: !6, file: !6, line: 1, scopeLine: 1, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !0) 608!5 = distinct !DISubprogram(name: "func", linkageName: "func", scope: !6, file: !6, line: 1, scopeLine: 1, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !1) 609!6 = !DIFile(filename: "file.hpp", directory: "/") 610 611; // ----- 612 613; CHECK-LABEL: @declaration 614declare !dbg !1 void @declaration() 615 616; CHECK: #[[SP:.+]] = #llvm.di_subprogram< 617; CHECK-NOT: id = distinct 618; CHECK-NOT: subprogramFlags = 619; CHECK: loc(fused<#[[SP]]> 620 621!llvm.module.flags = !{!0} 622!0 = !{i32 2, !"Debug Info Version", i32 3} 623!1 = !DISubprogram(name: "declaration", scope: !2, file: !2, flags: DIFlagPrototyped, spFlags: 0) 624!2 = !DIFile(filename: "debug-info.ll", directory: "/") 625 626; // ----- 627 628; Ensure that repeated occurence of recursive subtree does not result in 629; duplicate MLIR entries. 630; 631; +--> B:B1 ----+ 632; | ^ v 633; A <---+------ B 634; | v ^ 635; +--> B:B2 ----+ 636; This should result in only one B instance. 637 638; CHECK-DAG: #[[B1_INNER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B1", baseType = #[[B_SELF:.+]]> 639; CHECK-DAG: #[[B2_INNER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B2", baseType = #[[B_SELF]]> 640; CHECK-DAG: #[[B_INNER:.+]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[B1_INNER]], #[[B2_INNER]] 641 642; CHECK-DAG: #[[B1_OUTER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B1", baseType = #[[B_INNER]]> 643; CHECK-DAG: #[[B2_OUTER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B2", baseType = #[[B_INNER]]> 644; CHECK-DAG: #[[A_OUTER:.+]] = #llvm.di_composite_type<recId = [[A_RECID:.+]], tag = DW_TAG_class_type, name = "A", {{.*}}elements = #[[B1_OUTER]], #[[B2_OUTER]] 645 646; CHECK-DAG: #[[A_SELF:.+]] = #llvm.di_composite_type<recId = [[A_RECID]] 647; CHECK-DAG: #[[B_SELF:.+]] = #llvm.di_composite_type<recId = [[B_RECID]] 648 649; CHECK: #llvm.di_subprogram<{{.*}}scope = #[[A_OUTER]] 650 651define void @class_field(ptr %arg1) !dbg !18 { 652 ret void 653} 654 655!llvm.dbg.cu = !{!1} 656!llvm.module.flags = !{!0} 657!0 = !{i32 2, !"Debug Info Version", i32 3} 658!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 659!2 = !DIFile(filename: "debug-info.ll", directory: "/") 660 661!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 662!4 = !{!7, !8} 663 664!5 = !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: !3, file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9) 665!7 = !DIDerivedType(tag: DW_TAG_member, name: "B:B1", file: !2, baseType: !5) 666!8 = !DIDerivedType(tag: DW_TAG_member, name: "B:B2", file: !2, baseType: !5) 667!9 = !{!7, !8} 668 669!18 = distinct !DISubprogram(name: "A", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1) 670 671; // ----- 672 673; Ensure that recursive cycles with multiple entry points are cached correctly. 674; 675; +---- A ----+ 676; v v 677; B <-------> C 678; This should result in a cached instance of B --> C --> B_SELF to be reused 679; when visiting B from C (after visiting B from A). 680 681; CHECK-DAG: #[[A:.+]] = #llvm.di_composite_type<{{.*}}name = "A", {{.*}}elements = #[[TO_B_OUTER:.+]], #[[TO_C_OUTER:.+]]> 682; CHECK-DAG: #llvm.di_subprogram<{{.*}}scope = #[[A]], 683 684; CHECK-DAG: #[[TO_B_OUTER]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_OUTER:.+]]> 685; CHECK-DAG: #[[B_OUTER]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[TO_C_INNER:.+]]> 686; CHECK-DAG: #[[TO_C_INNER]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_INNER:.+]]> 687; CHECK-DAG: #[[C_INNER]] = #llvm.di_composite_type<{{.*}}name = "C", {{.*}}elements = #[[TO_B_SELF:.+]]> 688; CHECK-DAG: #[[TO_B_SELF]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_SELF:.+]]> 689; CHECK-DAG: #[[B_SELF]] = #llvm.di_composite_type<recId = [[B_RECID]], isRecSelf = true> 690 691; CHECK-DAG: #[[TO_C_OUTER]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_OUTER:.+]]> 692; CHECK-DAG: #[[C_OUTER]] = #llvm.di_composite_type<{{.*}}name = "C", {{.*}}elements = #[[TO_B_OUTER]]> 693 694define void @class_field(ptr %arg1) !dbg !18 { 695 ret void 696} 697 698!llvm.dbg.cu = !{!1} 699!llvm.module.flags = !{!0} 700!0 = !{i32 2, !"Debug Info Version", i32 3} 701!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 702!2 = !DIFile(filename: "debug-info.ll", directory: "/") 703 704!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4) 705!5 = !DICompositeType(tag: DW_TAG_class_type, name: "B", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !10) 706!6 = !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9) 707 708!7 = !DIDerivedType(tag: DW_TAG_member, name: "->B", file: !2, baseType: !5) 709!8 = !DIDerivedType(tag: DW_TAG_member, name: "->C", file: !2, baseType: !6) 710!4 = !{!7, !8} 711!9 = !{!7} 712!10 = !{!8} 713 714!18 = distinct !DISubprogram(name: "SP", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1) 715 716; // ----- 717 718; Ensures that replacing a nested mutually recursive decl does not result in 719; nested duplicate recursive decls. 720; 721; A ---> B <--> C 722; ^ ^ 723; +-------------+ 724 725; CHECK-DAG: #[[A:.+]] = #llvm.di_composite_type<recId = [[A_RECID:.+]], tag = DW_TAG_class_type, name = "A", {{.*}}elements = #[[A_TO_B:.+]], #[[A_TO_C:.+]]> 726; CHECK-DAG: #llvm.di_subprogram<{{.*}}scope = #[[A]], 727; CHECK-DAG: #[[A_TO_B]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_FROM_A:.+]]> 728; CHECK-DAG: #[[A_TO_C]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_FROM_A:.+]]> 729 730; CHECK-DAG: #[[B_FROM_A]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[B_TO_C:.+]]> 731; CHECK-DAG: #[[B_TO_C]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_FROM_B:.+]]> 732; CHECK-DAG: #[[C_FROM_B]] = #llvm.di_composite_type<recId = [[C_RECID:.+]], tag = DW_TAG_class_type, name = "C", {{.*}}elements = #[[TO_A_SELF:.+]], #[[TO_B_SELF:.+]], #[[TO_C_SELF:.+]]> 733 734; CHECK-DAG: #[[C_FROM_A]] = #llvm.di_composite_type<recId = [[C_RECID]], tag = DW_TAG_class_type, name = "C", {{.*}}elements = #[[TO_A_SELF]], #[[A_TO_B:.+]], #[[TO_C_SELF]] 735 736; CHECK-DAG: #[[TO_A_SELF]] = #llvm.di_derived_type<{{.*}}name = "->A", {{.*}}baseType = #[[A_SELF:.+]]> 737; CHECK-DAG: #[[TO_B_SELF]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_SELF:.+]]> 738; CHECK-DAG: #[[TO_C_SELF]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_SELF:.+]]> 739; CHECK-DAG: #[[A_SELF]] = #llvm.di_composite_type<recId = [[A_RECID]], isRecSelf = true> 740; CHECK-DAG: #[[B_SELF]] = #llvm.di_composite_type<recId = [[B_RECID]], isRecSelf = true> 741; CHECK-DAG: #[[C_SELF]] = #llvm.di_composite_type<recId = [[C_RECID]], isRecSelf = true> 742 743define void @class_field(ptr %arg1) !dbg !18 { 744 ret void 745} 746 747!llvm.dbg.cu = !{!1} 748!llvm.module.flags = !{!0} 749!0 = !{i32 2, !"Debug Info Version", i32 3} 750!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 751!2 = !DIFile(filename: "debug-info.ll", directory: "/") 752 753!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9) 754!4 = !DICompositeType(tag: DW_TAG_class_type, name: "B", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !10) 755!5 = !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !11) 756 757!6 = !DIDerivedType(tag: DW_TAG_member, name: "->A", file: !2, baseType: !3) 758!7 = !DIDerivedType(tag: DW_TAG_member, name: "->B", file: !2, baseType: !4) 759!8 = !DIDerivedType(tag: DW_TAG_member, name: "->C", file: !2, baseType: !5) 760 761!9 = !{!7, !8} ; A -> B, C 762!10 = !{!8} ; B -> C 763!11 = !{!6, !7, !8} ; C -> A, B, C 764 765!18 = distinct !DISubprogram(name: "SP", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1) 766 767; // ----- 768 769; Verify the string type is handled correctly 770 771define void @string_type(ptr %arg1) { 772 call void @llvm.dbg.value(metadata ptr %arg1, metadata !4, metadata !DIExpression()), !dbg !10 773 call void @llvm.dbg.value(metadata ptr %arg1, metadata !9, metadata !DIExpression()), !dbg !10 774 ret void 775} 776 777!llvm.dbg.cu = !{!1} 778!llvm.module.flags = !{!0} 779!0 = !{i32 2, !"Debug Info Version", i32 3} 780!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2) 781!2 = !DIFile(filename: "debug-info.ll", directory: "/") 782!3 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 783!4 = !DILocalVariable(scope: !5, name: "string_size", file: !2, type: !3); 784!5 = distinct !DISubprogram(name: "test", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1) 785!6 = !DIStringType(name: "character(*)", stringLength: !4, size: 32, align: 8, stringLengthExpression: !8, stringLocationExpression: !7) 786!7 = !DIExpression(DW_OP_push_object_address, DW_OP_deref) 787!8 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 8) 788!9 = !DILocalVariable(scope: !5, name: "str", file: !2, type: !6, flags: 64); 789!10 = !DILocation(line: 1, column: 2, scope: !5) 790 791; CHECK: #[[VAR:.+]] = #llvm.di_local_variable<{{.*}}name = "string_size"{{.*}}> 792; CHECK: #llvm.di_string_type<tag = DW_TAG_string_type, name = "character(*)" 793; CHECK-SAME: sizeInBits = 32 794; CHECK-SAME: alignInBits = 8 795; CHECK-SAME: stringLength = #[[VAR]] 796; CHECK-SAME: stringLengthExp = <[DW_OP_push_object_address, DW_OP_plus_uconst(8)]> 797; CHECK-SAME: stringLocationExp = <[DW_OP_push_object_address, DW_OP_deref]>> 798; CHECK: #di_local_variable1 = #llvm.di_local_variable<scope = #di_subprogram, name = "str", file = #di_file, type = #di_string_type, flags = Artificial> 799 800; // ----- 801 802; Test that imported entities for a functions are handled correctly. 803 804define void @imp_fn() !dbg !12 { 805 ret void 806} 807 808!llvm.module.flags = !{!10} 809!llvm.dbg.cu = !{!4} 810 811!2 = !DIModule(scope: !4, name: "mod1", file: !3, line: 1) 812!3 = !DIFile(filename: "test.f90", directory: "") 813!4 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !3) 814!8 = !DIModule(scope: !4, name: "mod1", file: !3, line: 5) 815!10 = !{i32 2, !"Debug Info Version", i32 3} 816!12 = distinct !DISubprogram(name: "imp_fn", linkageName: "imp_fn", scope: !3, file: !3, line: 10, type: !14, scopeLine: 10, spFlags: DISPFlagDefinition, unit: !4, retainedNodes: !16) 817!14 = !DISubroutineType(cc: DW_CC_program, types: !15) 818!15 = !{} 819!16 = !{!17} 820!17 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !8, file: !3, line: 1, elements: !15) 821 822; CHECK-DAG: #[[M:.+]] = #llvm.di_module<{{.*}}name = "mod1"{{.*}}> 823; CHECK-DAG: #[[SP_REC:.+]] = #llvm.di_subprogram<recId = distinct{{.*}}<>, isRecSelf = true> 824; CHECK-DAG: #[[IE:.+]] = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #[[SP_REC]], entity = #[[M]]{{.*}}> 825; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "imp_fn"{{.*}}retainedNodes = #[[IE]]> 826 827; // ----- 828 829; Test that annotations are handled correctly 830 831; CHECK-LABEL: @fn_with_annotations 832 833define void @fn_with_annotations() !dbg !12 { 834 ret void 835} 836 837!llvm.module.flags = !{!10} 838!llvm.dbg.cu = !{!4} 839 840!2 = !DIModule(scope: !4, name: "mod1", file: !3, line: 1) 841!3 = !DIFile(filename: "test.f90", directory: "") 842!4 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !3) 843!8 = !DIModule(scope: !4, name: "mod1", file: !3, line: 5) 844!10 = !{i32 2, !"Debug Info Version", i32 3} 845!12 = distinct !DISubprogram(name: "fn_with_annotations", linkageName: "fn_with_annotations", scope: !3, file: !3, line: 10, type: !14, scopeLine: 10, spFlags: DISPFlagDefinition, unit: !4, annotations: !16) 846!14 = !DISubroutineType(cc: DW_CC_program, types: !15) 847!15 = !{} 848!16 = !{!17} 849!17 = !{!"foo", !"bar"} 850 851 852; CHECK-DAG: #llvm.di_subprogram<{{.*}}name = "fn_with_annotations"{{.*}}annotations = #llvm.di_annotation<name = "foo", value = "bar">> 853 854; // ----- 855 856@block = common global [4 x i8] zeroinitializer, !dbg !0 857 858define void @test() !dbg !3 { 859 ret void 860} 861 862!llvm.module.flags = !{!10} 863!llvm.dbg.cu = !{!7} 864 865!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) 866!1 = distinct !DIGlobalVariable(name: "alpha", scope: !2, file: !4, type: !9) 867!2 = !DICommonBlock(scope: !3, declaration: null, name: "block", file: !4, line: 3) 868!3 = distinct !DISubprogram(name: "test", scope: !4, file: !4, spFlags: DISPFlagDefinition, unit: !7) 869!4 = !DIFile(filename: "test.f90", directory: "") 870!7 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !4) 871!9 = !DIBasicType(name: "integer", size: 32, encoding: DW_ATE_signed) 872!10 = !{i32 2, !"Debug Info Version", i32 3} 873 874; CHECK: #[[FILE:.+]] = #llvm.di_file<"test.f90" in ""> 875; CHECK: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "test"{{.*}}> 876; CHECK: #llvm.di_common_block<scope = #[[SP]], name = "block", file = #[[FILE]], line = 3> 877 878; // ----- 879 880@data = external global i64, !dbg !0, !dbg !5 881 882!llvm.module.flags = !{!8} 883!llvm.dbg.cu = !{!2} 884 885!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) 886!1 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 2, type: !7) 887!2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, globals: !4) 888!3 = !DIFile(filename: "test.c", directory: "") 889!4 = !{!0, !5} 890!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression()) 891!6 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 3, type: !7) 892!7 = !DIBasicType(name: "int", size: 32) 893!8 = !{i32 2, !"Debug Info Version", i32 3} 894 895 896; CHECK: #[[VAR1:.+]] = #llvm.di_global_variable<{{.*}}name = "a"{{.*}}> 897; CHECK: #[[VAR2:.+]] = #llvm.di_global_variable<{{.*}}name = "b"{{.*}}> 898; CHECK: #[[EXP1:.+]] = #llvm.di_global_variable_expression<var = #[[VAR1]], expr = <>> 899; CHECK: #[[EXP2:.+]] = #llvm.di_global_variable_expression<var = #[[VAR2]], expr = <>> 900; CHECK: llvm.mlir.global external @data() {{{.*}}dbg_exprs = [#[[EXP1]], #[[EXP2]]]} : i64 901