216 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-macosx10.14.0 -emit-llvm %s -o - | FileCheck %s2 3// CHECK: @"OBJC_IVAR_$_StaticLayout.static_layout_ivar" = hidden constant i64 204// CHECK: @"OBJC_IVAR_$_SuperClass.superClassIvar" = hidden constant i64 205// CHECK: @"OBJC_IVAR_$_SuperClass._superClassProperty" = hidden constant i64 246// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar" = constant i64 327// CHECK: @"OBJC_IVAR_$_IntermediateClass.intermediateClassIvar2" = constant i64 408// CHECK: @"OBJC_IVAR_$_IntermediateClass._intermediateProperty" = hidden constant i64 489// CHECK: @"OBJC_IVAR_$_SubClass.subClassIvar" = constant i64 5610// CHECK: @"OBJC_IVAR_$_SubClass._subClassProperty" = hidden constant i64 6411 12// CHECK: @"OBJC_IVAR_$_RootClass.these" = constant i64 013// CHECK: @"OBJC_IVAR_$_RootClass.never" = constant i64 414// CHECK: @"OBJC_IVAR_$_RootClass.change" = constant i64 815// CHECK: @"OBJC_IVAR_$_StillStaticLayout.static_layout_ivar" = hidden constant i64 1216 17// CHECK: @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar" = hidden global i64 1218// CHECK: @"OBJC_IVAR_$_SuperClass2._superClassProperty2" = hidden constant i64 2019// CHECK: @"OBJC_IVAR_$_IntermediateClass2._IntermediateClass2Property" = hidden constant i64 2420// CHECK: @"OBJC_IVAR_$_SubClass2._subClass2Property" = hidden constant i64 2821 22@interface NSObject {23 int these, will, never, change, ever;24}25@end26 27@interface StaticLayout : NSObject28@end29 30@implementation StaticLayout {31 int static_layout_ivar;32}33 34// CHECK-LABEL: define internal void @"\01-[StaticLayout meth]"35-(void)meth {36 static_layout_ivar = 0;37 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_StaticLayout38 // CHECK: getelementptr inbounds i8, ptr %0, i64 2039}40@end41 42@interface SuperClass : NSObject43@property (nonatomic, assign) int superClassProperty;44@end45 46@implementation SuperClass {47 int superClassIvar; // Declare an ivar48}49 50// CHECK-LABEL: define internal void @"\01-[SuperClass superClassMethod]"51- (void)superClassMethod {52 _superClassProperty = 42;53 superClassIvar = 10;54 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SuperClass55 // CHECK: getelementptr inbounds i8, ptr %1, i64 2056}57 58// Implicitly synthesized method here59// CHECK-LABEL: define internal i32 @"\01-[SuperClass superClassProperty]"60// CHECK: getelementptr inbounds i8, ptr %0, i64 2461 62// CHECK-LABEL: define internal void @"\01-[SuperClass setSuperClassProperty:]"63// CHECK: getelementptr inbounds i8, ptr %1, i64 2464@end65 66@interface IntermediateClass : SuperClass {67 double intermediateClassIvar;68 69 @protected70 int intermediateClassIvar2;71}72@property (nonatomic, strong) SuperClass *intermediateProperty;73@end74 75@implementation IntermediateClass76@synthesize intermediateProperty = _intermediateProperty;77 78// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassMethod]"79- (void)intermediateClassMethod {80 intermediateClassIvar = 3.14;81 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass82 // CHECK: getelementptr inbounds i8, ptr %0, i64 3283}84 85// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassPropertyMethod]"86- (void)intermediateClassPropertyMethod {87 self.intermediateProperty = 0;88 // CHECK: load ptr, ptr @OBJC_SELECTOR_REFERENCES_89 // CHECK: call void @objc_msgSend(ptr noundef %0, ptr noundef %1, ptr noundef null)90}91 92// CHECK-LABEL: define internal void @"\01-[IntermediateClass intermediateClassPropertyMethodDirect]"93- (void)intermediateClassPropertyMethodDirect {94 _intermediateProperty = 0;95 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass._intermediateProperty"96 // CHECK: getelementptr inbounds i8, ptr %0, i64 4897}98@end99 100@interface SubClass : IntermediateClass {101 double subClassIvar;102}103@property (nonatomic, assign) SubClass *subClassProperty;104@end105 106@implementation SubClass107 108// CHECK-LABEL: define internal void @"\01-[SubClass subclassVar]"109- (void)subclassVar {110 subClassIvar = 6.28;111 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass112 // CHECK: getelementptr inbounds i8, ptr %0, i64 56113}114 115// CHECK-LABEL: define internal void @"\01-[SubClass intermediateSubclassVar]"116-(void)intermediateSubclassVar {117 intermediateClassIvar = 3.14;118 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_IntermediateClass119 // CHECK: getelementptr inbounds i8, ptr %0, i64 32120}121 122// Implicit synthesized method here:123// CHECK-LABEL: define internal ptr @"\01-[SubClass subClassProperty]"124// CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass._subClassProperty"125// CHECK: getelementptr inbounds i8, ptr %0, i64 64126 127// CHECK-LABEL: define internal void @"\01-[SubClass setSubClassProperty:]"128// CHECK-NOT: load i64, ptr @"OBJC_IVAR_$_SubClass._subClassProperty"129// CHECK: getelementptr inbounds i8, ptr %1, i64 64130@end131 132 __attribute((objc_root_class)) @interface RootClass {133 int these, never, change;134}135@end136 137@implementation RootClass 138@end139 140@interface StillStaticLayout : RootClass141@end142 143@implementation StillStaticLayout {144 int static_layout_ivar;145}146 147// CHECK-LABEL: define internal void @"\01-[StillStaticLayout meth]"148-(void)meth {149 static_layout_ivar = 0;150 // CHECK-NOT: load i64, ptr @"OBJC_IVAR_$StillStaticLayout.static_layout_ivar151}152@end153 154@interface NotNSObject155@end156 157@interface NotStaticLayout : NotNSObject {158 int these, might, change;159}160@end161 162@implementation NotStaticLayout {163 int not_static_layout_ivar;164}165 166// CHECK-LABEL: define internal void @"\01-[NotStaticLayout meth]"167-(void)meth {168 not_static_layout_ivar = 0;169 // CHECK: load i64, ptr @"OBJC_IVAR_$_NotStaticLayout.not_static_layout_ivar170}171@end172 173// CHECK: define internal i32 @"\01-[IntermediateClass2 IntermediateClass2Property]"(ptr noundef %[[SELF:.*]],174// CHECK: %[[SELF_ADDR:.*]] = alloca ptr, align 8175// CHECK: store ptr %[[SELF]], ptr %[[SELF_ADDR]], align 8176// CHECK: %[[V0:.*]] = load ptr, ptr %[[SELF_ADDR]], align 8177// CHECK: %[[ADD_PTR:.*]] = getelementptr inbounds i8, ptr %[[V0]], i64 24178// CHECK: %[[LOAD:.*]] = load atomic i32, ptr %[[ADD_PTR]] unordered, align 4179// CHECK: ret i32 %[[LOAD]]180 181// CHECK: define internal i32 @"\01-[SubClass2 subClass2Property]"(ptr noundef %[[SELF:.*]],182// CHECK: %[[SELF_ADDR:.*]] = alloca ptr, align 8183// CHECK: store ptr %[[SELF]], ptr %[[SELF_ADDR]], align 8184// CHECK: %[[V0:.*]] = load ptr, ptr %[[SELF_ADDR]], align 8185// CHECK: %[[ADD_PTR:.*]] = getelementptr inbounds i8, ptr %[[V0]], i64 28186// CHECK: %[[LOAD:.*]] = load atomic i32, ptr %[[ADD_PTR]] unordered, align 4187// CHECK: ret i32 %[[LOAD]]188 189@interface SuperClass2 : NSObject190@property int superClassProperty2;191@end192 193@interface IntermediateClass2 : SuperClass2194@property int IntermediateClass2Property;195@end196 197@interface IntermediateClass3 : SuperClass2198@property int IntermediateClass3Property;199@end200 201@interface SubClass2 : IntermediateClass2202@property int subClass2Property;203@end204 205@implementation IntermediateClass3206@end207 208@implementation SuperClass2209@end210 211@implementation IntermediateClass2212@end213 214@implementation SubClass2215@end216