1 // RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s 2 3 @interface NSObject 4 + (id) new; 5 - (id) init; 6 @end 7 8 @interface Base : NSObject @end 9 10 // @implementation Base 11 // { 12 // int dummy; 13 // } 14 // @end 15 16 @interface Derived : Base 17 { 18 @public int member; 19 } 20 @end 21 22 @implementation Derived 23 - (id) init 24 { 25 self = [super init]; 26 member = 42; 27 return self; 28 } 29 @end 30 31 // CHECK: define internal i8* @"\01-[Derived init]" 32 // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load 33 34 void * variant_load_1(int i) { 35 void *ptr; 36 while (i--) { 37 Derived *d = [Derived new]; 38 ptr = &d->member; 39 } 40 return ptr; 41 } 42 43 // CHECK-LABEL: define i8* @variant_load_1(i32 %i) 44 // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8{{$}} 45 46 @interface Container : Derived @end 47 @implementation Container 48 - (void *) invariant_load_1 49 { 50 return &self->member; 51 } 52 @end 53 54 // CHECK-LABEL: define internal i8* @"\01-[Container invariant_load_1]" 55 // CHECK: [[IVAR:%.*]] = load i64, i64* @"OBJC_IVAR_$_Derived.member", align 8, !invariant.load 56 57 @interface ForBlock 58 { 59 @public 60 id foo; 61 } 62 @end 63 64 // CHECK-LABEL: define internal i8* @block_block_invoke 65 // CHECK: load i64, i64* @"OBJC_IVAR_$_ForBlock.foo" 66 id (^block)(ForBlock*) = ^(ForBlock* a) { 67 return a->foo; 68 }; 69