1 | // RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple i386-apple-darwin -print-ivar-layout -emit-llvm -o /dev/null %s > %t-32.layout |
2 | // RUN: FileCheck --input-file=%t-32.layout %s |
3 | // rdar://12184410 |
4 | // rdar://12752901 |
5 | |
6 | @class NSString; |
7 | extern void NSLog(NSString *format, ...); |
8 | extern int printf(const char *, ...); |
9 | |
10 | int main() { |
11 | NSString *strong; |
12 | unsigned long long eightByte = 0x8001800181818181ull; |
13 | // Test1 |
14 | // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 |
15 | void (^block1)() = ^{ printf("%#llx", eightByte); NSLog(@"%@", strong); }; |
16 | |
17 | // Test2 |
18 | int i = 1; |
19 | // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 |
20 | void (^block2)() = ^{ printf("%#llx, %d", eightByte, i); NSLog(@"%@", strong); }; |
21 | |
22 | // Test3 |
23 | char ch = 'a'; |
24 | // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 |
25 | void (^block3)() = ^{ printf("%c %#llx", ch, eightByte); NSLog(@"%@", strong); }; |
26 | |
27 | // Test4 |
28 | unsigned long fourByte = 0x8001ul; |
29 | // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 |
30 | void (^block4)() = ^{ printf("%c %#lx", ch, fourByte); NSLog(@"%@", strong); }; |
31 | |
32 | // Test5 |
33 | // Nothing gets printed here since the descriptor of this block is merged with |
34 | // the descriptor of Test3's block. |
35 | void (^block5)() = ^{ NSLog(@"%@", strong); printf("%c %#llx", ch, eightByte); }; |
36 | |
37 | // Test6 |
38 | // CHECK: Block variable layout: BL_OPERATOR:0 |
39 | void (^block6)() = ^{ printf("%#llx", eightByte); }; |
40 | } |
41 | |
42 | /** |
43 | struct __block_literal_generic { // 32bytes (64bit) and 20 bytes (32bit). |
44 | 0 void *__isa; |
45 | 4 int __flags; |
46 | 8 int __reserved; |
47 | 12 void (*__invoke)(void *); |
48 | 16 struct __block_descriptor *__descriptor; |
49 | }; |
50 | */ |
51 | |