xref: /aosp_15_r20/external/clang/test/CodeGenObjC/debug-info-blocks.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
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