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