1*67e74705SXin Li// RUN: %clang_cc1 -emit-llvm -fblocks -debug-info-kind=limited -triple x86_64-apple-darwin10 -fobjc-dispatch-method=mixed -x objective-c < %s -o - | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li// rdar://problem/9279956 4*67e74705SXin Li// Test that we generate the proper debug location for a captured self. 5*67e74705SXin Li// The second half of this test is in llvm/tests/DebugInfo/debug-info-blocks.ll 6*67e74705SXin Li 7*67e74705SXin Li// CHECK: define {{.*}}_block_invoke 8*67e74705SXin Li// CHECK: %[[BLOCK:.*]] = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg 9*67e74705SXin Li// CHECK-NEXT: store <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %[[BLOCK]], <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %[[ALLOCA:.*]], align 10*67e74705SXin Li// CHECK-NEXT: call void @llvm.dbg.declare(metadata <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %[[ALLOCA]], metadata ![[SELF:[0-9]+]], metadata !{{.*}}) 11*67e74705SXin Li// CHECK-NEXT: call void @llvm.dbg.declare(metadata %1** %d, metadata ![[D:[0-9]+]], metadata !{{.*}}) 12*67e74705SXin Li 13*67e74705SXin Li// rdar://problem/14386148 14*67e74705SXin Li// Test that we don't emit bogus line numbers for the helper functions. 15*67e74705SXin Li// Test that we do emit scope info for the helper functions. 16*67e74705SXin Li// CHECK: define {{.*}} @__copy_helper_block_{{.*}}(i8*, i8*) 17*67e74705SXin Li// CHECK-NOT: ret 18*67e74705SXin Li// CHECK: call {{.*}}, !dbg ![[DBG_LINE:[0-9]+]] 19*67e74705SXin Li// CHECK-NOT: ret 20*67e74705SXin Li// CHECK: load {{.*}}, !dbg ![[COPY_LINE:[0-9]+]] 21*67e74705SXin Li// CHECK: define {{.*}} @__destroy_helper_block_{{.*}}(i8*) 22*67e74705SXin Li// CHECK-NOT: ret 23*67e74705SXin Li// CHECK: load {{.*}}, !dbg ![[DESTROY_LINE:[0-9]+]] 24*67e74705SXin Li 25*67e74705SXin Li// CHECK-DAG: [[DBG_LINE]] = !DILocation(line: 0, scope: ![[COPY_SP:[0-9]+]]) 26*67e74705SXin Li// CHECK-DAG: [[COPY_LINE]] = !DILocation(line: 0, scope: ![[COPY_SP:[0-9]+]]) 27*67e74705SXin Li// CHECK-DAG: [[COPY_SP]] = distinct !DISubprogram(name: "__copy_helper_block_" 28*67e74705SXin Li// CHECK-DAG: [[DESTROY_LINE]] = !DILocation(line: 0, scope: ![[DESTROY_SP:[0-9]+]]) 29*67e74705SXin Li// CHECK-DAG: [[DESTROY_SP]] = distinct !DISubprogram(name: "__destroy_helper_block_" 30*67e74705SXin Litypedef unsigned int NSUInteger; 31*67e74705SXin Li 32*67e74705SXin Li@protocol NSObject 33*67e74705SXin Li@end 34*67e74705SXin Li 35*67e74705SXin Li@interface NSObject <NSObject> 36*67e74705SXin Li- (id)init; 37*67e74705SXin Li+ (id)alloc; 38*67e74705SXin Li@end 39*67e74705SXin Li 40*67e74705SXin Li@interface NSDictionary : NSObject 41*67e74705SXin Li- (NSUInteger)count; 42*67e74705SXin Li@end 43*67e74705SXin Li 44*67e74705SXin Li@interface NSMutableDictionary : NSDictionary 45*67e74705SXin Li@end 46*67e74705SXin Li 47*67e74705SXin Li@interface A : NSObject { 48*67e74705SXin Li@public 49*67e74705SXin Li int ivar; 50*67e74705SXin Li} 51*67e74705SXin Li@end 52*67e74705SXin Li 53*67e74705SXin Listatic void run(void (^block)(void)) 54*67e74705SXin Li{ 55*67e74705SXin Li block(); 56*67e74705SXin Li} 57*67e74705SXin Li 58*67e74705SXin Li@implementation A 59*67e74705SXin Li 60*67e74705SXin Li- (id)init 61*67e74705SXin Li{ 62*67e74705SXin Li if ((self = [super init])) { 63*67e74705SXin Li run(^{ 64*67e74705SXin Li // CHECK-DAG: ![[SELF]] = !DILocalVariable(name: "self", scope:{{.*}}, line: [[@LINE+4]], 65*67e74705SXin Li // CHECK-DAG: ![[D]] = !DILocalVariable(name: "d", scope:{{.*}}, line: [[@LINE+1]], 66*67e74705SXin Li NSMutableDictionary *d = [[NSMutableDictionary alloc] init]; 67*67e74705SXin Li ivar = 42 + (int)[d count]; 68*67e74705SXin Li }); 69*67e74705SXin Li } 70*67e74705SXin Li return self; 71*67e74705SXin Li} 72*67e74705SXin Li 73*67e74705SXin Li@end 74*67e74705SXin Li 75*67e74705SXin Liint main() 76*67e74705SXin Li{ 77*67e74705SXin Li A *a = [[A alloc] init]; 78*67e74705SXin Li return 0; 79*67e74705SXin Li} 80