xref: /llvm-project/clang/test/CodeGenObjC/constant-non-fragile-ivar-offset.m (revision 923ddf65f4e21ec67018cf56e823895de18d83bc)
1// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | FileCheck %s
2
3// CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 20
4// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = hidden constant i64 20
5// CHECK: @"OBJC_IVAR_$_SuperClass._superClassProperty" = hidden constant i64 24
6// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar" = constant i64 32
7// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar2" = constant i64 40
8// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden constant i64 48
9// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = constant i64 56
10// CHECK: @"OBJC_IVAR_$_SubClass._subClassProperty" = hidden constant i64 64
11// CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden global i64 12
12
13@interface NSObject {
14  int these, will, never, change, ever;
15}
16@end
17
18@interface StaticLayout : NSObject
19@end
20
21@implementation StaticLayout {
22  int static_layout_ivar;
23}
24
25// CHECK-LABEL: define internal void @"\01-[StaticLayout meth]"
26-(void)meth {
27  static_layout_ivar = 0;
28  // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_StaticLayout
29  // CHECK: getelementptr inbounds i8, ptr %0, i64 20
30}
31@end
32
33@interface SuperClass : NSObject
34@property (nonatomic, assign) int superClassProperty;
35@end
36
37@implementation SuperClass {
38  int superClassIvar; // Declare an ivar
39}
40
41// CHECK-LABEL: define internal void @"\01-[SuperClass superClassMethod]"
42- (void)superClassMethod {
43    _superClassProperty = 42;
44    superClassIvar = 10;
45    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SuperClass
46    // CHECK: getelementptr inbounds i8, ptr %1, i64 20
47}
48
49// Implicitly synthesized method here
50// CHECK-LABEL: define internal i32 @"\01-[SuperClass superClassProperty]"
51// CHECK: getelementptr inbounds i8, ptr %0, i64 24
52
53// CHECK-LABEL: define internal void @"\01-[SuperClass setSuperClassProperty:]"
54// CHECK: getelementptr inbounds i8, ptr %1, i64 24
55@end
56
57@interface IntermediateClass : SuperClass {
58    double intermediateClassIvar;
59
60    @protected
61    int intermediateClassIvar2;
62}
63@property (nonatomic, strong) SuperClass *intermediateProperty;
64@end
65
66@implementation IntermediateClass
67@synthesize intermediateProperty = _intermediateProperty;
68
69// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassMethod]"
70- (void)intermediateClassMethod {
71    intermediateClassIvar = 3.14;
72    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
73    // CHECK: getelementptr inbounds i8, ptr %0, i64 32
74}
75
76// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassPropertyMethod]"
77- (void)intermediateClassPropertyMethod {
78    self.intermediateProperty = 0;
79    // CHECK: load ptr, ptr @OBJC_SELECTOR_REFERENCES_
80    // CHECK: call void @objc_msgSend(ptr noundef %0, ptr noundef %1, ptr noundef null)
81}
82
83// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassPropertyMethodDirect]"
84- (void)intermediateClassPropertyMethodDirect {
85    _intermediateProperty = 0;
86    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass._intermediateProperty"
87    // CHECK: getelementptr inbounds i8, ptr %0, i64 48
88}
89@end
90
91@interface SubClass : IntermediateClass {
92    double subClassIvar;
93}
94@property (nonatomic, assign) SubClass *subClassProperty;
95@end
96
97@implementation SubClass
98
99// CHECK-LABEL: define internal void @"\01-[SubClass subclassVar]"
100- (void)subclassVar {
101    subClassIvar = 6.28;
102    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass
103    // CHECK: getelementptr inbounds i8, ptr %0, i64 56
104}
105
106// CHECK-LABEL: define internal void @"\01-[SubClass intermediateSubclassVar]"
107-(void)intermediateSubclassVar {
108    intermediateClassIvar = 3.14;
109    // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass
110    // CHECK: getelementptr inbounds i8, ptr %0, i64 32
111}
112
113// Implicit synthesized method here:
114// CHECK-LABEL: define internal ptr @"\01-[SubClass subClassProperty]"
115// CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass._subClassProperty"
116// CHECK: getelementptr inbounds i8, ptr %0, i64 64
117
118// CHECK-LABEL: define internal void @"\01-[SubClass setSubClassProperty:]"
119// CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass._subClassProperty"
120// CHECK: getelementptr inbounds i8, ptr %1, i64 64
121@end
122
123@interface NotNSObject {
124  int these, might, change;
125}
126@end
127
128@interface NotStaticLayout : NotNSObject
129@end
130
131@implementation NotStaticLayout {
132  int not_static_layout_ivar;
133}
134
135// CHECK-LABEL: define internal void @"\01-[NotStaticLayout meth]"
136-(void)meth {
137  not_static_layout_ivar = 0;
138  // CHECK: load i64, ptr @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar
139}
140@end
141