Rafael Espindola | a3f55b0 | 2013-09-04 04:12:25 +0000 | [diff] [blame] | 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 |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 2 | // RUN: FileCheck --input-file=%t-32.layout %s |
| 3 | // rdar://12184410 |
| 4 | // rdar://12752901 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 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 |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 14 | // CHECK: block variable layout: BL_NON_OBJECT_WORD:3, BL_STRONG:1, BL_OPERATOR:0 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 15 | void (^block1)() = ^{ printf("%#llx", eightByte); NSLog(@"%@", strong); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 16 | |
| 17 | // Test2 |
| 18 | int i = 1; |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 19 | // CHECK: block variable layout: BL_NON_OBJECT_WORD:3, BL_STRONG:1, BL_OPERATOR:0 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 20 | void (^block2)() = ^{ printf("%#llx, %d", eightByte, i); NSLog(@"%@", strong); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 21 | |
| 22 | // Test3 |
| 23 | char ch = 'a'; |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 24 | // CHECK: block variable layout: BL_NON_OBJECT_WORD:3, BL_STRONG:1, BL_OPERATOR:0 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 25 | void (^block3)() = ^{ printf("%c %#llx", ch, eightByte); NSLog(@"%@", strong); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 26 | |
| 27 | // Test4 |
| 28 | unsigned long fourByte = 0x8001ul; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 29 | // block variable layout: BL_NON_OBJECT_WORD:1, BL_STRONG:1, BL_OPERATOR:0 |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 30 | // CHECK: Inline instruction for block variable layout: 0x0100 |
| 31 | void (^block4)() = ^{ printf("%c %#lx", ch, fourByte); NSLog(@"%@", strong); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 32 | |
| 33 | // Test5 |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 34 | // CHECK: block variable layout: BL_NON_OBJECT_WORD:3, BL_STRONG:1, BL_OPERATOR:0 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 35 | void (^block5)() = ^{ NSLog(@"%@", strong); printf("%c %#llx", ch, eightByte); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 36 | |
| 37 | // Test6 |
Fariborz Jahanian | 90a2d39 | 2013-01-17 00:25:06 +0000 | [diff] [blame] | 38 | // CHECK: block variable layout: BL_OPERATOR:0 |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 39 | void (^block6)() = ^{ printf("%#llx", eightByte); }; |
Fariborz Jahanian | ff685c5 | 2012-12-04 17:20:57 +0000 | [diff] [blame] | 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 | */ |