| // RUN: %clang_cc1 -fblocks -debug-info-kind=limited -emit-llvm %s -o - | FileCheck %s |
| // Make sure we do not generate line info for debugging-related frame setup. |
| // CHECK: define {{.*}}block_invoke |
| // CHECK-NOT: store {{.*}}%struct.__block_descriptor*{{.*}}dbg |
| // CHECK: store {{.*}}%struct.__block_descriptor*{{.*}}, align |
| // CHECK: ret |
| // CHECK: define {{.*}}block_invoke |
| // CHECK-NOT: store {{.*}}%struct.__block_descriptor*{{.*}}dbg |
| // CHECK: store {{.*}}%struct.__block_descriptor*{{.*}}, align |
| // CHECK: ret |
| // CHECK: define {{.*}}block_invoke |
| // CHECK-NOT: store {{.*}}%struct.__block_descriptor*{{.*}}dbg |
| // CHECK: store {{.*}}%struct.__block_descriptor*{{.*}}, align |
| // CHECK: ret |
| int printf(const char*, ...); |
| |
| static void* _NSConcreteGlobalBlock; |
| |
| |
| typedef void (^ HelloBlock_t)(const char * name); |
| |
| /* Breakpoint for first Block function. */ |
| HelloBlock_t helloBlock = ^(const char * name) { |
| printf("Hello there, %s!\n", name); |
| }; |
| |
| /* Breakpoint for second Block function. */ |
| static HelloBlock_t s_helloBlock = ^(const char * name) { |
| printf("Hello there, %s!\n", name); |
| }; |
| |
| /* Breakpoint for third Block function. */ |
| int X = 1234; |
| int (^CP)(void) = ^{ X = X+1; return X; }; |
| |
| int |
| main(int argc, char * argv[]) |
| { |
| helloBlock("world"); |
| s_helloBlock("world"); |
| |
| CP(); |
| printf ("X = %d\n", X); |
| return X - 1235; |
| } |