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
6 ; Based on the debuginfo-tests/sret.cpp code.
8 ; CHECK-DWO: DW_AT_GNU_dwo_id (0x044dcdf3d75b11a1)
9 ; CHECK-DWO: DW_AT_GNU_dwo_id (0x044dcdf3d75b11a1)
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
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
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"
27 %class.A = type { ptr, i32 }
28 %class.B = type { i8 }
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 }
35 @_ZN1AC1Ei = alias void (ptr, i32), ptr @_ZN1AC2Ei
36 @_ZN1AC1ERKS_ = alias void (ptr, ptr), ptr @_ZN1AC2ERKS_
38 ; Function Attrs: nounwind uwtable
39 define void @_ZN1AC2Ei(ptr %this, i32 %i) unnamed_addr #0 align 2 !dbg !49 {
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
55 ; Function Attrs: nounwind readnone
56 declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
58 ; Function Attrs: nounwind uwtable
59 define void @_ZN1AC2ERKS_(ptr %this, ptr %rhs) unnamed_addr #0 align 2 !dbg !50 {
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
77 ; Function Attrs: nounwind uwtable
78 define ptr @_ZN1AaSERKS_(ptr %this, ptr %rhs) #0 align 2 !dbg !51 {
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
95 ; Function Attrs: nounwind uwtable
96 define i32 @_ZN1A7get_intEv(ptr %this) #0 align 2 !dbg !52 {
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
107 ; Function Attrs: uwtable
108 define void @_ZN1B9AInstanceEv(ptr noalias sret(%class.A) %agg.result, ptr %this) #2 align 2 !dbg !53 {
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
124 nrvo.unused: ; preds = %entry
125 call void @_ZN1AD2Ev(ptr %agg.result), !dbg !96
126 br label %nrvo.skipdtor, !dbg !96
128 nrvo.skipdtor: ; preds = %nrvo.unused, %entry
132 ; Function Attrs: nounwind uwtable
133 define linkonce_odr void @_ZN1AD2Ev(ptr %this) unnamed_addr #0 align 2 !dbg !63 {
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
142 ; Function Attrs: uwtable
143 define i32 @main(i32 %argc, ptr %argv) #2 personality ptr @__gxx_personality_v0 !dbg !54 {
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
167 invoke.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
179 lpad: ; preds = %entry
180 %2 = landingpad { ptr, i32 }
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
189 invoke.cont1: ; preds = %lpad
190 br label %eh.resume, !dbg !117
192 eh.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
199 terminate.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
207 ; Function Attrs: nounwind uwtable
208 define linkonce_odr void @_ZN1BC2Ev(ptr %this) unnamed_addr #0 align 2 !dbg !62 {
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
217 declare i32 @__gxx_personality_v0(...)
219 ; Function Attrs: noinline noreturn nounwind
220 define linkonce_odr hidden void @__clang_call_terminate(ptr) #3 {
221 %2 = call ptr @__cxa_begin_catch(ptr %0) #6
222 call void @_ZSt9terminatev() #5
226 declare ptr @__cxa_begin_catch(ptr)
228 declare void @_ZSt9terminatev()
230 ; Function Attrs: uwtable
231 define linkonce_odr void @_ZN1AD0Ev(ptr %this) unnamed_addr #2 align 2 personality ptr @__gxx_personality_v0 !dbg !61 {
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
242 invoke.cont: ; preds = %entry
243 call void @_ZdlPv(ptr %this1) #7, !dbg !129
246 lpad: ; preds = %entry
247 %0 = landingpad { ptr, i32 }
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
256 eh.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
264 ; Function Attrs: nobuiltin nounwind
265 declare void @_ZdlPv(ptr) #4
267 attributes #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" }
268 attributes #1 = { nounwind readnone }
269 attributes #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" }
270 attributes #3 = { noinline noreturn nounwind }
271 attributes #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" }
272 attributes #5 = { noreturn nounwind }
273 attributes #6 = { nounwind }
274 attributes #7 = { builtin nounwind }
277 !llvm.module.flags = !{!64, !65}
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")
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)
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)
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)
312 !37 = !DICompositeType(tag: DW_TAG_class_type, name: "B", line: 38, size: 8, align: 8, file: !1, elements: !38, identifier: "_ZTS1B")
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)
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)
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)