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