xref: /llvm-project/llvm/test/DebugInfo/X86/sret.ll (revision 0e4c7fabd3587c7d95fa4733e4a9001a0bae737f)
1; RUN: llc -split-dwarf-file=foo.dwo -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t
2; RUN: llvm-dwarfdump -debug-info %t | FileCheck %s --check-prefix=CHECK-DWO
3; RUN: llc --try-experimental-debuginfo-iterators -split-dwarf-file=foo.dwo -O0 %s -mtriple=x86_64-unknown-linux-gnu -filetype=obj -o %t
4; RUN: llvm-dwarfdump -debug-info %t | FileCheck %s --check-prefix=CHECK-DWO
5
6; Based on the debuginfo-tests/sret.cpp code.
7
8; CHECK-DWO: DW_AT_GNU_dwo_id (0x044dcdf3d75b11a1)
9; CHECK-DWO: DW_AT_GNU_dwo_id (0x044dcdf3d75b11a1)
10
11; RUN: llc -O0 -fast-isel=true -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,FASTISEL %s
12; RUN: llc -O0 -fast-isel=false -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,SDAG %s
13
14; RUN: llc --try-experimental-debuginfo-iterators -O0 -fast-isel=true -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,FASTISEL %s
15; RUN: llc --try-experimental-debuginfo-iterators -O0 -fast-isel=false -mtriple=x86_64-apple-darwin -filetype=obj -o - %s | llvm-dwarfdump -debug-info - | FileCheck -check-prefixes=CHECK,SDAG %s
16
17; CHECK: _ZN1B9AInstanceEv
18; CHECK: DW_TAG_variable
19; CHECK-NEXT:   DW_AT_location (0x00000000
20; FASTISEL-NEXT:     [{{.*}}, {{.*}}): DW_OP_breg6 RBP-32, DW_OP_deref
21; FASTISEL-NEXT:     [{{.*}}, {{.*}}): DW_OP_breg5 RDI+0
22; FASTISEL-NEXT:     [{{.*}}, {{.*}}): DW_OP_breg6 RBP-32, DW_OP_deref)
23; SDAG-NEXT:     [{{.*}}, {{.*}}): DW_OP_breg5 RDI+0
24; SDAG-NEXT:     [{{.*}}, {{.*}}): DW_OP_breg6 RBP-32, DW_OP_deref)
25; CHECK-NEXT:   DW_AT_name {{.*}}"a"
26
27%class.A = type { ptr, i32 }
28%class.B = type { i8 }
29
30@_ZTV1A = linkonce_odr unnamed_addr constant [4 x ptr] [ptr null, ptr @_ZTI1A, ptr @_ZN1AD2Ev, ptr @_ZN1AD0Ev]
31@_ZTVN10__cxxabiv117__class_type_infoE = external global ptr
32@_ZTS1A = linkonce_odr constant [3 x i8] c"1A\00"
33@_ZTI1A = linkonce_odr constant { ptr, ptr } { ptr getelementptr inbounds (ptr, ptr @_ZTVN10__cxxabiv117__class_type_infoE, i64 2), ptr @_ZTS1A }
34
35@_ZN1AC1Ei = alias void (ptr, i32), ptr @_ZN1AC2Ei
36@_ZN1AC1ERKS_ = alias void (ptr, ptr), ptr @_ZN1AC2ERKS_
37
38; Function Attrs: nounwind uwtable
39define void @_ZN1AC2Ei(ptr %this, i32 %i) unnamed_addr #0 align 2 !dbg !49 {
40entry:
41  %this.addr = alloca ptr, align 8
42  %i.addr = alloca i32, align 4
43  store ptr %this, ptr %this.addr, align 8
44  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !67, metadata !DIExpression()), !dbg !69
45  store i32 %i, ptr %i.addr, align 4
46  call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !70, metadata !DIExpression()), !dbg !71
47  %this1 = load ptr, ptr %this.addr
48  store ptr getelementptr inbounds ([4 x ptr], ptr @_ZTV1A, i64 0, i64 2), ptr %this1, !dbg !72
49  %m_int = getelementptr inbounds %class.A, ptr %this1, i32 0, i32 1, !dbg !72
50  %0 = load i32, ptr %i.addr, align 4, !dbg !72
51  store i32 %0, ptr %m_int, align 4, !dbg !72
52  ret void, !dbg !73
53}
54
55; Function Attrs: nounwind readnone
56declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
57
58; Function Attrs: nounwind uwtable
59define void @_ZN1AC2ERKS_(ptr %this, ptr %rhs) unnamed_addr #0 align 2 !dbg !50 {
60entry:
61  %this.addr = alloca ptr, align 8
62  %rhs.addr = alloca ptr, align 8
63  store ptr %this, ptr %this.addr, align 8
64  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !74, metadata !DIExpression()), !dbg !75
65  store ptr %rhs, ptr %rhs.addr, align 8
66  call void @llvm.dbg.declare(metadata ptr %rhs.addr, metadata !76, metadata !DIExpression()), !dbg !77
67  %this1 = load ptr, ptr %this.addr
68  store ptr getelementptr inbounds ([4 x ptr], ptr @_ZTV1A, i64 0, i64 2), ptr %this1, !dbg !78
69  %m_int = getelementptr inbounds %class.A, ptr %this1, i32 0, i32 1, !dbg !78
70  %0 = load ptr, ptr %rhs.addr, align 8, !dbg !78
71  %m_int2 = getelementptr inbounds %class.A, ptr %0, i32 0, i32 1, !dbg !78
72  %1 = load i32, ptr %m_int2, align 4, !dbg !78
73  store i32 %1, ptr %m_int, align 4, !dbg !78
74  ret void, !dbg !79
75}
76
77; Function Attrs: nounwind uwtable
78define ptr @_ZN1AaSERKS_(ptr %this, ptr %rhs) #0 align 2 !dbg !51 {
79entry:
80  %this.addr = alloca ptr, align 8
81  %rhs.addr = alloca ptr, align 8
82  store ptr %this, ptr %this.addr, align 8
83  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !80, metadata !DIExpression()), !dbg !81
84  store ptr %rhs, ptr %rhs.addr, align 8
85  call void @llvm.dbg.declare(metadata ptr %rhs.addr, metadata !82, metadata !DIExpression()), !dbg !83
86  %this1 = load ptr, ptr %this.addr
87  %0 = load ptr, ptr %rhs.addr, align 8, !dbg !84
88  %m_int = getelementptr inbounds %class.A, ptr %0, i32 0, i32 1, !dbg !84
89  %1 = load i32, ptr %m_int, align 4, !dbg !84
90  %m_int2 = getelementptr inbounds %class.A, ptr %this1, i32 0, i32 1, !dbg !84
91  store i32 %1, ptr %m_int2, align 4, !dbg !84
92  ret ptr %this1, !dbg !85
93}
94
95; Function Attrs: nounwind uwtable
96define i32 @_ZN1A7get_intEv(ptr %this) #0 align 2 !dbg !52 {
97entry:
98  %this.addr = alloca ptr, align 8
99  store ptr %this, ptr %this.addr, align 8
100  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !86, metadata !DIExpression()), !dbg !87
101  %this1 = load ptr, ptr %this.addr
102  %m_int = getelementptr inbounds %class.A, ptr %this1, i32 0, i32 1, !dbg !88
103  %0 = load i32, ptr %m_int, align 4, !dbg !88
104  ret i32 %0, !dbg !88
105}
106
107; Function Attrs: uwtable
108define void @_ZN1B9AInstanceEv(ptr noalias sret(%class.A) %agg.result, ptr %this) #2 align 2 !dbg !53 {
109entry:
110  %this.addr = alloca ptr, align 8
111  %nrvo = alloca i1, align 1
112  %cleanup.dest.slot = alloca i32
113  store ptr %this, ptr %this.addr, align 8
114  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !89, metadata !DIExpression()), !dbg !91
115  %this1 = load ptr, ptr %this.addr
116  store i1 false, ptr %nrvo, !dbg !92
117  call void @llvm.dbg.declare(metadata ptr %agg.result, metadata !93, metadata !DIExpression()), !dbg !92
118  call void @_ZN1AC1Ei(ptr %agg.result, i32 12), !dbg !92
119  store i1 true, ptr %nrvo, !dbg !94
120  store i32 1, ptr %cleanup.dest.slot
121  %nrvo.val = load i1, ptr %nrvo, !dbg !95
122  br i1 %nrvo.val, label %nrvo.skipdtor, label %nrvo.unused, !dbg !95
123
124nrvo.unused:                                      ; preds = %entry
125  call void @_ZN1AD2Ev(ptr %agg.result), !dbg !96
126  br label %nrvo.skipdtor, !dbg !96
127
128nrvo.skipdtor:                                    ; preds = %nrvo.unused, %entry
129  ret void, !dbg !98
130}
131
132; Function Attrs: nounwind uwtable
133define linkonce_odr void @_ZN1AD2Ev(ptr %this) unnamed_addr #0 align 2 !dbg !63 {
134entry:
135  %this.addr = alloca ptr, align 8
136  store ptr %this, ptr %this.addr, align 8
137  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !101, metadata !DIExpression()), !dbg !102
138  %this1 = load ptr, ptr %this.addr
139  ret void, !dbg !103
140}
141
142; Function Attrs: uwtable
143define i32 @main(i32 %argc, ptr %argv) #2 personality ptr @__gxx_personality_v0 !dbg !54 {
144entry:
145  %retval = alloca i32, align 4
146  %argc.addr = alloca i32, align 4
147  %argv.addr = alloca ptr, align 8
148  %b = alloca %class.B, align 8
149  %return_val = alloca i32, align 4
150  %temp.lvalue = alloca %class.A, align 8
151  %exn.slot = alloca ptr
152  %ehselector.slot = alloca i32
153  %a = alloca %class.A, align 8
154  %cleanup.dest.slot = alloca i32
155  store i32 0, ptr %retval
156  store i32 %argc, ptr %argc.addr, align 4
157  call void @llvm.dbg.declare(metadata ptr %argc.addr, metadata !104, metadata !DIExpression()), !dbg !105
158  store ptr %argv, ptr %argv.addr, align 8
159  call void @llvm.dbg.declare(metadata ptr %argv.addr, metadata !106, metadata !DIExpression()), !dbg !105
160  call void @llvm.dbg.declare(metadata ptr %b, metadata !107, metadata !DIExpression()), !dbg !108
161  call void @_ZN1BC2Ev(ptr %b), !dbg !108
162  call void @llvm.dbg.declare(metadata ptr %return_val, metadata !109, metadata !DIExpression()), !dbg !110
163  call void @_ZN1B9AInstanceEv(ptr sret(%class.A) %temp.lvalue, ptr %b), !dbg !110
164  %call = invoke i32 @_ZN1A7get_intEv(ptr %temp.lvalue)
165          to label %invoke.cont unwind label %lpad, !dbg !110
166
167invoke.cont:                                      ; preds = %entry
168  call void @_ZN1AD2Ev(ptr %temp.lvalue), !dbg !111
169  store i32 %call, ptr %return_val, align 4, !dbg !111
170  call void @llvm.dbg.declare(metadata ptr %a, metadata !113, metadata !DIExpression()), !dbg !114
171  call void @_ZN1B9AInstanceEv(ptr sret(%class.A) %a, ptr %b), !dbg !114
172  %0 = load i32, ptr %return_val, align 4, !dbg !115
173  store i32 %0, ptr %retval, !dbg !115
174  store i32 1, ptr %cleanup.dest.slot
175  call void @_ZN1AD2Ev(ptr %a), !dbg !116
176  %1 = load i32, ptr %retval, !dbg !116
177  ret i32 %1, !dbg !116
178
179lpad:                                             ; preds = %entry
180  %2 = landingpad { ptr, i32 }
181          cleanup, !dbg !116
182  %3 = extractvalue { ptr, i32 } %2, 0, !dbg !116
183  store ptr %3, ptr %exn.slot, !dbg !116
184  %4 = extractvalue { ptr, i32 } %2, 1, !dbg !116
185  store i32 %4, ptr %ehselector.slot, !dbg !116
186  invoke void @_ZN1AD2Ev(ptr %temp.lvalue)
187          to label %invoke.cont1 unwind label %terminate.lpad, !dbg !116
188
189invoke.cont1:                                     ; preds = %lpad
190  br label %eh.resume, !dbg !117
191
192eh.resume:                                        ; preds = %invoke.cont1
193  %exn = load ptr, ptr %exn.slot, !dbg !119
194  %sel = load i32, ptr %ehselector.slot, !dbg !119
195  %lpad.val = insertvalue { ptr, i32 } undef, ptr %exn, 0, !dbg !119
196  %lpad.val2 = insertvalue { ptr, i32 } %lpad.val, i32 %sel, 1, !dbg !119
197  resume { ptr, i32 } %lpad.val2, !dbg !119
198
199terminate.lpad:                                   ; preds = %lpad
200  %5 = landingpad { ptr, i32 }
201          catch ptr null, !dbg !121
202  %6 = extractvalue { ptr, i32 } %5, 0, !dbg !121
203  call void @__clang_call_terminate(ptr %6) #5, !dbg !121
204  unreachable, !dbg !121
205}
206
207; Function Attrs: nounwind uwtable
208define linkonce_odr void @_ZN1BC2Ev(ptr %this) unnamed_addr #0 align 2 !dbg !62 {
209entry:
210  %this.addr = alloca ptr, align 8
211  store ptr %this, ptr %this.addr, align 8
212  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !123, metadata !DIExpression()), !dbg !124
213  %this1 = load ptr, ptr %this.addr
214  ret void, !dbg !125
215}
216
217declare i32 @__gxx_personality_v0(...)
218
219; Function Attrs: noinline noreturn nounwind
220define linkonce_odr hidden void @__clang_call_terminate(ptr) #3 {
221  %2 = call ptr @__cxa_begin_catch(ptr %0) #6
222  call void @_ZSt9terminatev() #5
223  unreachable
224}
225
226declare ptr @__cxa_begin_catch(ptr)
227
228declare void @_ZSt9terminatev()
229
230; Function Attrs: uwtable
231define linkonce_odr void @_ZN1AD0Ev(ptr %this) unnamed_addr #2 align 2 personality ptr @__gxx_personality_v0 !dbg !61 {
232entry:
233  %this.addr = alloca ptr, align 8
234  %exn.slot = alloca ptr
235  %ehselector.slot = alloca i32, align 4
236  store ptr %this, ptr %this.addr, align 8
237  call void @llvm.dbg.declare(metadata ptr %this.addr, metadata !126, metadata !DIExpression()), !dbg !127
238  %this1 = load ptr, ptr %this.addr
239  invoke void @_ZN1AD2Ev(ptr %this1)
240          to label %invoke.cont unwind label %lpad, !dbg !128
241
242invoke.cont:                                      ; preds = %entry
243  call void @_ZdlPv(ptr %this1) #7, !dbg !129
244  ret void, !dbg !129
245
246lpad:                                             ; preds = %entry
247  %0 = landingpad { ptr, i32 }
248          cleanup, !dbg !131
249  %1 = extractvalue { ptr, i32 } %0, 0, !dbg !131
250  store ptr %1, ptr %exn.slot, !dbg !131
251  %2 = extractvalue { ptr, i32 } %0, 1, !dbg !131
252  store i32 %2, ptr %ehselector.slot, !dbg !131
253  call void @_ZdlPv(ptr %this1) #7, !dbg !131
254  br label %eh.resume, !dbg !131
255
256eh.resume:                                        ; preds = %lpad
257  %exn = load ptr, ptr %exn.slot, !dbg !133
258  %sel = load i32, ptr %ehselector.slot, !dbg !133
259  %lpad.val = insertvalue { ptr, i32 } undef, ptr %exn, 0, !dbg !133
260  %lpad.val2 = insertvalue { ptr, i32 } %lpad.val, i32 %sel, 1, !dbg !133
261  resume { ptr, i32 } %lpad.val2, !dbg !133
262}
263
264; Function Attrs: nobuiltin nounwind
265declare void @_ZdlPv(ptr) #4
266
267attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
268attributes #1 = { nounwind readnone }
269attributes #2 = { uwtable "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
270attributes #3 = { noinline noreturn nounwind }
271attributes #4 = { nobuiltin nounwind "less-precise-fpmad"="false" "frame-pointer"="all" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
272attributes #5 = { noreturn nounwind }
273attributes #6 = { nounwind }
274attributes #7 = { builtin nounwind }
275
276!llvm.dbg.cu = !{!0}
277!llvm.module.flags = !{!64, !65}
278!llvm.ident = !{!66}
279
280!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 (trunk 203283) (llvm/trunk 203307)", isOptimized: false, splitDebugFilename: "sret.dwo", emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !3, globals: !2, imports: !2)
281!1 = !DIFile(filename: "sret.cpp", directory: "/usr/local/google/home/echristo/tmp")
282!2 = !{}
283!3 = !{!4, !37}
284!4 = !DICompositeType(tag: DW_TAG_class_type, name: "A", line: 1, size: 128, align: 64, file: !1, elements: !5, vtableHolder: !4, identifier: "_ZTS1A")
285!5 = !{!6, !13, !14, !19, !25, !29, !33}
286!6 = !DIDerivedType(tag: DW_TAG_member, name: "_vptr$A", size: 64, flags: DIFlagArtificial, file: !1, scope: !7, baseType: !8)
287!7 = !DIFile(filename: "sret.cpp", directory: "/usr/local/google/home/echristo/tmp")
288!8 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, baseType: !9)
289!9 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "__vtbl_ptr_type", size: 64, baseType: !10)
290!10 = !DISubroutineType(types: !11)
291!11 = !{!12}
292!12 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
293!13 = !DIDerivedType(tag: DW_TAG_member, name: "m_int", line: 13, size: 32, align: 32, offset: 64, flags: DIFlagProtected, file: !1, scope: !4, baseType: !12)
294!14 = !DISubprogram(name: "A", line: 4, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 4, file: !1, scope: !4, type: !15)
295!15 = !DISubroutineType(types: !16)
296!16 = !{null, !17, !12}
297!17 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer, baseType: !4)
298!19 = !DISubprogram(name: "A", line: 5, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 5, file: !1, scope: !4, type: !20)
299!20 = !DISubroutineType(types: !21)
300!21 = !{null, !17, !22}
301!22 = !DIDerivedType(tag: DW_TAG_reference_type, size: 64, align: 64, baseType: !23)
302!23 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !4)
303!25 = !DISubprogram(name: "operator=", linkageName: "_ZN1AaSERKS_", line: 7, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 7, file: !1, scope: !4, type: !26)
304!26 = !DISubroutineType(types: !27)
305!27 = !{!22, !17, !22}
306!29 = !DISubprogram(name: "~A", line: 8, isLocal: false, isDefinition: false, virtuality: DW_VIRTUALITY_virtual, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 8, file: !1, scope: !4, type: !30, containingType: !4)
307!30 = !DISubroutineType(types: !31)
308!31 = !{null, !17}
309!33 = !DISubprogram(name: "get_int", linkageName: "_ZN1A7get_intEv", line: 10, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 10, file: !1, scope: !4, type: !34)
310!34 = !DISubroutineType(types: !35)
311!35 = !{!12, !17}
312!37 = !DICompositeType(tag: DW_TAG_class_type, name: "B", line: 38, size: 8, align: 8, file: !1, elements: !38, identifier: "_ZTS1B")
313!38 = !{!39, !44}
314!39 = !DISubprogram(name: "B", line: 41, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 41, file: !1, scope: !37, type: !40)
315!40 = !DISubroutineType(types: !41)
316!41 = !{null, !42}
317!42 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer, baseType: !37)
318!44 = !DISubprogram(name: "AInstance", linkageName: "_ZN1B9AInstanceEv", line: 43, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 43, file: !1, scope: !37, type: !45)
319!45 = !DISubroutineType(types: !46)
320!46 = !{!4, !42}
321!49 = distinct !DISubprogram(name: "A", linkageName: "_ZN1AC2Ei", line: 16, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 18, file: !1, scope: !4, type: !15, declaration: !14, retainedNodes: !2)
322!50 = distinct !DISubprogram(name: "A", linkageName: "_ZN1AC2ERKS_", line: 21, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 23, file: !1, scope: !4, type: !20, declaration: !19, retainedNodes: !2)
323!51 = distinct !DISubprogram(name: "operator=", linkageName: "_ZN1AaSERKS_", line: 27, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 28, file: !1, scope: !4, type: !26, declaration: !25, retainedNodes: !2)
324!52 = distinct !DISubprogram(name: "get_int", linkageName: "_ZN1A7get_intEv", line: 33, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 34, file: !1, scope: !4, type: !34, declaration: !33, retainedNodes: !2)
325!53 = distinct !DISubprogram(name: "AInstance", linkageName: "_ZN1B9AInstanceEv", line: 47, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 48, file: !1, scope: !37, type: !45, declaration: !44, retainedNodes: !2)
326!54 = distinct !DISubprogram(name: "main", line: 53, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 54, file: !1, scope: !7, type: !55, retainedNodes: !2)
327!55 = !DISubroutineType(types: !56)
328!56 = !{!12, !12, !57}
329!57 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !58)
330!58 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !59)
331!59 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !60)
332!60 = !DIBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
333!61 = distinct !DISubprogram(name: "~A", linkageName: "_ZN1AD0Ev", line: 8, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 8, file: !1, scope: !4, type: !30, declaration: !29, retainedNodes: !2)
334!62 = distinct !DISubprogram(name: "B", linkageName: "_ZN1BC2Ev", line: 41, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 41, file: !1, scope: !37, type: !40, declaration: !39, retainedNodes: !2)
335!63 = distinct !DISubprogram(name: "~A", linkageName: "_ZN1AD2Ev", line: 8, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 8, file: !1, scope: !4, type: !30, declaration: !29, retainedNodes: !2)
336!64 = !{i32 2, !"Dwarf Version", i32 4}
337!65 = !{i32 1, !"Debug Info Version", i32 3}
338!66 = !{!"clang version 3.5.0 (trunk 203283) (llvm/trunk 203307)"}
339!67 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !49, type: !68)
340!68 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !4)
341!69 = !DILocation(line: 0, scope: !49)
342!70 = !DILocalVariable(name: "i", line: 16, arg: 2, scope: !49, file: !7, type: !12)
343!71 = !DILocation(line: 16, scope: !49)
344!72 = !DILocation(line: 18, scope: !49)
345!73 = !DILocation(line: 19, scope: !49)
346!74 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !50, type: !68)
347!75 = !DILocation(line: 0, scope: !50)
348!76 = !DILocalVariable(name: "rhs", line: 21, arg: 2, scope: !50, file: !7, type: !22)
349!77 = !DILocation(line: 21, scope: !50)
350!78 = !DILocation(line: 23, scope: !50)
351!79 = !DILocation(line: 24, scope: !50)
352!80 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !51, type: !68)
353!81 = !DILocation(line: 0, scope: !51)
354!82 = !DILocalVariable(name: "rhs", line: 27, arg: 2, scope: !51, file: !7, type: !22)
355!83 = !DILocation(line: 27, scope: !51)
356!84 = !DILocation(line: 29, scope: !51)
357!85 = !DILocation(line: 30, scope: !51)
358!86 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !52, type: !68)
359!87 = !DILocation(line: 0, scope: !52)
360!88 = !DILocation(line: 35, scope: !52)
361!89 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !53, type: !90)
362!90 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !37)
363!91 = !DILocation(line: 0, scope: !53)
364!92 = !DILocation(line: 49, scope: !53)
365!93 = !DILocalVariable(name: "a", line: 49, scope: !53, file: !7, type: !4)
366!94 = !DILocation(line: 50, scope: !53)
367!95 = !DILocation(line: 51, scope: !53)
368!96 = !DILocation(line: 51, scope: !97)
369!97 = distinct !DILexicalBlock(line: 51, column: 0, file: !1, scope: !53)
370!98 = !DILocation(line: 51, scope: !99)
371!99 = distinct !DILexicalBlock(line: 51, column: 0, file: !1, scope: !100)
372!100 = distinct !DILexicalBlock(line: 51, column: 0, file: !1, scope: !53)
373!101 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !63, type: !68)
374!102 = !DILocation(line: 0, scope: !63)
375!103 = !DILocation(line: 8, scope: !63)
376!104 = !DILocalVariable(name: "argc", line: 53, arg: 1, scope: !54, file: !7, type: !12)
377!105 = !DILocation(line: 53, scope: !54)
378!106 = !DILocalVariable(name: "argv", line: 53, arg: 2, scope: !54, file: !7, type: !57)
379!107 = !DILocalVariable(name: "b", line: 55, scope: !54, file: !7, type: !37)
380!108 = !DILocation(line: 55, scope: !54)
381!109 = !DILocalVariable(name: "return_val", line: 56, scope: !54, file: !7, type: !12)
382!110 = !DILocation(line: 56, scope: !54)
383!111 = !DILocation(line: 56, scope: !112)
384!112 = distinct !DILexicalBlock(line: 56, column: 0, file: !1, scope: !54)
385!113 = !DILocalVariable(name: "a", line: 58, scope: !54, file: !7, type: !4)
386!114 = !DILocation(line: 58, scope: !54)
387!115 = !DILocation(line: 59, scope: !54)
388!116 = !DILocation(line: 60, scope: !54)
389!117 = !DILocation(line: 60, scope: !118)
390!118 = distinct !DILexicalBlock(line: 60, column: 0, file: !1, scope: !54)
391!119 = !DILocation(line: 60, scope: !120)
392!120 = distinct !DILexicalBlock(line: 60, column: 0, file: !1, scope: !54)
393!121 = !DILocation(line: 60, scope: !122)
394!122 = distinct !DILexicalBlock(line: 60, column: 0, file: !1, scope: !54)
395!123 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !62, type: !90)
396!124 = !DILocation(line: 0, scope: !62)
397!125 = !DILocation(line: 41, scope: !62)
398!126 = !DILocalVariable(name: "this", arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !61, type: !68)
399!127 = !DILocation(line: 0, scope: !61)
400!128 = !DILocation(line: 8, scope: !61)
401!129 = !DILocation(line: 8, scope: !130)
402!130 = distinct !DILexicalBlock(line: 8, column: 0, file: !1, scope: !61)
403!131 = !DILocation(line: 8, scope: !132)
404!132 = distinct !DILexicalBlock(line: 8, column: 0, file: !1, scope: !61)
405!133 = !DILocation(line: 8, scope: !134)
406!134 = distinct !DILexicalBlock(line: 8, column: 0, file: !1, scope: !61)
407