brintos

brintos / llvm-project-archived public Read only

0
0
Text · 40.8 KiB · 61376b8 Raw
900 lines · plain
1; RUN: mlir-translate -import-llvm -mlir-print-debuginfo -split-input-file %s | FileCheck %s2 3; CHECK: #[[$UNKNOWN_LOC:.+]] = loc(unknown)4 5; CHECK-LABEL: @module_loc(6define i32 @module_loc(i32 %0) {7entry:8  br label %next9end:10  ; CHECK: ^{{.*}}(%{{.+}}: i32 loc(unknown)):11  %1 = phi i32 [ %2, %next ]12  ret i32 %113next:14  ; CHECK: = llvm.mul %{{.+}}, %{{.+}} : i32 loc(#[[$UNKNOWN_LOC]])15  %2 = mul i32 %0, %016  br label %end17}18 19; // -----20 21; CHECK-LABEL: @instruction_loc22define i32 @instruction_loc(i32 %arg1) {23  ; CHECK: llvm.add {{.*}} loc(#[[FILE_LOC:.*]])24  %1 = add i32 %arg1, %arg1, !dbg !525 26  ; CHECK: llvm.mul {{.*}} loc(#[[CALLSITE_LOC:.*]])27  %2 = mul i32 %1, %1, !dbg !728 29  ret i32 %230}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_block56define i32 @lexical_block(i32 %arg1) {57  ; CHECK: llvm.add {{.*}} loc(#[[LOC0:.*]])58  %1 = add i32 %arg1, %arg1, !dbg !659 60  ; CHECK: llvm.mul {{.*}} loc(#[[LOC1:.*]])61  %2 = mul i32 %arg1, %arg1, !dbg !762 63  ret i32 %264}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_file86define i32 @lexical_block_file(i32 %arg1) {87  ; CHECK: llvm.add {{.*}} loc(#[[LOC0:.*]])88  %1 = add i32 %arg1, %arg1, !dbg !689 90  ; CHECK: llvm.mul {{.*}} loc(#[[LOC1:.*]])91  %2 = mul i32 %arg1, %arg1, !dbg !792 93  ret i32 %294}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_type116; 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 void122}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 void145}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 i64176 177define void @composite_type() !dbg !3 {178  ret void179}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, splitDebugFilename = "test.dwo">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 void225}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, splitDebugFilename: "test.dwo")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_loc240define void @func_loc() !dbg !3 {241  ret void242}243; CHECK-DAG: #[[FILE_LOC:.+]] = loc("debug-info.ll":42:0)244; CHECK-DAG: #[[SP:.+]] =  #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "func_loc", file = #{{.*}}, line = 42, subprogramFlags = Definition>245 246; CHECK: loc(fused<#[[SP]]>[#[[FILE_LOC]]]247 248!llvm.dbg.cu = !{!1}249!llvm.module.flags = !{!0}250!0 = !{i32 2, !"Debug Info Version", i32 3}251!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)252!2 = !DIFile(filename: "debug-info.ll", directory: "/")253!3 = distinct !DISubprogram(name: "func_loc", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1, line: 42)254 255; // -----256 257; Verify the module location is set to the source filename.258; CHECK: loc("debug-info.ll":0:0)259source_filename = "debug-info.ll"260 261; // -----262 263; NOTE: The debug intrinsics are reordered as a side-effect of the dominance-264;       preserving measures needed to import LLVM IR.265 266; CHECK: #[[FILE:.+]] = #llvm.di_file<267; CHECK: #[[$SP:.+]] = #llvm.di_subprogram<268; CHECK: #[[$LABEL:.+]] = #llvm.di_label<scope = #[[$SP]], name = "label", file = #[[FILE]], line = 42>269; CHECK: #[[$VAR1:.+]] = #llvm.di_local_variable<scope = #[[$SP]], name = "arg">270; CHECK: #[[$VAR0:.+]] = #llvm.di_local_variable<scope = #[[$SP]], name = "arg", file = #[[FILE]], line = 1, arg = 1, alignInBits = 32, type = #{{.*}}>271 272; CHECK-LABEL: @intrinsic273; CHECK-SAME:  %[[ARG0:[a-zA-Z0-9]+]]274; CHECK-SAME:  %[[ARG1:[a-zA-Z0-9]+]]275define void @intrinsic(i64 %0, ptr %1) {276  ; CHECK: llvm.intr.dbg.declare #[[$VAR1]] = %[[ARG1]] : !llvm.ptr loc(#[[LOC1:.+]])277  ; 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:.+]])278  ; 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:.+]])279  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 !7280  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 !7281  call void @llvm.dbg.declare(metadata ptr %1, metadata !6, metadata !DIExpression()), !dbg !9282  ; CHECK: llvm.intr.dbg.label #[[$LABEL]] loc(#[[LOC1:.+]])283  call void @llvm.dbg.label(metadata !10), !dbg !9284  ret void285}286 287; CHECK: #[[LOC1]] = loc(fused<#[[$SP]]>[{{.*}}])288; CHECK: #[[LOC0]] = loc(fused<#[[$SP]]>[{{.*}}])289 290declare void @llvm.dbg.value(metadata, metadata, metadata)291declare void @llvm.dbg.declare(metadata, metadata, metadata)292declare void @llvm.dbg.label(metadata)293 294!llvm.dbg.cu = !{!1}295!llvm.module.flags = !{!0}296!0 = !{i32 2, !"Debug Info Version", i32 3}297!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)298!2 = !DIFile(filename: "debug-info.ll", directory: "/")299!3 = distinct !DISubprogram(name: "intrinsic", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)300!4 = !DIBasicType(name: "int")301!5 = !DILocalVariable(scope: !3, name: "arg", file: !2, line: 1, arg: 1, align: 32, type: !4);302!6 = !DILocalVariable(scope: !3, name: "arg")303!7 = !DILocation(line: 1, column: 2, scope: !3)304!8 = !DILocation(line: 2, column: 2, scope: !3)305!9 = !DILocation(line: 3, column: 2, scope: !3)306!10 = !DILabel(scope: !3, name: "label", file: !2, line: 42)307 308; // -----309 310; CHECK-LABEL: @class_method311define void @class_method() {312  ; CHECK: llvm.return loc(#[[LOC:.+]])313  ret void, !dbg !9314}315 316; Verify the cyclic subprogram is handled correctly.317; CHECK-DAG: #[[SP_SELF:.+]] = #llvm.di_subprogram<recId = [[REC_ID:.+]], isRecSelf = true>318; CHECK-DAG: #[[COMP:.+]] = #llvm.di_composite_type<tag = DW_TAG_class_type, name = "class_name", file = #{{.*}}, line = 42, flags = "TypePassByReference|NonTrivial", elements = #[[SP_SELF]]>319; CHECK-DAG: #[[COMP_PTR:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP]], sizeInBits = 64>320; CHECK-DAG: #[[SP_TYPE:.+]] = #llvm.di_subroutine_type<types = #{{.*}}, #[[COMP_PTR]]>321; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<recId = [[REC_ID]], id = [[SP_ID:.+]], compileUnit = #{{.*}}, scope = #[[COMP]], name = "class_method", file = #{{.*}}, subprogramFlags = Definition, type = #[[SP_TYPE]]>322; CHECK-DAG: #[[LOC]] = loc(fused<#[[SP]]>323 324!llvm.dbg.cu = !{!1}325!llvm.module.flags = !{!0}326!0 = !{i32 2, !"Debug Info Version", i32 3}327!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)328!2 = !DIFile(filename: "debug-info.ll", directory: "/")329!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_name", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)330!4 = !{!5}331!5 = distinct !DISubprogram(name: "class_method", scope: !3, file: !2, type: !6, spFlags: DISPFlagDefinition, unit: !1)332!6 = !DISubroutineType(types: !7)333!7 = !{null, !8}334!8 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, size: 64, flags: DIFlagArtificial | DIFlagObjectPointer)335!9 = !DILocation(line: 1, column: 2, scope: !5)336 337; // -----338 339; Verify the cyclic composite type is handled correctly.340; CHECK-DAG: #[[COMP_SELF:.+]] = #llvm.di_composite_type<recId = [[REC_ID:.+]], isRecSelf = true>341; CHECK-DAG: #[[COMP_PTR_INNER:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP_SELF]]>342; CHECK-DAG: #[[FIELD:.+]] = #llvm.di_derived_type<tag = DW_TAG_member, name = "call_field", baseType = #[[COMP_PTR_INNER]]>343; 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]]>344; CHECK-DAG: #[[COMP_PTR_OUTER:.+]] = #llvm.di_derived_type<tag = DW_TAG_pointer_type, baseType = #[[COMP]]>345; CHECK-DAG: #[[VAR0:.+]] = #llvm.di_local_variable<scope = #{{.*}}, name = "class_field", file = #{{.*}}, type = #[[COMP_PTR_OUTER]]>346 347; CHECK: @class_field348; CHECK-SAME:  %[[ARG0:[a-zA-Z0-9]+]]349define void @class_field(ptr %arg1) {350  ; CHECK: llvm.intr.dbg.value #[[VAR0]] = %[[ARG0]] : !llvm.ptr351  call void @llvm.dbg.value(metadata ptr %arg1, metadata !7, metadata !DIExpression()), !dbg !9352  ret void353}354 355declare void @llvm.dbg.value(metadata, metadata, metadata)356 357!llvm.dbg.cu = !{!1}358!llvm.module.flags = !{!0}359!0 = !{i32 2, !"Debug Info Version", i32 3}360!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)361!2 = !DIFile(filename: "debug-info.ll", directory: "/")362!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)363!4 = !{!6}364!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer)365!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5)366!7 = !DILocalVariable(scope: !8, name: "class_field", file: !2, type: !5);367!8 = distinct !DISubprogram(name: "class_field", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)368!9 = !DILocation(line: 1, column: 2, scope: !8)369 370; // -----371 372; CHECK-DAG: #[[NULL:.+]] = #llvm.di_null_type373; CHECK-DAG: #llvm.di_subroutine_type<types = #[[NULL]], #[[NULL]]>374 375declare !dbg !3 void @variadic_func()376 377!llvm.dbg.cu = !{!1}378!llvm.module.flags = !{!0}379!0 = !{i32 2, !"Debug Info Version", i32 3}380!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)381!2 = !DIFile(filename: "debug-info.ll", directory: "/")382!3 = !DISubprogram(name: "variadic_func", scope: !2, file: !2, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, type: !4)383!4 = !DISubroutineType(types: !5)384!5 = !{null, null}385 386; // -----387 388define void @dbg_use_before_def(ptr %arg) {389  ; CHECK: llvm.getelementptr390  ; CHECK-NEXT: llvm.intr.dbg.value391  call void @llvm.dbg.value(metadata ptr %dbg_arg, metadata !7, metadata !DIExpression()), !dbg !9392  %dbg_arg = getelementptr double, ptr %arg, i64 16393  ret void394}395 396declare void @llvm.dbg.value(metadata, metadata, metadata)397 398!llvm.dbg.cu = !{!1}399!llvm.module.flags = !{!0}400!0 = !{i32 2, !"Debug Info Version", i32 3}401!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)402!2 = !DIFile(filename: "debug-info.ll", directory: "/")403!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)404!4 = !{!6}405!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer)406!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5)407!7 = !DILocalVariable(scope: !8, name: "var", file: !2, type: !5);408!8 = distinct !DISubprogram(name: "dbg_use_before_def", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)409!9 = !DILocation(line: 1, column: 2, scope: !8)410 411; // -----412 413; This test checks that broken dominance doesn't break the metadata import.414 415; CHECK-LABEL: @dbg_broken_dominance416define void @dbg_broken_dominance(ptr %arg, i1 %cond) {417  br i1 %cond, label %b1, label %b2418b1:419  br label %b3420b2:421  %dbg_arg = getelementptr double, ptr %arg, i64 16422  ; CHECK: llvm.getelementptr423  ; CHECK-NEXT: llvm.intr.dbg.value424  br label %b3425b3:426  call void @llvm.dbg.value(metadata ptr %dbg_arg, metadata !7, metadata !DIExpression()), !dbg !9427  ret void428}429 430declare void @llvm.dbg.value(metadata, metadata, metadata)431 432!llvm.dbg.cu = !{!1}433!llvm.module.flags = !{!0}434!0 = !{i32 2, !"Debug Info Version", i32 3}435!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)436!2 = !DIFile(filename: "debug-info.ll", directory: "/")437!3 = !DICompositeType(tag: DW_TAG_class_type, name: "class_field", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)438!4 = !{!6}439!5 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, flags: DIFlagArtificial | DIFlagObjectPointer)440!6 = !DIDerivedType(tag: DW_TAG_member, name: "call_field", file: !2, baseType: !5)441!7 = !DILocalVariable(scope: !8, name: "var", file: !2, type: !5);442!8 = distinct !DISubprogram(name: "dbg_use_before_def", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)443!9 = !DILocation(line: 1, column: 2, scope: !8)444 445; // -----446 447declare i64 @callee()448declare i32 @personality(...)449 450; CHECK-LABEL: @dbg_broken_dominance_invoke451define void @dbg_broken_dominance_invoke() personality ptr @personality {452  %1 = invoke i64 @callee()453          to label %b1 unwind label %b2454b1:455; CHECK: llvm.intr.dbg.value456  call void @llvm.dbg.value(metadata i64 %1, metadata !7, metadata !DIExpression()), !dbg !9457  ret void458b2:459  %2 = landingpad { ptr, i32 }460          cleanup461  ret void462}463 464declare void @llvm.dbg.value(metadata, metadata, metadata)465 466!llvm.dbg.cu = !{!1}467!llvm.module.flags = !{!0}468!0 = !{i32 2, !"Debug Info Version", i32 3}469!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)470!2 = !DIFile(filename: "debug-info.ll", directory: "/")471!7 = !DILocalVariable(scope: !8, name: "var", file: !2);472!8 = distinct !DISubprogram(name: "dbg_broken_dominance_invoke", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)473!9 = !DILocation(line: 1, column: 2, scope: !8)474 475; // -----476 477declare i64 @callee()478declare i32 @personality(...)479 480; CHECK-LABEL: @dbg_broken_dominance_invoke_reordered481define void @dbg_broken_dominance_invoke_reordered() personality ptr @personality {482  %1 = invoke i64 @callee()483          to label %b2 unwind label %b1484b1:485; CHECK: landingpad486; CHECK: llvm.intr.dbg.value487  %2 = landingpad { ptr, i32 }488          cleanup489  call void @llvm.dbg.value(metadata i64 %1, metadata !7, metadata !DIExpression()), !dbg !9490  ret void491b2:492  ret void493}494 495declare void @llvm.dbg.value(metadata, metadata, metadata)496 497!llvm.dbg.cu = !{!1}498!llvm.module.flags = !{!0}499!0 = !{i32 2, !"Debug Info Version", i32 3}500!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)501!2 = !DIFile(filename: "debug-info.ll", directory: "/")502!7 = !DILocalVariable(scope: !8, name: "var", file: !2);503!8 = distinct !DISubprogram(name: "dbg_broken_dominance_invoke", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)504!9 = !DILocation(line: 1, column: 2, scope: !8)505 506; // -----507 508; CHECK-DAG: #[[NAMESPACE:.+]] = #llvm.di_namespace<name = "std", exportSymbols = false>509; CHECK-DAG: #[[SUBPROGRAM:.+]] =  #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #[[NAMESPACE]], name = "namespace"510 511define void @namespace(ptr %arg) {512  call void @llvm.dbg.value(metadata ptr %arg, metadata !7, metadata !DIExpression()), !dbg !9513  ret void514}515 516declare void @llvm.dbg.value(metadata, metadata, metadata)517 518!llvm.dbg.cu = !{!1}519!llvm.module.flags = !{!0}520!0 = !{i32 2, !"Debug Info Version", i32 3}521!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)522!2 = !DIFile(filename: "debug-info.ll", directory: "/")523!7 = !DILocalVariable(scope: !8, name: "var")524!8 = distinct !DISubprogram(name: "namespace", scope: !10, file: !2, unit: !1);525!9 = !DILocation(line: 1, column: 2, scope: !8)526!10 = !DINamespace(name: "std", scope: null)527 528; // -----529 530; CHECK-DAG: #[[SUBPROGRAM:.+]] =  #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, name = "noname_variable"531; CHECK-DAG: #[[LOCAL_VARIABLE:.+]] =  #llvm.di_local_variable<scope = #[[SUBPROGRAM]]>532 533define void @noname_variable(ptr %arg) {534  call void @llvm.dbg.value(metadata ptr %arg, metadata !7, metadata !DIExpression()), !dbg !9535  ret void536}537 538declare void @llvm.dbg.value(metadata, metadata, metadata)539 540!llvm.dbg.cu = !{!1}541!llvm.module.flags = !{!0}542!0 = !{i32 2, !"Debug Info Version", i32 3}543!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)544!2 = !DIFile(filename: "debug-info.ll", directory: "/")545!7 = !DILocalVariable(scope: !8)546!8 = distinct !DISubprogram(name: "noname_variable", scope: !2, file: !2, unit: !1);547!9 = !DILocation(line: 1, column: 2, scope: !8)548 549; // -----550 551; CHECK: #[[SUBPROGRAM:.*]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #{{.*}}, file = #{{.*}}, subprogramFlags = Definition>552; CHECK: #[[FUNC_LOC:.*]] = loc(fused<#[[SUBPROGRAM]]>[{{.*}}])553define void @noname_subprogram(ptr %arg) !dbg !8 {554  ret void555}556 557!llvm.dbg.cu = !{!1}558!llvm.module.flags = !{!0}559!0 = !{i32 2, !"Debug Info Version", i32 3}560!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)561!2 = !DIFile(filename: "debug-info.ll", directory: "/")562!8 = distinct !DISubprogram(scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1);563 564; // -----565 566; CHECK:      #[[MODULE:.+]] = #llvm.di_module<567; CHECK-SAME: file = #{{.*}}, scope = #{{.*}}, name = "module",568; CHECK-SAME: configMacros = "bar", includePath = "/",569; CHECK-SAME: apinotes = "/", line = 42, isDecl = true570; CHECK-SAME: >571; CHECK: #[[SUBPROGRAM:.+]] = #llvm.di_subprogram<id = distinct[{{.*}}]<>, compileUnit = #{{.*}}, scope = #[[MODULE]], name = "func_in_module"572 573define void @func_in_module(ptr %arg) !dbg !8 {574  ret void575}576 577!llvm.dbg.cu = !{!1}578!llvm.module.flags = !{!0}579!0 = !{i32 2, !"Debug Info Version", i32 3}580!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)581!2 = !DIFile(filename: "debug-info.ll", directory: "/")582!8 = distinct !DISubprogram(name: "func_in_module", scope: !10, file: !2, unit: !1);583!10 = !DIModule(scope: !2, name: "module", configMacros: "bar", includePath: "/", apinotes: "/", file: !2, line: 42, isDecl: true)584 585; // -----586 587; Verifies that import compile units respect the distinctness of the input.588; CHECK-LABEL: @distinct_cu_func0589define void @distinct_cu_func0() !dbg !4 {590  ret void591}592 593define void @distinct_cu_func1() !dbg !5 {594  ret void595}596 597!llvm.dbg.cu = !{!0, !1}598!llvm.module.flags = !{!3}599 600; CHECK-COUNT-2: #llvm.di_compile_unit<id = distinct[{{[0-9]+}}]<>601 602!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !2, producer: "clang")603!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !2, producer: "clang")604!2 = !DIFile(filename: "other.cpp", directory: "/")605!3 = !{i32 2, !"Debug Info Version", i32 3}606!4 = distinct !DISubprogram(name: "func", linkageName: "func", scope: !6, file: !6, line: 1, scopeLine: 1, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !0)607!5 = distinct !DISubprogram(name: "func", linkageName: "func", scope: !6, file: !6, line: 1, scopeLine: 1, flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: !1)608!6 = !DIFile(filename: "file.hpp", directory: "/")609 610; // -----611 612; CHECK-LABEL: @declaration613declare !dbg !1 void @declaration()614 615; CHECK: #[[SP:.+]] = #llvm.di_subprogram<616; CHECK-NOT: id = distinct617; CHECK-NOT: subprogramFlags =618; CHECK: loc(fused<#[[SP]]>619 620!llvm.module.flags = !{!0}621!0 = !{i32 2, !"Debug Info Version", i32 3}622!1 = !DISubprogram(name: "declaration", scope: !2, file: !2, flags: DIFlagPrototyped, spFlags: 0)623!2 = !DIFile(filename: "debug-info.ll", directory: "/")624 625; // -----626 627; Ensure that repeated occurence of recursive subtree does not result in628; duplicate MLIR entries.629;630; +--> B:B1 ----+631; |     ^       v632; A <---+------ B633; |     v       ^634; +--> B:B2 ----+635; This should result in only one B instance.636 637; CHECK-DAG: #[[B1_INNER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B1", baseType = #[[B_SELF:.+]]>638; CHECK-DAG: #[[B2_INNER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B2", baseType = #[[B_SELF]]>639; CHECK-DAG: #[[B_INNER:.+]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[B1_INNER]], #[[B2_INNER]]640 641; CHECK-DAG: #[[B1_OUTER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B1", baseType = #[[B_INNER]]>642; CHECK-DAG: #[[B2_OUTER:.+]] = #llvm.di_derived_type<{{.*}}name = "B:B2", baseType = #[[B_INNER]]>643; CHECK-DAG: #[[A_OUTER:.+]] = #llvm.di_composite_type<recId = [[A_RECID:.+]], tag = DW_TAG_class_type, name = "A", {{.*}}elements = #[[B1_OUTER]], #[[B2_OUTER]]644 645; CHECK-DAG: #[[A_SELF:.+]] = #llvm.di_composite_type<recId = [[A_RECID]]646; CHECK-DAG: #[[B_SELF:.+]] = #llvm.di_composite_type<recId = [[B_RECID]]647 648; CHECK: #llvm.di_subprogram<{{.*}}scope = #[[A_OUTER]]649 650define void @class_field(ptr %arg1) !dbg !18 {651  ret void652}653 654!llvm.dbg.cu = !{!1}655!llvm.module.flags = !{!0}656!0 = !{i32 2, !"Debug Info Version", i32 3}657!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)658!2 = !DIFile(filename: "debug-info.ll", directory: "/")659 660!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)661!4 = !{!7, !8}662 663!5 = !DICompositeType(tag: DW_TAG_class_type, name: "B", scope: !3, file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9)664!7 = !DIDerivedType(tag: DW_TAG_member, name: "B:B1", file: !2, baseType: !5)665!8 = !DIDerivedType(tag: DW_TAG_member, name: "B:B2", file: !2, baseType: !5)666!9 = !{!7, !8}667 668!18 = distinct !DISubprogram(name: "A", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1)669 670; // -----671 672; Ensure that recursive cycles with multiple entry points are cached correctly.673;674; +---- A ----+675; v           v676; B <-------> C677; This should result in a cached instance of B --> C --> B_SELF to be reused678; when visiting B from C (after visiting B from A).679 680; CHECK-DAG: #[[A:.+]] = #llvm.di_composite_type<{{.*}}name = "A", {{.*}}elements = #[[TO_B_OUTER:.+]], #[[TO_C_OUTER:.+]]>681; CHECK-DAG: #llvm.di_subprogram<{{.*}}scope = #[[A]],682 683; CHECK-DAG: #[[TO_B_OUTER]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_OUTER:.+]]>684; CHECK-DAG: #[[B_OUTER]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[TO_C_INNER:.+]]>685; CHECK-DAG: #[[TO_C_INNER]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_INNER:.+]]>686; CHECK-DAG: #[[C_INNER]] = #llvm.di_composite_type<{{.*}}name = "C", {{.*}}elements = #[[TO_B_SELF:.+]]>687; CHECK-DAG: #[[TO_B_SELF]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_SELF:.+]]>688; CHECK-DAG: #[[B_SELF]] = #llvm.di_composite_type<recId = [[B_RECID]], isRecSelf = true>689 690; CHECK-DAG: #[[TO_C_OUTER]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_OUTER:.+]]>691; CHECK-DAG: #[[C_OUTER]] = #llvm.di_composite_type<{{.*}}name = "C", {{.*}}elements = #[[TO_B_OUTER]]>692 693define void @class_field(ptr %arg1) !dbg !18 {694  ret void695}696 697!llvm.dbg.cu = !{!1}698!llvm.module.flags = !{!0}699!0 = !{i32 2, !"Debug Info Version", i32 3}700!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)701!2 = !DIFile(filename: "debug-info.ll", directory: "/")702 703!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !4)704!5 = !DICompositeType(tag: DW_TAG_class_type, name: "B", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !10)705!6 = !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9)706 707!7 = !DIDerivedType(tag: DW_TAG_member, name: "->B", file: !2, baseType: !5)708!8 = !DIDerivedType(tag: DW_TAG_member, name: "->C", file: !2, baseType: !6)709!4 = !{!7, !8}710!9 = !{!7}711!10 = !{!8}712 713!18 = distinct !DISubprogram(name: "SP", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1)714 715; // -----716 717; Ensures that replacing a nested mutually recursive decl does not result in718; nested duplicate recursive decls.719;720; A ---> B <--> C721; ^             ^722; +-------------+723 724; CHECK-DAG: #[[A:.+]] = #llvm.di_composite_type<recId = [[A_RECID:.+]], tag = DW_TAG_class_type, name = "A", {{.*}}elements = #[[A_TO_B:.+]], #[[A_TO_C:.+]]>725; CHECK-DAG: #llvm.di_subprogram<{{.*}}scope = #[[A]],726; CHECK-DAG: #[[A_TO_B]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_FROM_A:.+]]>727; CHECK-DAG: #[[A_TO_C]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_FROM_A:.+]]>728 729; CHECK-DAG: #[[B_FROM_A]] = #llvm.di_composite_type<recId = [[B_RECID:.+]], tag = DW_TAG_class_type, name = "B", {{.*}}elements = #[[B_TO_C:.+]]>730; CHECK-DAG: #[[B_TO_C]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_FROM_B:.+]]>731; 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:.+]]>732 733; 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]]734 735; CHECK-DAG: #[[TO_A_SELF]] = #llvm.di_derived_type<{{.*}}name = "->A", {{.*}}baseType = #[[A_SELF:.+]]>736; CHECK-DAG: #[[TO_B_SELF]] = #llvm.di_derived_type<{{.*}}name = "->B", {{.*}}baseType = #[[B_SELF:.+]]>737; CHECK-DAG: #[[TO_C_SELF]] = #llvm.di_derived_type<{{.*}}name = "->C", {{.*}}baseType = #[[C_SELF:.+]]>738; CHECK-DAG: #[[A_SELF]] = #llvm.di_composite_type<recId = [[A_RECID]], isRecSelf = true>739; CHECK-DAG: #[[B_SELF]] = #llvm.di_composite_type<recId = [[B_RECID]], isRecSelf = true>740; CHECK-DAG: #[[C_SELF]] = #llvm.di_composite_type<recId = [[C_RECID]], isRecSelf = true>741 742define void @class_field(ptr %arg1) !dbg !18 {743  ret void744}745 746!llvm.dbg.cu = !{!1}747!llvm.module.flags = !{!0}748!0 = !{i32 2, !"Debug Info Version", i32 3}749!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)750!2 = !DIFile(filename: "debug-info.ll", directory: "/")751 752!3 = !DICompositeType(tag: DW_TAG_class_type, name: "A", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !9)753!4 = !DICompositeType(tag: DW_TAG_class_type, name: "B", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !10)754!5 = !DICompositeType(tag: DW_TAG_class_type, name: "C", file: !2, line: 42, flags: DIFlagTypePassByReference | DIFlagNonTrivial, elements: !11)755 756!6 = !DIDerivedType(tag: DW_TAG_member, name: "->A", file: !2, baseType: !3)757!7 = !DIDerivedType(tag: DW_TAG_member, name: "->B", file: !2, baseType: !4)758!8 = !DIDerivedType(tag: DW_TAG_member, name: "->C", file: !2, baseType: !5)759 760!9 = !{!7, !8} ; A -> B, C761!10 = !{!8} ; B -> C762!11 = !{!6, !7, !8} ; C -> A, B, C763 764!18 = distinct !DISubprogram(name: "SP", scope: !3, file: !2, spFlags: DISPFlagDefinition, unit: !1)765 766; // -----767 768; Verify the string type is handled correctly769 770define void @string_type(ptr %arg1) {771  call void @llvm.dbg.value(metadata ptr %arg1, metadata !4, metadata !DIExpression()), !dbg !10772  call void @llvm.dbg.value(metadata ptr %arg1, metadata !9, metadata !DIExpression()), !dbg !10773  ret void774}775 776!llvm.dbg.cu = !{!1}777!llvm.module.flags = !{!0}778!0 = !{i32 2, !"Debug Info Version", i32 3}779!1 = distinct !DICompileUnit(language: DW_LANG_C, file: !2)780!2 = !DIFile(filename: "debug-info.ll", directory: "/")781!3 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)782!4 = !DILocalVariable(scope: !5, name: "string_size", file: !2, type: !3);783!5 = distinct !DISubprogram(name: "test", scope: !2, file: !2, spFlags: DISPFlagDefinition, unit: !1)784!6 = !DIStringType(name: "character(*)", stringLength: !4, size: 32, align: 8, stringLengthExpression: !8, stringLocationExpression: !7)785!7 = !DIExpression(DW_OP_push_object_address, DW_OP_deref)786!8 = !DIExpression(DW_OP_push_object_address, DW_OP_plus_uconst, 8)787!9 = !DILocalVariable(scope: !5, name: "str", file: !2, type: !6, flags: 64);788!10 = !DILocation(line: 1, column: 2, scope: !5)789 790; CHECK: #[[VAR:.+]] = #llvm.di_local_variable<{{.*}}name = "string_size"{{.*}}>791; CHECK: #llvm.di_string_type<tag = DW_TAG_string_type, name = "character(*)"792; CHECK-SAME: sizeInBits = 32793; CHECK-SAME: alignInBits = 8794; CHECK-SAME: stringLength = #[[VAR]]795; CHECK-SAME: stringLengthExp = <[DW_OP_push_object_address, DW_OP_plus_uconst(8)]>796; CHECK-SAME: stringLocationExp = <[DW_OP_push_object_address, DW_OP_deref]>>797; CHECK: #di_local_variable1 = #llvm.di_local_variable<scope = #di_subprogram, name = "str", file = #di_file, type = #di_string_type, flags = Artificial>798 799; // -----800 801; Test that imported entities for a functions are handled correctly.802 803define void @imp_fn() !dbg !12 {804  ret void805}806 807!llvm.module.flags = !{!10}808!llvm.dbg.cu = !{!4}809 810!2 = !DIModule(scope: !4, name: "mod1", file: !3, line: 1)811!3 = !DIFile(filename: "test.f90", directory: "")812!4 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !3)813!8 = !DIModule(scope: !4, name: "mod1", file: !3, line: 5)814!10 = !{i32 2, !"Debug Info Version", i32 3}815!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)816!14 = !DISubroutineType(cc: DW_CC_program, types: !15)817!15 = !{}818!16 = !{!17}819!17 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !12, entity: !8, file: !3, line: 1, elements: !15)820 821; CHECK-DAG: #[[M:.+]] = #llvm.di_module<{{.*}}name = "mod1"{{.*}}>822; CHECK-DAG:  #[[SP_REC:.+]] = #llvm.di_subprogram<recId = distinct{{.*}}<>, isRecSelf = true>823; CHECK-DAG: #[[IE:.+]] = #llvm.di_imported_entity<tag = DW_TAG_imported_module, scope = #[[SP_REC]], entity = #[[M]]{{.*}}>824; CHECK-DAG: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "imp_fn"{{.*}}retainedNodes = #[[IE]]>825 826; // -----827 828; Test that annotations are handled correctly829 830; CHECK-LABEL: @fn_with_annotations831 832define void @fn_with_annotations() !dbg !12 {833  ret void834}835 836!llvm.module.flags = !{!10}837!llvm.dbg.cu = !{!4}838 839!2 = !DIModule(scope: !4, name: "mod1", file: !3, line: 1)840!3 = !DIFile(filename: "test.f90", directory: "")841!4 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !3)842!8 = !DIModule(scope: !4, name: "mod1", file: !3, line: 5)843!10 = !{i32 2, !"Debug Info Version", i32 3}844!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)845!14 = !DISubroutineType(cc: DW_CC_program, types: !15)846!15 = !{}847!16 = !{!17}848!17 = !{!"foo", !"bar"}849 850 851; CHECK-DAG: #llvm.di_subprogram<{{.*}}name = "fn_with_annotations"{{.*}}annotations = #llvm.di_annotation<name = "foo", value = "bar">>852 853; // -----854 855@block = common global [4 x i8] zeroinitializer, !dbg !0856 857define void @test() !dbg !3 {858  ret void859}860 861!llvm.module.flags = !{!10}862!llvm.dbg.cu = !{!7}863 864!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())865!1 = distinct !DIGlobalVariable(name: "alpha", scope: !2, file: !4, type: !9)866!2 = !DICommonBlock(scope: !3, declaration: null, name: "block", file: !4, line: 3)867!3 = distinct !DISubprogram(name: "test", scope: !4, file: !4, spFlags: DISPFlagDefinition, unit: !7)868!4 = !DIFile(filename: "test.f90", directory: "")869!7 = distinct !DICompileUnit(language: DW_LANG_Fortran95, file: !4)870!9 = !DIBasicType(name: "integer", size: 32, encoding: DW_ATE_signed)871!10 = !{i32 2, !"Debug Info Version", i32 3}872 873; CHECK: #[[FILE:.+]] = #llvm.di_file<"test.f90" in "">874; CHECK: #[[SP:.+]] = #llvm.di_subprogram<{{.*}}name = "test"{{.*}}>875; CHECK: #llvm.di_common_block<scope = #[[SP]], name = "block", file = #[[FILE]], line = 3>876 877; // -----878 879@data = external global i64, !dbg !0, !dbg !5880 881!llvm.module.flags = !{!8}882!llvm.dbg.cu = !{!2}883 884!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())885!1 = distinct !DIGlobalVariable(name: "a", scope: !2, file: !3, line: 2, type: !7)886!2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, globals: !4)887!3 = !DIFile(filename: "test.c", directory: "")888!4 = !{!0, !5}889!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())890!6 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 3, type: !7)891!7 = !DIBasicType(name: "int", size: 32)892!8 = !{i32 2, !"Debug Info Version", i32 3}893 894 895; CHECK: #[[VAR1:.+]] =  #llvm.di_global_variable<{{.*}}name = "a"{{.*}}>896; CHECK: #[[VAR2:.+]] =  #llvm.di_global_variable<{{.*}}name = "b"{{.*}}>897; CHECK: #[[EXP1:.+]] =  #llvm.di_global_variable_expression<var = #[[VAR1]], expr = <>>898; CHECK: #[[EXP2:.+]] =  #llvm.di_global_variable_expression<var = #[[VAR2]], expr = <>>899; CHECK: llvm.mlir.global external @data() {{{.*}}dbg_exprs = [#[[EXP1]], #[[EXP2]]]} : i64900