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