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 4@class NSString; 5extern void NSLog(NSString *format, ...); 6extern int printf(const char *, ...); 7 8int main(void) { 9 NSString *strong; 10 unsigned long long eightByte = 0x8001800181818181ull; 11 // Test1 12 // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 13 void (^block1)(void) = ^{ printf("%#llx", eightByte); NSLog(@"%@", strong); }; 14 15 // Test2 16 int i = 1; 17 // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 18 void (^block2)(void) = ^{ printf("%#llx, %d", eightByte, i); NSLog(@"%@", strong); }; 19 20 // Test3 21 char ch = 'a'; 22 // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 23 void (^block3)(void) = ^{ printf("%c %#llx", ch, eightByte); NSLog(@"%@", strong); }; 24 25 // Test4 26 unsigned long fourByte = 0x8001ul; 27 // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0 28 void (^block4)(void) = ^{ printf("%c %#lx", ch, fourByte); NSLog(@"%@", strong); }; 29 30 // Test5 31 // Nothing gets printed here since the descriptor of this block is merged with 32 // the descriptor of Test3's block. 33 void (^block5)(void) = ^{ NSLog(@"%@", strong); printf("%c %#llx", ch, eightByte); }; 34 35 // Test6 36 // CHECK: Block variable layout: BL_OPERATOR:0 37 void (^block6)(void) = ^{ printf("%#llx", eightByte); }; 38} 39 40/** 41struct __block_literal_generic { // 32bytes (64bit) and 20 bytes (32bit). 420 void *__isa; 434 int __flags; 448 int __reserved; 4512 void (*__invoke)(void *); 4616 struct __block_descriptor *__descriptor; 47}; 48*/ 49