11// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | FileCheck %s
22
33// 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
411// CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden global i64 12
512
613@interface NSObject {
@@ -14,12 +21,105 @@ @interface StaticLayout : NSObject
1421@implementation StaticLayout {
1522 int static_layout_ivar;
1623}
24+
25+ // CHECK-LABEL: define internal void @"\01-[StaticLayout meth]"
1726-(void )meth {
1827 static_layout_ivar = 0 ;
1928 // 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
2088}
2189@end
2290
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+
23123@interface NotNSObject {
24124 int these, might, change;
25125}
@@ -31,6 +131,8 @@ @interface NotStaticLayout : NotNSObject
31131@implementation NotStaticLayout {
32132 int not_static_layout_ivar;
33133}
134+
135+ // CHECK-LABEL: define internal void @"\01-[NotStaticLayout meth]"
34136-(void )meth {
35137 not_static_layout_ivar = 0 ;
36138 // CHECK: load i64, ptr @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar
0 commit comments