blob: 47534709aa4a8de4955fcb453de42dcaf068bfe0 [file] [log] [blame]
Adrian Prantl30cf8512013-03-29 20:14:08 +00001; RUN: llc -mtriple x86_64-apple-darwin -filetype=obj -o %t.o < %s
2; RUN: llvm-dwarfdump -debug-dump=info %t.o | FileCheck %s
3
Adrian Prantl4b7cf642013-03-29 18:08:14 +00004; Generated from llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m
5; rdar://problem/9279956
6; test that the DW_AT_location of self is at ( fbreg +{{[0-9]+}}, deref, +{{[0-9]+}} )
7
David Blaikie3c2fff32014-05-27 18:37:48 +00008; CHECK: [[A:.*]]: DW_TAG_structure_type
9; CHECK-NEXT: DW_AT_APPLE_objc_complete_type
10; CHECK-NEXT: DW_AT_name{{.*}}"A"
11
12; CHECK: DW_TAG_subprogram
Manman Ren75cc7652013-10-29 17:27:14 +000013; CHECK: DW_TAG_subprogram
David Blaikief7221ad2014-05-27 18:37:43 +000014; CHECK: DW_TAG_subprogram
15; CHECK-NOT: DW_TAG
David Blaikie2b4669d2014-04-26 22:12:18 +000016; CHECK: DW_AT_object_pointer
David Blaikief7221ad2014-05-27 18:37:43 +000017; CHECK-NOT: DW_TAG
18; CHECK: DW_AT_name{{.*}}_block_invoke
Manman Ren75cc7652013-10-29 17:27:14 +000019
David Blaikief7221ad2014-05-27 18:37:43 +000020; CHECK-NOT: {{DW_TAG|NULL}}
Adrian Prantl4b7cf642013-03-29 18:08:14 +000021; CHECK: DW_TAG_formal_parameter
David Blaikief7221ad2014-05-27 18:37:43 +000022; CHECK-NOT: DW_TAG
Adrian Prantl4b7cf642013-03-29 18:08:14 +000023; CHECK: DW_AT_location
David Blaikieeb1a2722014-06-13 22:18:23 +000024; CHECK-NOT: DW_TAG
25; CHECK: DW_AT_name{{.*}}.block_descriptor
Manman Ren75cc7652013-10-29 17:27:14 +000026
David Blaikief7221ad2014-05-27 18:37:43 +000027; CHECK-NOT: {{DW_TAG|NULL}}
Adrian Prantl4b7cf642013-03-29 18:08:14 +000028; CHECK: DW_TAG_variable
Adrian Prantl4b7cf642013-03-29 18:08:14 +000029; CHECK-NOT: DW_TAG
30; 0x06 = DW_OP_deref
31; 0x23 = DW_OP_uconst
32; 0x91 = DW_OP_fbreg
33; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} )
David Blaikieeb1a2722014-06-13 22:18:23 +000034; CHECK-NOT: DW_TAG
35; CHECK: DW_AT_name{{.*}}"self"
36; CHECK-NOT: DW_TAG
37; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]}
38; CHECK-NOT: DW_TAG
39; CHECK: DW_AT_artificial
Manman Renf4c339e2013-10-29 22:49:29 +000040
David Blaikief7221ad2014-05-27 18:37:43 +000041; CHECK: [[APTR]]: DW_TAG_pointer_type
Adrian Prantl4b7cf642013-03-29 18:08:14 +000042; CHECK-NEXT: {[[A]]}
43
44
45; ModuleID = 'llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m'
46target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
47target triple = "x86_64-apple-darwin"
48
49%0 = type opaque
50%1 = type opaque
51%struct._class_t = type { %struct._class_t*, %struct._class_t*, %struct._objc_cache*, i8* (i8*, i8*)**, %struct._class_ro_t* }
52%struct._objc_cache = type opaque
53%struct._class_ro_t = type { i32, i32, i32, i8*, i8*, %struct.__method_list_t*, %struct._objc_protocol_list*, %struct._ivar_list_t*, i8*, %struct._prop_list_t* }
54%struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] }
55%struct._objc_method = type { i8*, i8*, i8* }
56%struct._objc_protocol_list = type { i64, [0 x %struct._protocol_t*] }
57%struct._protocol_t = type { i8*, i8*, %struct._objc_protocol_list*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct.__method_list_t*, %struct._prop_list_t*, i32, i32, i8** }
58%struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] }
59%struct._prop_t = type { i8*, i8* }
60%struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] }
61%struct._ivar_t = type { i64*, i8*, i8*, i32, i32 }
62%struct._message_ref_t = type { i8*, i8* }
63%struct._objc_super = type { i8*, i8* }
64%struct.__block_descriptor = type { i64, i64 }
65%struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* }
66
67@"OBJC_CLASS_$_A" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_A", %struct._class_t* @"OBJC_CLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_CLASS_RO_$_A" }, section "__DATA, __objc_data", align 8
68@"\01L_OBJC_CLASSLIST_SUP_REFS_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_A", section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8
69@"\01L_OBJC_METH_VAR_NAME_" = internal global [5 x i8] c"init\00", section "__TEXT,__objc_methname,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000070@"\01L_OBJC_SELECTOR_REFERENCES_" = internal externally_initialized global i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
Adrian Prantl4b7cf642013-03-29 18:08:14 +000071@"OBJC_CLASS_$_NSMutableDictionary" = external global %struct._class_t
72@"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global %struct._class_t* @"OBJC_CLASS_$_NSMutableDictionary", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
73@"\01L_OBJC_METH_VAR_NAME_1" = internal global [6 x i8] c"alloc\00", section "__TEXT,__objc_methname,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000074@"\01l_objc_msgSend_fixup_alloc" = weak hidden global { i8* (i8*, %struct._message_ref_t*, ...)*, i8* } { i8* (i8*, %struct._message_ref_t*, ...)* @objc_msgSend_fixup, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_OBJC_METH_VAR_NAME_1", i32 0, i32 0) }, section "__DATA, __objc_msgrefs, coalesced", align 16
Adrian Prantl4b7cf642013-03-29 18:08:14 +000075@"\01L_OBJC_METH_VAR_NAME_2" = internal global [6 x i8] c"count\00", section "__TEXT,__objc_methname,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000076@"\01l_objc_msgSend_fixup_count" = weak hidden global { i8* (i8*, %struct._message_ref_t*, ...)*, i8* } { i8* (i8*, %struct._message_ref_t*, ...)* @objc_msgSend_fixup, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_OBJC_METH_VAR_NAME_2", i32 0, i32 0) }, section "__DATA, __objc_msgrefs, coalesced", align 16
Adrian Prantl4b7cf642013-03-29 18:08:14 +000077@"OBJC_IVAR_$_A.ivar" = global i64 0, section "__DATA, __objc_ivar", align 8
78@_NSConcreteStackBlock = external global i8*
79@.str = private unnamed_addr constant [6 x i8] c"v8@?0\00", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000080@__block_descriptor_tmp = internal constant { i64, i64, i8*, i8*, i8*, i64 } { i64 0, i64 40, i8* bitcast (void (i8*, i8*)* @__copy_helper_block_ to i8*), i8* bitcast (void (i8*)* @__destroy_helper_block_ to i8*), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i32 0, i32 0), i64 256 }
Adrian Prantl4b7cf642013-03-29 18:08:14 +000081@_objc_empty_cache = external global %struct._objc_cache
82@_objc_empty_vtable = external global i8* (i8*, i8*)*
83@"OBJC_METACLASS_$_NSObject" = external global %struct._class_t
84@"\01L_OBJC_CLASS_NAME_" = internal global [2 x i8] c"A\00", section "__TEXT,__objc_classname,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000085@"\01l_OBJC_METACLASS_RO_$_A" = internal global %struct._class_ro_t { i32 1, i32 40, i32 40, i8* null, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* null, %struct._objc_protocol_list* null, %struct._ivar_list_t* null, i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
Adrian Prantl4b7cf642013-03-29 18:08:14 +000086@"OBJC_METACLASS_$_A" = global %struct._class_t { %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._class_t* @"OBJC_METACLASS_$_NSObject", %struct._objc_cache* @_objc_empty_cache, i8* (i8*, i8*)** @_objc_empty_vtable, %struct._class_ro_t* @"\01l_OBJC_METACLASS_RO_$_A" }, section "__DATA, __objc_data", align 8
87@"OBJC_CLASS_$_NSObject" = external global %struct._class_t
88@"\01L_OBJC_METH_VAR_TYPE_" = internal global [8 x i8] c"@16@0:8\00", section "__TEXT,__objc_methtype,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000089@"\01l_OBJC_$_INSTANCE_METHODS_A" = internal global { i32, i32, [1 x %struct._objc_method] } { i32 24, i32 1, [1 x %struct._objc_method] [%struct._objc_method { i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast (i8* (%0*, i8*)* @"\01-[A init]" to i8*) }] }, section "__DATA, __objc_const", align 8
Adrian Prantl4b7cf642013-03-29 18:08:14 +000090@"\01L_OBJC_METH_VAR_NAME_3" = internal global [5 x i8] c"ivar\00", section "__TEXT,__objc_methname,cstring_literals", align 1
91@"\01L_OBJC_METH_VAR_TYPE_4" = internal global [2 x i8] c"i\00", section "__TEXT,__objc_methtype,cstring_literals", align 1
David Blaikief72d05b2015-03-13 18:20:45 +000092@"\01l_OBJC_$_INSTANCE_VARIABLES_A" = internal global { i32, i32, [1 x %struct._ivar_t] } { i32 32, i32 1, [1 x %struct._ivar_t] [%struct._ivar_t { i64* @"OBJC_IVAR_$_A.ivar", i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_3", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_OBJC_METH_VAR_TYPE_4", i32 0, i32 0), i32 2, i32 4 }] }, section "__DATA, __objc_const", align 8
93@"\01l_OBJC_CLASS_RO_$_A" = internal global %struct._class_ro_t { i32 0, i32 0, i32 4, i8* null, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), %struct.__method_list_t* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_A" to %struct.__method_list_t*), %struct._objc_protocol_list* null, %struct._ivar_list_t* bitcast ({ i32, i32, [1 x %struct._ivar_t] }* @"\01l_OBJC_$_INSTANCE_VARIABLES_A" to %struct._ivar_list_t*), i8* null, %struct._prop_list_t* null }, section "__DATA, __objc_const", align 8
Adrian Prantl4b7cf642013-03-29 18:08:14 +000094@"\01L_OBJC_CLASSLIST_REFERENCES_$_5" = internal global %struct._class_t* @"OBJC_CLASS_$_A", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8
95@"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x i8*] [i8* bitcast (%struct._class_t* @"OBJC_CLASS_$_A" to i8*)], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8
David Blaikief72d05b2015-03-13 18:20:45 +000096@llvm.used = appending global [14 x i8*] [i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_SUP_REFS_$_" to i8*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_" to i8*), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_OBJC_METH_VAR_NAME_1", i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_OBJC_METH_VAR_NAME_2", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_OBJC_CLASS_NAME_", i32 0, i32 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_OBJC_METH_VAR_TYPE_", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._objc_method] }* @"\01l_OBJC_$_INSTANCE_METHODS_A" to i8*), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_OBJC_METH_VAR_NAME_3", i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_OBJC_METH_VAR_TYPE_4", i32 0, i32 0), i8* bitcast ({ i32, i32, [1 x %struct._ivar_t] }* @"\01l_OBJC_$_INSTANCE_VARIABLES_A" to i8*), i8* bitcast (%struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_5" to i8*), i8* bitcast ([1 x i8*]* @"\01L_OBJC_LABEL_CLASS_$" to i8*)], section "llvm.metadata"
Adrian Prantl4b7cf642013-03-29 18:08:14 +000097
98define internal i8* @"\01-[A init]"(%0* %self, i8* %_cmd) #0 {
99 %1 = alloca %0*, align 8
100 %2 = alloca i8*, align 8
101 %3 = alloca %struct._objc_super
102 %4 = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, align 8
103 store %0* %self, %0** %1, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000104 call void @llvm.dbg.declare(metadata %0** %1, metadata !60, metadata !DIExpression()), !dbg !62
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000105 store i8* %_cmd, i8** %2, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000106 call void @llvm.dbg.declare(metadata i8** %2, metadata !63, metadata !DIExpression()), !dbg !62
David Blaikiea79ac142015-02-27 21:17:42 +0000107 %5 = load %0*, %0** %1, !dbg !65
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000108 %6 = bitcast %0* %5 to i8*, !dbg !65
David Blaikie79e6c742015-02-27 19:29:02 +0000109 %7 = getelementptr inbounds %struct._objc_super, %struct._objc_super* %3, i32 0, i32 0, !dbg !65
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000110 store i8* %6, i8** %7, !dbg !65
David Blaikiea79ac142015-02-27 21:17:42 +0000111 %8 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_SUP_REFS_$_", !dbg !65
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000112 %9 = bitcast %struct._class_t* %8 to i8*, !dbg !65
David Blaikie79e6c742015-02-27 19:29:02 +0000113 %10 = getelementptr inbounds %struct._objc_super, %struct._objc_super* %3, i32 0, i32 1, !dbg !65
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000114 store i8* %9, i8** %10, !dbg !65
David Blaikiea79ac142015-02-27 21:17:42 +0000115 %11 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !65, !invariant.load !67
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000116 %12 = call i8* bitcast (i8* (%struct._objc_super*, i8*, ...)* @objc_msgSendSuper2 to i8* (%struct._objc_super*, i8*)*)(%struct._objc_super* %3, i8* %11), !dbg !65
117 %13 = bitcast i8* %12 to %0*, !dbg !65
118 store %0* %13, %0** %1, align 8, !dbg !65
119 %14 = icmp ne %0* %13, null, !dbg !65
120 br i1 %14, label %15, label %24, !dbg !65
121
122; <label>:15 ; preds = %0
David Blaikie79e6c742015-02-27 19:29:02 +0000123 %16 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 0, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000124 store i8* bitcast (i8** @_NSConcreteStackBlock to i8*), i8** %16, !dbg !68
David Blaikie79e6c742015-02-27 19:29:02 +0000125 %17 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 1, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000126 store i32 -1040187392, i32* %17, !dbg !68
David Blaikie79e6c742015-02-27 19:29:02 +0000127 %18 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 2, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000128 store i32 0, i32* %18, !dbg !68
David Blaikie79e6c742015-02-27 19:29:02 +0000129 %19 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 3, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000130 store i8* bitcast (void (i8*)* @"__9-[A init]_block_invoke" to i8*), i8** %19, !dbg !68
David Blaikie79e6c742015-02-27 19:29:02 +0000131 %20 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 4, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000132 store %struct.__block_descriptor* bitcast ({ i64, i64, i8*, i8*, i8*, i64 }* @__block_descriptor_tmp to %struct.__block_descriptor*), %struct.__block_descriptor** %20, !dbg !68
David Blaikie79e6c742015-02-27 19:29:02 +0000133 %21 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !68
David Blaikiea79ac142015-02-27 21:17:42 +0000134 %22 = load %0*, %0** %1, align 8, !dbg !68
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000135 store %0* %22, %0** %21, align 8, !dbg !68
136 %23 = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4 to void ()*, !dbg !68
137 call void @run(void ()* %23), !dbg !68
138 br label %24, !dbg !70
139
140; <label>:24 ; preds = %15, %0
David Blaikiea79ac142015-02-27 21:17:42 +0000141 %25 = load %0*, %0** %1, align 8, !dbg !71
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000142 %26 = bitcast %0* %25 to i8*, !dbg !71
143 ret i8* %26, !dbg !71
144}
145
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000146declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000147
148declare i8* @objc_msgSendSuper2(%struct._objc_super*, i8*, ...)
149
150define internal void @run(void ()* %block) #0 {
151 %1 = alloca void ()*, align 8
152 store void ()* %block, void ()** %1, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000153 call void @llvm.dbg.declare(metadata void ()** %1, metadata !72, metadata !DIExpression()), !dbg !73
David Blaikiea79ac142015-02-27 21:17:42 +0000154 %2 = load void ()*, void ()** %1, align 8, !dbg !74
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000155 %3 = bitcast void ()* %2 to %struct.__block_literal_generic*, !dbg !74
David Blaikie79e6c742015-02-27 19:29:02 +0000156 %4 = getelementptr inbounds %struct.__block_literal_generic, %struct.__block_literal_generic* %3, i32 0, i32 3, !dbg !74
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000157 %5 = bitcast %struct.__block_literal_generic* %3 to i8*, !dbg !74
David Blaikiea79ac142015-02-27 21:17:42 +0000158 %6 = load i8*, i8** %4, !dbg !74
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000159 %7 = bitcast i8* %6 to void (i8*)*, !dbg !74
160 call void %7(i8* %5), !dbg !74
161 ret void, !dbg !75
162}
163
164define internal void @"__9-[A init]_block_invoke"(i8* %.block_descriptor) #0 {
165 %1 = alloca i8*, align 8
166 %2 = alloca <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, align 8
167 %d = alloca %1*, align 8
168 store i8* %.block_descriptor, i8** %1, align 8
David Blaikiea79ac142015-02-27 21:17:42 +0000169 %3 = load i8*, i8** %1
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000170 call void @llvm.dbg.value(metadata i8* %3, i64 0, metadata !76, metadata !DIExpression()), !dbg !88
171 call void @llvm.dbg.declare(metadata i8* %.block_descriptor, metadata !76, metadata !DIExpression()), !dbg !88
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000172 %4 = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !88
173 store <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %2, align 8, !dbg !88
David Blaikie79e6c742015-02-27 19:29:02 +0000174 %5 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !88
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000175 call void @llvm.dbg.declare(metadata <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %2, metadata !89, metadata !111), !dbg !90
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000176 call void @llvm.dbg.declare(metadata %1** %d, metadata !91, metadata !DIExpression()), !dbg !100
David Blaikiea79ac142015-02-27 21:17:42 +0000177 %6 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_", !dbg !100
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000178 %7 = bitcast %struct._class_t* %6 to i8*, !dbg !100
David Blaikief72d05b2015-03-13 18:20:45 +0000179 %8 = load i8*, i8** getelementptr inbounds (%struct._message_ref_t, %struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to %struct._message_ref_t*), i32 0, i32 0), !dbg !100
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000180 %9 = bitcast i8* %8 to i8* (i8*, i8*)*, !dbg !100
181 %10 = call i8* %9(i8* %7, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to i8*)), !dbg !100
182 %11 = bitcast i8* %10 to %1*, !dbg !100
David Blaikiea79ac142015-02-27 21:17:42 +0000183 %12 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !100, !invariant.load !67
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000184 %13 = bitcast %1* %11 to i8*, !dbg !100
185 %14 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %13, i8* %12), !dbg !100
186 %15 = bitcast i8* %14 to %1*, !dbg !100
187 store %1* %15, %1** %d, align 8, !dbg !100
David Blaikiea79ac142015-02-27 21:17:42 +0000188 %16 = load %1*, %1** %d, align 8, !dbg !101
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000189 %17 = bitcast %1* %16 to i8*, !dbg !101
David Blaikief72d05b2015-03-13 18:20:45 +0000190 %18 = load i8*, i8** getelementptr inbounds (%struct._message_ref_t, %struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_count" to %struct._message_ref_t*), i32 0, i32 0), !dbg !101
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000191 %19 = bitcast i8* %18 to i32 (i8*, i8*)*, !dbg !101
192 %20 = call i32 %19(i8* %17, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_count" to i8*)), !dbg !101
193 %21 = add nsw i32 42, %20, !dbg !101
David Blaikiea79ac142015-02-27 21:17:42 +0000194 %22 = load %0*, %0** %5, align 8, !dbg !101
195 %23 = load i64, i64* @"OBJC_IVAR_$_A.ivar", !dbg !101, !invariant.load !67
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000196 %24 = bitcast %0* %22 to i8*, !dbg !101
David Blaikie79e6c742015-02-27 19:29:02 +0000197 %25 = getelementptr inbounds i8, i8* %24, i64 %23, !dbg !101
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000198 %26 = bitcast i8* %25 to i32*, !dbg !101
199 store i32 %21, i32* %26, align 4, !dbg !101
200 ret void, !dbg !90
201}
202
Adrian Prantl87b7eb92014-10-01 18:55:02 +0000203declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000204
205declare i8* @objc_msgSend_fixup(i8*, %struct._message_ref_t*, ...)
206
207declare i8* @objc_msgSend(i8*, i8*, ...) #2
208
209define internal void @__copy_helper_block_(i8*, i8*) {
210 %3 = alloca i8*, align 8
211 %4 = alloca i8*, align 8
212 store i8* %0, i8** %3, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000213 call void @llvm.dbg.declare(metadata i8** %3, metadata !102, metadata !DIExpression()), !dbg !103
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000214 store i8* %1, i8** %4, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000215 call void @llvm.dbg.declare(metadata i8** %4, metadata !104, metadata !DIExpression()), !dbg !103
David Blaikiea79ac142015-02-27 21:17:42 +0000216 %5 = load i8*, i8** %4, !dbg !103
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000217 %6 = bitcast i8* %5 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !103
David Blaikiea79ac142015-02-27 21:17:42 +0000218 %7 = load i8*, i8** %3, !dbg !103
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000219 %8 = bitcast i8* %7 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !103
David Blaikie79e6c742015-02-27 19:29:02 +0000220 %9 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %6, i32 0, i32 5, !dbg !103
221 %10 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %8, i32 0, i32 5, !dbg !103
David Blaikiea79ac142015-02-27 21:17:42 +0000222 %11 = load %0*, %0** %9, !dbg !103
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000223 %12 = bitcast %0* %11 to i8*, !dbg !103
224 %13 = bitcast %0** %10 to i8*, !dbg !103
225 call void @_Block_object_assign(i8* %13, i8* %12, i32 3) #3, !dbg !103
226 ret void, !dbg !103
227}
228
229declare void @_Block_object_assign(i8*, i8*, i32)
230
231define internal void @__destroy_helper_block_(i8*) {
232 %2 = alloca i8*, align 8
233 store i8* %0, i8** %2, align 8
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000234 call void @llvm.dbg.declare(metadata i8** %2, metadata !105, metadata !DIExpression()), !dbg !106
David Blaikiea79ac142015-02-27 21:17:42 +0000235 %3 = load i8*, i8** %2, !dbg !106
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000236 %4 = bitcast i8* %3 to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg !106
David Blaikie79e6c742015-02-27 19:29:02 +0000237 %5 = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %4, i32 0, i32 5, !dbg !106
David Blaikiea79ac142015-02-27 21:17:42 +0000238 %6 = load %0*, %0** %5, !dbg !106
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000239 %7 = bitcast %0* %6 to i8*, !dbg !106
240 call void @_Block_object_dispose(i8* %7, i32 3) #3, !dbg !106
241 ret void, !dbg !106
242}
243
244declare void @_Block_object_dispose(i8*, i32)
245
246define i32 @main() #0 {
247 %1 = alloca i32, align 4
248 %a = alloca %0*, align 8
249 store i32 0, i32* %1
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000250 call void @llvm.dbg.declare(metadata %0** %a, metadata !107, metadata !DIExpression()), !dbg !108
David Blaikiea79ac142015-02-27 21:17:42 +0000251 %2 = load %struct._class_t*, %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_5", !dbg !108
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000252 %3 = bitcast %struct._class_t* %2 to i8*, !dbg !108
David Blaikief72d05b2015-03-13 18:20:45 +0000253 %4 = load i8*, i8** getelementptr inbounds (%struct._message_ref_t, %struct._message_ref_t* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to %struct._message_ref_t*), i32 0, i32 0), !dbg !108
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000254 %5 = bitcast i8* %4 to i8* (i8*, i8*)*, !dbg !108
255 %6 = call i8* %5(i8* %3, i8* bitcast ({ i8* (i8*, %struct._message_ref_t*, ...)*, i8* }* @"\01l_objc_msgSend_fixup_alloc" to i8*)), !dbg !108
256 %7 = bitcast i8* %6 to %0*, !dbg !108
David Blaikiea79ac142015-02-27 21:17:42 +0000257 %8 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !108, !invariant.load !67
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000258 %9 = bitcast %0* %7 to i8*, !dbg !108
259 %10 = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* %9, i8* %8), !dbg !108
260 %11 = bitcast i8* %10 to %0*, !dbg !108
261 store %0* %11, %0** %a, align 8, !dbg !108
262 ret i32 0, !dbg !109
263}
264
265attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
266attributes #1 = { nounwind readnone }
267attributes #2 = { nonlazybind }
268attributes #3 = { nounwind }
269
270!llvm.dbg.cu = !{!0}
Manman Ren409558f2013-11-22 21:49:45 +0000271!llvm.module.flags = !{!56, !57, !58, !59, !110}
Adrian Prantl4b7cf642013-03-29 18:08:14 +0000272
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000273!0 = !DICompileUnit(language: DW_LANG_ObjC, producer: "clang version 3.3 ", isOptimized: false, runtimeVersion: 2, emissionKind: 1, file: !1, enums: !2, retainedTypes: !3, subprograms: !12, globals: !2, imports: !2)
274!1 = !DIFile(filename: "llvm/tools/clang/test/CodeGenObjC/<unknown>", directory: "llvm/_build.ninja.Debug")
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000275!2 = !{}
276!3 = !{!4}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000277!4 = !DICompositeType(tag: DW_TAG_structure_type, name: "A", line: 33, size: 32, align: 32, flags: DIFlagObjcClassComplete, runtimeLang: DW_LANG_ObjC, file: !5, scope: !6, elements: !7)
278!5 = !DIFile(filename: "llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m", directory: "llvm/_build.ninja.Debug")
279!6 = !DIFile(filename: "llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m", directory: "llvm/_build.ninja.Debug")
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000280!7 = !{!8, !10}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000281!8 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !4, baseType: !9)
282!9 = !DICompositeType(tag: DW_TAG_structure_type, name: "NSObject", line: 21, align: 8, runtimeLang: DW_LANG_ObjC, file: !5, scope: !6, elements: !2)
283!10 = !DIDerivedType(tag: DW_TAG_member, name: "ivar", line: 35, size: 32, align: 32, file: !5, scope: !6, baseType: !11)
284!11 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000285!12 = !{!13, !27, !31, !35, !36, !39}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000286!13 = !DISubprogram(name: "-[A init]", line: 46, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 46, file: !5, scope: !6, type: !14, function: i8* (%0*, i8*)* @"\01-[A init]", variables: !2)
287!14 = !DISubroutineType(types: !15)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000288!15 = !{!16, !23, !24}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000289!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "id", line: 46, file: !5, baseType: !17)
290!17 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !18)
291!18 = !DICompositeType(tag: DW_TAG_structure_type, name: "objc_object", file: !1, elements: !19)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000292!19 = !{!20}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000293!20 = !DIDerivedType(tag: DW_TAG_member, name: "isa", size: 64, file: !1, scope: !18, baseType: !21)
294!21 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, baseType: !22)
295!22 = !DICompositeType(tag: DW_TAG_structure_type, name: "objc_class", flags: DIFlagFwdDecl, file: !1)
296!23 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer, baseType: !4)
297!24 = !DIDerivedType(tag: DW_TAG_typedef, name: "SEL", line: 46, flags: DIFlagArtificial, file: !5, baseType: !25)
298!25 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !26)
299!26 = !DICompositeType(tag: DW_TAG_structure_type, name: "objc_selector", flags: DIFlagFwdDecl, file: !1)
300!27 = !DISubprogram(name: "__9-[A init]_block_invoke", line: 49, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 49, file: !5, scope: !6, type: !28, function: void (i8*)* @"__9-[A init]_block_invoke", variables: !2)
301!28 = !DISubroutineType(types: !29)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000302!29 = !{null, !30}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000303!30 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: null)
304!31 = !DISubprogram(name: "__copy_helper_block_", line: 52, isLocal: true, isDefinition: true, virtualIndex: 6, isOptimized: false, scopeLine: 52, file: !1, scope: !32, type: !33, function: void (i8*, i8*)* @__copy_helper_block_, variables: !2)
305!32 = !DIFile(filename: "llvm/tools/clang/test/CodeGenObjC/<unknown>", directory: "llvm/_build.ninja.Debug")
306!33 = !DISubroutineType(types: !34)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000307!34 = !{null, !30, !30}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000308!35 = !DISubprogram(name: "__destroy_helper_block_", line: 52, isLocal: true, isDefinition: true, virtualIndex: 6, isOptimized: false, scopeLine: 52, file: !1, scope: !32, type: !28, function: void (i8*)* @__destroy_helper_block_, variables: !2)
309!36 = !DISubprogram(name: "main", line: 59, isLocal: false, isDefinition: true, virtualIndex: 6, isOptimized: false, scopeLine: 60, file: !5, scope: !6, type: !37, function: i32 ()* @main, variables: !2)
310!37 = !DISubroutineType(types: !38)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000311!38 = !{!11}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000312!39 = !DISubprogram(name: "run", line: 39, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 40, file: !5, scope: !6, type: !40, function: void (void ()*)* @run, variables: !2)
313!40 = !DISubroutineType(types: !41)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000314!41 = !{null, !42}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000315!42 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, baseType: !43)
316!43 = !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_generic", line: 40, size: 256, flags: DIFlagAppleBlock, file: !5, scope: !6, elements: !44)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000317!44 = !{!45, !46, !47, !48, !49}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000318!45 = !DIDerivedType(tag: DW_TAG_member, name: "__isa", size: 64, align: 64, file: !5, scope: !6, baseType: !30)
319!46 = !DIDerivedType(tag: DW_TAG_member, name: "__flags", size: 32, align: 32, offset: 64, file: !5, scope: !6, baseType: !11)
320!47 = !DIDerivedType(tag: DW_TAG_member, name: "__reserved", size: 32, align: 32, offset: 96, file: !5, scope: !6, baseType: !11)
321!48 = !DIDerivedType(tag: DW_TAG_member, name: "__FuncPtr", size: 64, align: 64, offset: 128, file: !5, scope: !6, baseType: !30)
322!49 = !DIDerivedType(tag: DW_TAG_member, name: "__descriptor", line: 40, size: 64, align: 64, offset: 192, file: !5, scope: !6, baseType: !50)
323!50 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, baseType: !51)
324!51 = !DICompositeType(tag: DW_TAG_structure_type, name: "__block_descriptor", line: 40, size: 128, flags: DIFlagAppleBlock, file: !5, scope: !6, elements: !52)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000325!52 = !{!53, !55}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000326!53 = !DIDerivedType(tag: DW_TAG_member, name: "reserved", size: 64, align: 64, file: !5, scope: !6, baseType: !54)
327!54 = !DIBasicType(tag: DW_TAG_base_type, name: "long unsigned int", size: 64, align: 64, encoding: DW_ATE_unsigned)
328!55 = !DIDerivedType(tag: DW_TAG_member, name: "Size", size: 64, align: 64, offset: 64, file: !5, scope: !6, baseType: !54)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000329!56 = !{i32 1, !"Objective-C Version", i32 2}
330!57 = !{i32 1, !"Objective-C Image Info Version", i32 0}
331!58 = !{i32 1, !"Objective-C Image Info Section", !"__DATA, __objc_imageinfo, regular, no_dead_strip"}
332!59 = !{i32 4, !"Objective-C Garbage Collection", i32 0}
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000333!60 = !DILocalVariable(name: "self", line: 46, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !13, file: !32, type: !61)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000334!61 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !4)
335!62 = !DILocation(line: 46, scope: !13)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000336!63 = !DILocalVariable(name: "_cmd", line: 46, arg: 2, flags: DIFlagArtificial, scope: !13, file: !32, type: !64)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000337!64 = !DIDerivedType(tag: DW_TAG_typedef, name: "SEL", line: 46, file: !5, baseType: !25)
338!65 = !DILocation(line: 48, scope: !66)
339!66 = distinct !DILexicalBlock(line: 47, column: 0, file: !5, scope: !13)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000340!67 = !{}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000341!68 = !DILocation(line: 49, scope: !69)
342!69 = distinct !DILexicalBlock(line: 48, column: 0, file: !5, scope: !66)
343!70 = !DILocation(line: 53, scope: !69)
344!71 = !DILocation(line: 54, scope: !66)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000345!72 = !DILocalVariable(name: "block", line: 39, arg: 1, scope: !39, file: !6, type: !42)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000346!73 = !DILocation(line: 39, scope: !39)
347!74 = !DILocation(line: 41, scope: !39)
348!75 = !DILocation(line: 42, scope: !39)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000349!76 = !DILocalVariable(name: ".block_descriptor", line: 49, arg: 1, flags: DIFlagArtificial, scope: !27, file: !6, type: !77)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000350!77 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, baseType: !78)
351!78 = !DICompositeType(tag: DW_TAG_structure_type, name: "__block_literal_1", line: 49, size: 320, align: 64, file: !5, scope: !6, elements: !79)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000352!79 = !{!80, !81, !82, !83, !84, !87}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000353!80 = !DIDerivedType(tag: DW_TAG_member, name: "__isa", line: 49, size: 64, align: 64, file: !5, scope: !6, baseType: !30)
354!81 = !DIDerivedType(tag: DW_TAG_member, name: "__flags", line: 49, size: 32, align: 32, offset: 64, file: !5, scope: !6, baseType: !11)
355!82 = !DIDerivedType(tag: DW_TAG_member, name: "__reserved", line: 49, size: 32, align: 32, offset: 96, file: !5, scope: !6, baseType: !11)
356!83 = !DIDerivedType(tag: DW_TAG_member, name: "__FuncPtr", line: 49, size: 64, align: 64, offset: 128, file: !5, scope: !6, baseType: !30)
357!84 = !DIDerivedType(tag: DW_TAG_member, name: "__descriptor", line: 49, size: 64, align: 64, offset: 192, file: !5, scope: !6, baseType: !85)
358!85 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !86)
359!86 = !DICompositeType(tag: DW_TAG_structure_type, name: "__block_descriptor_withcopydispose", line: 49, flags: DIFlagFwdDecl, file: !1)
360!87 = !DIDerivedType(tag: DW_TAG_member, name: "self", line: 49, size: 64, align: 64, offset: 256, file: !5, scope: !6, baseType: !61)
361!88 = !DILocation(line: 49, scope: !27)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000362!89 = !DILocalVariable(name: "self", line: 52, scope: !27, file: !32, type: !23)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000363!90 = !DILocation(line: 52, scope: !27)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000364!91 = !DILocalVariable(name: "d", line: 50, scope: !92, file: !6, type: !93)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000365!92 = distinct !DILexicalBlock(line: 49, column: 0, file: !5, scope: !27)
366!93 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !94)
367!94 = !DICompositeType(tag: DW_TAG_structure_type, name: "NSMutableDictionary", line: 30, align: 8, runtimeLang: DW_LANG_ObjC, file: !5, scope: !6, elements: !95)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000368!95 = !{!96}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000369!96 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !94, baseType: !97)
370!97 = !DICompositeType(tag: DW_TAG_structure_type, name: "NSDictionary", line: 26, align: 8, runtimeLang: DW_LANG_ObjC, file: !5, scope: !6, elements: !98)
Duncan P. N. Exon Smithbe7ea192014-12-15 19:07:53 +0000371!98 = !{!99}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000372!99 = !DIDerivedType(tag: DW_TAG_inheritance, scope: !97, baseType: !9)
373!100 = !DILocation(line: 50, scope: !92)
374!101 = !DILocation(line: 51, scope: !92)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000375!102 = !DILocalVariable(name: "", line: 52, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !31, file: !32, type: !30)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000376!103 = !DILocation(line: 52, scope: !31)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000377!104 = !DILocalVariable(name: "", line: 52, arg: 2, flags: DIFlagArtificial, scope: !31, file: !32, type: !30)
378!105 = !DILocalVariable(name: "", line: 52, arg: 1, flags: DIFlagArtificial | DIFlagObjectPointer, scope: !35, file: !32, type: !30)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000379!106 = !DILocation(line: 52, scope: !35)
Duncan P. N. Exon Smithed013cd2015-07-31 18:58:39 +0000380!107 = !DILocalVariable(name: "a", line: 61, scope: !36, file: !6, type: !61)
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000381!108 = !DILocation(line: 61, scope: !36)
382!109 = !DILocation(line: 62, scope: !36)
Duncan P. N. Exon Smithe2741802015-03-03 17:24:31 +0000383!110 = !{i32 1, !"Debug Info Version", i32 3}
Duncan P. N. Exon Smitha9308c42015-04-29 16:38:44 +0000384!111 = !DIExpression(DW_OP_deref, DW_OP_plus, 32)