; RUN: llc -mtriple x86_64-apple-darwin -filetype=obj -o %t.o < %s ; RUN: llvm-dwarfdump -v -debug-info %t.o | FileCheck %s ; Generated from llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m ; rdar://problem/9279956 ; test that the DW_AT_location of self is at ( fbreg +{{[0-9]+}}, deref, +{{[0-9]+}} ) ; CHECK: [[A:.*]]: DW_TAG_structure_type ; CHECK-NEXT: DW_AT_APPLE_objc_complete_type ; CHECK-NEXT: DW_AT_name{{.*}}"A" ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_subprogram ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_object_pointer ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name{{.*}}_block_invoke ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_formal_parameter ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_location ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name{{.*}}.block_descriptor ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_location{{.*}}(DW_OP_fbreg -24, DW_OP_deref, DW_OP_plus_uconst 0x20) ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name{{.*}}"self" ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]} ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_artificial ; CHECK: [[APTR]]: DW_TAG_pointer_type ; CHECK-NEXT: {[[A]]} ; ModuleID = 'llvm/tools/clang/test/CodeGenObjC/debug-info-blocks.m' target 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" target triple = "x86_64-apple-darwin" %0 = type opaque %1 = type opaque %struct._class_t = type { ptr, ptr, ptr, ptr, ptr } %struct._objc_cache = type opaque %struct._class_ro_t = type { i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr } %struct.__method_list_t = type { i32, i32, [0 x %struct._objc_method] } %struct._objc_method = type { ptr, ptr, ptr } %struct._objc_protocol_list = type { i64, [0 x ptr] } %struct._protocol_t = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, ptr } %struct._prop_list_t = type { i32, i32, [0 x %struct._prop_t] } %struct._prop_t = type { ptr, ptr } %struct._ivar_list_t = type { i32, i32, [0 x %struct._ivar_t] } %struct._ivar_t = type { ptr, ptr, ptr, i32, i32 } %struct._message_ref_t = type { ptr, ptr } %struct._objc_super = type { ptr, ptr } %struct.__block_descriptor = type { i64, i64 } %struct.__block_literal_generic = type { ptr, i32, i32, ptr, ptr } @"OBJC_CLASS_$_A" = global %struct._class_t { ptr @"OBJC_METACLASS_$_A", ptr @"OBJC_CLASS_$_NSObject", ptr @_objc_empty_cache, ptr @_objc_empty_vtable, ptr @"\01l_OBJC_CLASS_RO_$_A" }, section "__DATA, __objc_data", align 8 @"\01L_OBJC_CLASSLIST_SUP_REFS_$_" = internal global ptr @"OBJC_CLASS_$_A", section "__DATA, __objc_superrefs, regular, no_dead_strip", align 8 @"\01L_OBJC_METH_VAR_NAME_" = internal global [5 x i8] c"init\00", section "__TEXT,__objc_methname,cstring_literals", align 1 @"\01L_OBJC_SELECTOR_REFERENCES_" = internal externally_initialized global ptr @"\01L_OBJC_METH_VAR_NAME_", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip" @"OBJC_CLASS_$_NSMutableDictionary" = external global %struct._class_t @"\01L_OBJC_CLASSLIST_REFERENCES_$_" = internal global ptr @"OBJC_CLASS_$_NSMutableDictionary", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 @"\01L_OBJC_METH_VAR_NAME_1" = internal global [6 x i8] c"alloc\00", section "__TEXT,__objc_methname,cstring_literals", align 1 @"\01l_objc_msgSend_fixup_alloc" = weak hidden global { ptr, ptr } { ptr @objc_msgSend_fixup, ptr @"\01L_OBJC_METH_VAR_NAME_1" }, section "__DATA, __objc_msgrefs, coalesced", align 16 @"\01L_OBJC_METH_VAR_NAME_2" = internal global [6 x i8] c"count\00", section "__TEXT,__objc_methname,cstring_literals", align 1 @"\01l_objc_msgSend_fixup_count" = weak hidden global { ptr, ptr } { ptr @objc_msgSend_fixup, ptr @"\01L_OBJC_METH_VAR_NAME_2" }, section "__DATA, __objc_msgrefs, coalesced", align 16 @"OBJC_IVAR_$_A.ivar" = global i64 0, section "__DATA, __objc_ivar", align 8 @_NSConcreteStackBlock = external global ptr @.str = private unnamed_addr constant [6 x i8] c"v8@?0\00", align 1 @__block_descriptor_tmp = internal constant { i64, i64, ptr, ptr, ptr, i64 } { i64 0, i64 40, ptr @__copy_helper_block_, ptr @__destroy_helper_block_, ptr @.str, i64 256 } @_objc_empty_cache = external global %struct._objc_cache @_objc_empty_vtable = external global ptr @"OBJC_METACLASS_$_NSObject" = external global %struct._class_t @"\01L_OBJC_CLASS_NAME_" = internal global [2 x i8] c"A\00", section "__TEXT,__objc_classname,cstring_literals", align 1 @"\01l_OBJC_METACLASS_RO_$_A" = internal global %struct._class_ro_t { i32 1, i32 40, i32 40, ptr null, ptr @"\01L_OBJC_CLASS_NAME_", ptr null, ptr null, ptr null, ptr null, ptr null }, section "__DATA, __objc_const", align 8 @"OBJC_METACLASS_$_A" = global %struct._class_t { ptr @"OBJC_METACLASS_$_NSObject", ptr @"OBJC_METACLASS_$_NSObject", ptr @_objc_empty_cache, ptr @_objc_empty_vtable, ptr @"\01l_OBJC_METACLASS_RO_$_A" }, section "__DATA, __objc_data", align 8 @"OBJC_CLASS_$_NSObject" = external global %struct._class_t @"\01L_OBJC_METH_VAR_TYPE_" = internal global [8 x i8] c"@16@0:8\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 @"\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 { ptr @"\01L_OBJC_METH_VAR_NAME_", ptr @"\01L_OBJC_METH_VAR_TYPE_", ptr @"\01-[A init]" }] }, section "__DATA, __objc_const", align 8 @"\01L_OBJC_METH_VAR_NAME_3" = internal global [5 x i8] c"ivar\00", section "__TEXT,__objc_methname,cstring_literals", align 1 @"\01L_OBJC_METH_VAR_TYPE_4" = internal global [2 x i8] c"i\00", section "__TEXT,__objc_methtype,cstring_literals", align 1 @"\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 { ptr @"OBJC_IVAR_$_A.ivar", ptr @"\01L_OBJC_METH_VAR_NAME_3", ptr @"\01L_OBJC_METH_VAR_TYPE_4", i32 2, i32 4 }] }, section "__DATA, __objc_const", align 8 @"\01l_OBJC_CLASS_RO_$_A" = internal global %struct._class_ro_t { i32 0, i32 0, i32 4, ptr null, ptr @"\01L_OBJC_CLASS_NAME_", ptr @"\01l_OBJC_$_INSTANCE_METHODS_A", ptr null, ptr @"\01l_OBJC_$_INSTANCE_VARIABLES_A", ptr null, ptr null }, section "__DATA, __objc_const", align 8 @"\01L_OBJC_CLASSLIST_REFERENCES_$_5" = internal global ptr @"OBJC_CLASS_$_A", section "__DATA, __objc_classrefs, regular, no_dead_strip", align 8 @"\01L_OBJC_LABEL_CLASS_$" = internal global [1 x ptr] [ptr @"OBJC_CLASS_$_A"], section "__DATA, __objc_classlist, regular, no_dead_strip", align 8 @llvm.used = appending global [14 x ptr] [ptr @"\01L_OBJC_CLASSLIST_SUP_REFS_$_", ptr @"\01L_OBJC_METH_VAR_NAME_", ptr @"\01L_OBJC_SELECTOR_REFERENCES_", ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_", ptr @"\01L_OBJC_METH_VAR_NAME_1", ptr @"\01L_OBJC_METH_VAR_NAME_2", ptr @"\01L_OBJC_CLASS_NAME_", ptr @"\01L_OBJC_METH_VAR_TYPE_", ptr @"\01l_OBJC_$_INSTANCE_METHODS_A", ptr @"\01L_OBJC_METH_VAR_NAME_3", ptr @"\01L_OBJC_METH_VAR_TYPE_4", ptr @"\01l_OBJC_$_INSTANCE_VARIABLES_A", ptr @"\01L_OBJC_CLASSLIST_REFERENCES_$_5", ptr @"\01L_OBJC_LABEL_CLASS_$"], section "llvm.metadata" define internal ptr @"\01-[A init]"(ptr %self, ptr %_cmd) #0 !dbg !13 { %1 = alloca ptr, align 8 %2 = alloca ptr, align 8 %3 = alloca %struct._objc_super %4 = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>, align 8 store ptr %self, ptr %1, align 8 call void @llvm.dbg.declare(metadata ptr %1, metadata !60, metadata !DIExpression()), !dbg !62 store ptr %_cmd, ptr %2, align 8 call void @llvm.dbg.declare(metadata ptr %2, metadata !63, metadata !DIExpression()), !dbg !62 %5 = load ptr, ptr %1, !dbg !65 %6 = bitcast ptr %5 to ptr, !dbg !65 %7 = getelementptr inbounds %struct._objc_super, ptr %3, i32 0, i32 0, !dbg !65 store ptr %6, ptr %7, !dbg !65 %8 = load ptr, ptr @"\01L_OBJC_CLASSLIST_SUP_REFS_$_", !dbg !65 %9 = bitcast ptr %8 to ptr, !dbg !65 %10 = getelementptr inbounds %struct._objc_super, ptr %3, i32 0, i32 1, !dbg !65 store ptr %9, ptr %10, !dbg !65 %11 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_", !dbg !65, !invariant.load !67 %12 = call ptr @objc_msgSendSuper2(ptr %3, ptr %11), !dbg !65 %13 = bitcast ptr %12 to ptr, !dbg !65 store ptr %13, ptr %1, align 8, !dbg !65 %14 = icmp ne ptr %13, null, !dbg !65 br i1 %14, label %15, label %24, !dbg !65 ;