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 3 4 /* 5 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 12 13 */ 14 15 @interface B @end 16 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]; 29 } 30 @end 31 32 @interface C : A 33 @property int p3; 34 @end 35 36 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"C\00" 37 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\11p\00" 38 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"!`\00" 39 40 41 @implementation C 42 @synthesize p3 = _p3; 43 @end 44 45 @interface A() 46 @property int p0; 47 @property (assign) __strong id p1; 48 @property (assign) __weak id p2; 49 @end 50 51 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"A\00" 52 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\11q\10\00" 53 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"!q\00" 54 55 @implementation A 56 @synthesize p0 = _p0; 57 @synthesize p1 = _p1; 58 @synthesize p2 = _p2; 59 @end 60 61 @interface D : A 62 @property int p3; 63 @end 64 65 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"D\00" 66 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\11p\00" 67 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"!`\00" 68 69 @implementation D 70 @synthesize p3 = _p3; 71 @end 72 73 typedef unsigned short UInt16; 74 75 76 typedef signed char BOOL; 77 typedef unsigned int FSCatalogInfoBitmap; 78 79 @interface NSFileLocationComponent { 80 @private 81 82 id _specifierOrStandardizedPath; 83 BOOL _carbonCatalogInfoAndNameAreValid; 84 FSCatalogInfoBitmap _carbonCatalogInfoMask; 85 id _name; 86 id _containerComponent; 87 id _presentableName; 88 id _iconAsAttributedString; 89 } 90 @end 91 92 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"NSFileLocationComponent\00" 93 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\01\14\00" 94 95 @implementation NSFileLocationComponent @end 96 97 @interface NSObject { 98 id isa; 99 } 100 @end 101 102 @interface Foo : NSObject { 103 id ivar; 104 105 unsigned long bitfield :31; 106 unsigned long bitfield2 :1; 107 unsigned long bitfield3 :32; 108 } 109 @end 110 111 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"Foo\00" 112 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\02\10\00" 113 114 @implementation Foo @end 115 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; 121 }; 122 @interface Packed : NSObject { 123 struct PackedStruct _packed; 124 } 125 @end 126 @implementation Packed @end 127 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"Packed\00" 128 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\01 \00" 129 // ' ' == 0x20 130 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. 134 135 @interface AnonymousUnion : NSObject { 136 struct { 137 union { 138 id _object; 139 void *_ptr; 140 }; 141 } a; 142 } 143 @end 144 @implementation AnonymousUnion @end 145 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"AnonymousUnion\00" 146 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\02\00" 147 148 @interface AnonymousStruct : NSObject { 149 struct { 150 struct { 151 id _object; 152 __weak id _weakref; 153 }; 154 } a; 155 } 156 @end 157 @implementation AnonymousStruct @end 158 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"AnonymousStruct\00" 159 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"\02\10\00" 160 // CHECK: @OBJC_CLASS_NAME_{{.*}} = private global {{.*}} c"!\00" 161 // '!' == 0x21 162