xref: /llvm-project/mlir/test/Target/LLVMIR/Import/debug-info.ll (revision 89f2d50cda2462d744e2ef08d662265a8d598e2a)
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