• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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
3// rdar://problem/9279956
4// Test that we generate the proper debug location for a captured self.
5// The second half of this test is in llvm/tests/DebugInfo/debug-info-blocks.ll
6
7// CHECK: define {{.*}}_block_invoke
8// CHECK: %[[BLOCK:.*]] = bitcast i8* %.block_descriptor to <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>*, !dbg
9// CHECK-NEXT: store <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>* %[[BLOCK]], <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %[[ALLOCA:.*]], align
10// CHECK-NEXT: call void @llvm.dbg.declare(metadata <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, %0* }>** %[[ALLOCA]], metadata ![[SELF:[0-9]+]], metadata !{{.*}})
11// CHECK-NEXT: call void @llvm.dbg.declare(metadata %1** %d, metadata ![[D:[0-9]+]], metadata !{{.*}})
12
13// Test that we do emit scope info for the helper functions, and that the
14// parameters to these functions are marked as artificial (so the debugger
15// doesn't accidentally step into the function).
16// CHECK: define {{.*}} @__copy_helper_block_{{.*}}(i8* %0, i8* %1)
17// CHECK-NOT: ret
18// CHECK: call {{.*}}, !dbg ![[DBG_LINE:[0-9]+]]
19// CHECK-NOT: ret
20// CHECK: load {{.*}}, !dbg ![[DBG_LINE]]
21// CHECK: ret {{.*}}, !dbg ![[DBG_LINE]]
22// CHECK: define {{.*}} @__destroy_helper_block_{{.*}}(i8*
23// CHECK-NOT: ret
24// CHECK: load {{.*}}, !dbg ![[DESTROY_LINE:[0-9]+]]
25// CHECK: ret {{.*}}, !dbg ![[DESTROY_LINE]]
26
27// CHECK-DAG: [[DBG_LINE]] = !DILocation(line: 0, scope: ![[COPY_SP:[0-9]+]])
28// CHECK-DAG: [[COPY_SP]] = distinct !DISubprogram(name: "__copy_helper_block_
29// CHECK-DAG: [[DESTROY_LINE]] = !DILocation(line: 0, scope: ![[DESTROY_SP:[0-9]+]])
30// CHECK-DAG: [[DESTROY_SP]] = distinct !DISubprogram(name: "__destroy_helper_block_
31typedef unsigned int NSUInteger;
32
33@protocol NSObject
34@end
35
36@interface NSObject <NSObject>
37- (id)init;
38+ (id)alloc;
39@end
40
41@interface NSDictionary : NSObject
42- (NSUInteger)count;
43@end
44
45@interface NSMutableDictionary : NSDictionary
46@end
47
48@interface A : NSObject {
49@public
50    int ivar;
51}
52@end
53
54static void run(void (^block)(void))
55{
56    block();
57}
58
59@implementation A
60
61- (id)init
62{
63    if ((self = [super init])) {
64      // CHECK-DAG: !DILocalVariable(arg: 1, scope: ![[COPY_SP]], {{.*}}, flags: DIFlagArtificial)
65      // CHECK-DAG: !DILocalVariable(arg: 2, scope: ![[COPY_SP]], {{.*}}, flags: DIFlagArtificial)
66      // CHECK-DAG: !DILocalVariable(arg: 1, scope: ![[DESTROY_SP]], {{.*}}, flags: DIFlagArtificial)
67      run(^{
68          // CHECK-DAG: ![[SELF]] = !DILocalVariable(name: "self", scope:{{.*}}, line: [[@LINE+4]],
69          // CHECK-DAG: ![[D]] = !DILocalVariable(name: "d", scope:{{.*}}, line: [[@LINE+1]],
70          NSMutableDictionary *d = [[NSMutableDictionary alloc] init];
71          ivar = 42 + (int)[d count];
72        });
73    }
74    return self;
75}
76
77@end
78
79int main()
80{
81	A *a = [[A alloc] init];
82	return 0;
83}
84