xref: /aosp_15_r20/external/clang/test/CodeGenObjC/arc-captured-32bit-block-var-layout-2.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// 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*67e74705SXin Li// RUN: FileCheck --input-file=%t-32.layout %s
3*67e74705SXin Li// rdar://12184410
4*67e74705SXin Li// rdar://12752901
5*67e74705SXin Li
6*67e74705SXin Li@class NSString;
7*67e74705SXin Liextern void NSLog(NSString *format, ...);
8*67e74705SXin Liextern int printf(const char *, ...);
9*67e74705SXin Li
10*67e74705SXin Liint main() {
11*67e74705SXin Li  NSString *strong;
12*67e74705SXin Li  unsigned long long eightByte = 0x8001800181818181ull;
13*67e74705SXin Li  // Test1
14*67e74705SXin Li  // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
15*67e74705SXin Li  void (^block1)() = ^{ printf("%#llx", eightByte); NSLog(@"%@", strong); };
16*67e74705SXin Li
17*67e74705SXin Li  // Test2
18*67e74705SXin Li  int i = 1;
19*67e74705SXin Li  // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
20*67e74705SXin Li  void (^block2)() = ^{ printf("%#llx, %d", eightByte, i); NSLog(@"%@", strong); };
21*67e74705SXin Li
22*67e74705SXin Li  //  Test3
23*67e74705SXin Li  char ch = 'a';
24*67e74705SXin Li  // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
25*67e74705SXin Li  void (^block3)() = ^{ printf("%c %#llx", ch, eightByte); NSLog(@"%@", strong); };
26*67e74705SXin Li
27*67e74705SXin Li  // Test4
28*67e74705SXin Li  unsigned long fourByte = 0x8001ul;
29*67e74705SXin Li  // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
30*67e74705SXin Li  void (^block4)() = ^{ printf("%c %#lx", ch, fourByte); NSLog(@"%@", strong); };
31*67e74705SXin Li
32*67e74705SXin Li  // Test5
33*67e74705SXin Li  // CHECK: Inline block variable layout: 0x0100, BL_STRONG:1, BL_OPERATOR:0
34*67e74705SXin Li  void (^block5)() = ^{ NSLog(@"%@", strong); printf("%c %#llx", ch, eightByte); };
35*67e74705SXin Li
36*67e74705SXin Li  // Test6
37*67e74705SXin Li  // CHECK: Block variable layout: BL_OPERATOR:0
38*67e74705SXin Li  void (^block6)() = ^{ printf("%#llx", eightByte); };
39*67e74705SXin Li}
40*67e74705SXin Li
41*67e74705SXin Li/**
42*67e74705SXin Listruct __block_literal_generic { // 32bytes (64bit) and 20 bytes (32bit).
43*67e74705SXin Li0  void *__isa;
44*67e74705SXin Li4  int __flags;
45*67e74705SXin Li8  int __reserved;
46*67e74705SXin Li12  void (*__invoke)(void *);
47*67e74705SXin Li16  struct __block_descriptor *__descriptor;
48*67e74705SXin Li};
49*67e74705SXin Li*/
50