[docs] Add LICENSE.txt to the root of the mono-repo
[llvm-project.git] / clang / test / CodeGenObjC / ivar-layout-64.m
blobd3ffdfe444c8bc2fe67adc3a9e60ad78135e7999
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o - %s | FileCheck %s
4 /*
6 Here is a handy command for looking at llvm-gcc's output:
7 llvm-gcc -m64 -fobjc-gc -emit-llvm -S -o - ivar-layout-64.m | \
8   grep 'OBJC_CLASS_NAME.* =.*global' | \
9   sed -e 's#, section.*# ...#' | \
10   sed -e 's#_[0-9]*"#_NNN#' | \
11   sort
15 @interface B @end
17 @interface A {
18   struct s0 {
19     int f0;
20     int f1;
21   } f0;
22   id f1;
23 __weak B *f2;
24   int f3 : 5;
25   struct s1 {
26     int *f0;
27     int *f1;
28   } f4[2][1];
30 @end
32 @interface C : A
33 @property int p3;
34 @end
36 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"C\00"
37 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
38 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
41 @implementation C
42 @synthesize p3 = _p3;
43 @end
45 @interface A()
46 @property int p0;
47 @property (assign) __strong id p1;
48 @property (assign) __weak id p2;
49 @end
51 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"A\00"
52 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11q\10\00"
53 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!q\00"
55 @implementation A
56 @synthesize p0 = _p0;
57 @synthesize p1 = _p1;
58 @synthesize p2 = _p2;
59 @end
61 @interface D : A
62 @property int p3;
63 @end
65 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"D\00"
66 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\11p\00"
67 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!`\00"
69 @implementation D
70 @synthesize p3 = _p3;
71 @end
73 typedef unsigned short UInt16;
76 typedef signed char BOOL;
77 typedef unsigned int FSCatalogInfoBitmap;
79 @interface NSFileLocationComponent {
80     @private
82     id _specifierOrStandardizedPath;
83     BOOL _carbonCatalogInfoAndNameAreValid;
84     FSCatalogInfoBitmap _carbonCatalogInfoMask;
85     id _name;
86     id _containerComponent;
87     id _presentableName;
88     id _iconAsAttributedString;
90 @end
92 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"NSFileLocationComponent\00"
93 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01\14\00"
95 @implementation NSFileLocationComponent @end
97 @interface NSObject {
98   id isa;
100 @end
102 @interface Foo : NSObject {
103     id ivar;
105     unsigned long bitfield  :31;
106     unsigned long bitfield2 :1;
107     unsigned long bitfield3 :32;
109 @end
111 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Foo\00"
112 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
114 @implementation Foo @end
116 // GC layout strings aren't capable of expressing __strong ivars at
117 // non-word alignments.
118 struct __attribute__((packed)) PackedStruct {
119   char c;
120   __strong id x;
122 @interface Packed : NSObject {
123   struct PackedStruct _packed;
125 @end
126 @implementation Packed @end
127 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"Packed\00"
128 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\01 \00"
129 //  ' ' == 0x20
131 // Ensure that layout descends into anonymous unions and structs.
132 // Hilariously, anonymous unions and structs that appear directly as ivars
133 // are completely ignored by layout.
135 @interface AnonymousUnion : NSObject {
136   struct {
137     union {
138       id _object;
139       void *_ptr;
140     };
141   } a;
143 @end
144 @implementation AnonymousUnion @end
145 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousUnion\00"
146 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\00"
148 @interface AnonymousStruct : NSObject {
149   struct {
150     struct {
151       id _object;
152       __weak id _weakref;
153     };
154   } a;
156 @end
157 @implementation AnonymousStruct @end
158 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"AnonymousStruct\00"
159 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"\02\10\00"
160 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private unnamed_addr constant {{.*}} c"!\00"
161 //  '!' == 0x21