xref: /aosp_15_r20/external/clang/test/CodeGenObjC/interface-layout-64.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I3._iv2" = global i64 8, section "__DATA, __objc_ivar", align 8
4*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I3._iv3" = global i64 12, section "__DATA, __objc_ivar", align 8
5*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I3" = private global {{.*}} { i32 0, i32 8, i32 13
6*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I4._iv4" = global i64 13, section "__DATA, __objc_ivar", align 8
7*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I4" = private global {{.*}} { i32 0, i32 13, i32 14, {{.*}}
8*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I5._iv6_synth" = hidden global i64 16, section "__DATA, __objc_ivar", align 8
9*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I5._iv7_synth" = hidden global i64 20, section "__DATA, __objc_ivar", align 8
10*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I5._iv5" = global i64 14, section "__DATA, __objc_ivar", align 8
11*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I5" = private global {{.*}} { i32 0, i32 14, i32 24, {{.*}}
12*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I6.iv0" = global i64 0, section "__DATA, __objc_ivar", align 8
13*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I6" = private global {{.*}} { i32 2, i32 0, i32 1, {{.*}}
14*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I8.b" = global i64 8, section "__DATA, __objc_ivar", align 8
15*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I8" = private global {{.*}} { i32 0, i32 8, i32 16, {{.*}}
16*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I9.iv0" = global i64 0, section "__DATA, __objc_ivar", align 8
17*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I9" = private global {{.*}} { i32 2, i32 0, i32 4, {{.*}}
18*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I10.iv1" = global i64 4, section "__DATA, __objc_ivar", align 8
19*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I10" = private global {{.*}} { i32 0, i32 4, i32 5, {{.*}}
20*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I11" = private global {{.*}} { i32 0, i32 5, i32 5, {{.*}}
21*67e74705SXin Li// CHECK: @"OBJC_IVAR_$_I12.iv2" = global i64 8, section "__DATA, __objc_ivar", align 8
22*67e74705SXin Li// CHECK: _OBJC_CLASS_RO_$_I12" = private global {{.*}} { i32 0, i32 8, i32 12, {{.*}}
23*67e74705SXin Li
24*67e74705SXin Li/*
25*67e74705SXin Li  Compare to:
26*67e74705SXin Li    gcc -m64 -S -o - interface-layout-64.m | grep '^_OBJC_IVAR_$_*{{.*}}' -A 1
27*67e74705SXin Li  and
28*67e74705SXin Li    gcc -m64 -S -o - interface-layout-64.m | grep '^l{{.*}}_CLASS_RO_$_I[0-9]*' -A 3
29*67e74705SXin Li */
30*67e74705SXin Li
31*67e74705SXin Listruct s0 {
32*67e74705SXin Li  double x;
33*67e74705SXin Li};
34*67e74705SXin Li
35*67e74705SXin Li@interface I2 {
36*67e74705SXin Li  struct s0 _iv1;
37*67e74705SXin Li}
38*67e74705SXin Li@end
39*67e74705SXin Li
40*67e74705SXin Li@interface I3 : I2 {
41*67e74705SXin Li  unsigned int _iv2 :1;
42*67e74705SXin Li  unsigned : 0;
43*67e74705SXin Li  unsigned int _iv3 : 3;
44*67e74705SXin Li}
45*67e74705SXin Li@end
46*67e74705SXin Li
47*67e74705SXin Li@interface I4 : I3 {
48*67e74705SXin Li char _iv4;
49*67e74705SXin Li}
50*67e74705SXin Li@end
51*67e74705SXin Li
52*67e74705SXin Li@interface I5 : I4 {
53*67e74705SXin Li char _iv5;
54*67e74705SXin Li}
55*67e74705SXin Li
56*67e74705SXin Li@property int prop0;
57*67e74705SXin Li@end
58*67e74705SXin Li
59*67e74705SXin Li@implementation I3
60*67e74705SXin Li@end
61*67e74705SXin Li
62*67e74705SXin Li@implementation I4
63*67e74705SXin Li@end
64*67e74705SXin Li
65*67e74705SXin Li@interface I5 ()
66*67e74705SXin Li@property int prop1;
67*67e74705SXin Li@property char prop2;
68*67e74705SXin Li@end
69*67e74705SXin Li
70*67e74705SXin Li@implementation I5
71*67e74705SXin Li@synthesize prop0 = _iv6_synth;
72*67e74705SXin Li@synthesize prop1 = _iv7_synth;
73*67e74705SXin Li@synthesize prop2 = _iv5;
74*67e74705SXin Li@end
75*67e74705SXin Li
76*67e74705SXin Li// The size rounds up to the next available byte.
77*67e74705SXin Li@interface I6 {
78*67e74705SXin Li  unsigned iv0 : 2;
79*67e74705SXin Li}
80*67e74705SXin Li@end
81*67e74705SXin Li@implementation I6
82*67e74705SXin Li@end
83*67e74705SXin Li
84*67e74705SXin Li// The start of the subclass includes padding for its own alignment.
85*67e74705SXin Li@interface I7 {
86*67e74705SXin Li  char a;
87*67e74705SXin Li}
88*67e74705SXin Li@end
89*67e74705SXin Li@interface I8 : I7 {
90*67e74705SXin Li  double b;
91*67e74705SXin Li}
92*67e74705SXin Li@end
93*67e74705SXin Li@implementation I8
94*67e74705SXin Li@end
95*67e74705SXin Li
96*67e74705SXin Li// Padding bit-fields
97*67e74705SXin Li@interface I9 {
98*67e74705SXin Li  unsigned iv0 : 2;
99*67e74705SXin Li  unsigned : 0;
100*67e74705SXin Li}
101*67e74705SXin Li@end
102*67e74705SXin Li@implementation I9
103*67e74705SXin Li@end
104*67e74705SXin Li@interface I10 : I9 {
105*67e74705SXin Li  unsigned iv1 : 2;
106*67e74705SXin Li}
107*67e74705SXin Li@end
108*67e74705SXin Li@implementation I10
109*67e74705SXin Li@end
110*67e74705SXin Li
111*67e74705SXin Li// Empty structures
112*67e74705SXin Li@interface I11 : I10
113*67e74705SXin Li@end
114*67e74705SXin Li@implementation I11
115*67e74705SXin Li@end
116*67e74705SXin Li@interface I12 : I11 {
117*67e74705SXin Li  unsigned iv2;
118*67e74705SXin Li}
119*67e74705SXin Li@end
120*67e74705SXin Li@implementation I12
121*67e74705SXin Li@end
122