brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.2 KiB · 499a41a Raw
187 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-10.10 -emit-llvm -fblocks -fobjc-weak -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-MODERN2// RUN: %clang_cc1 -triple i386-apple-darwin10 -fobjc-runtime=macosx-fragile-10.10 -emit-llvm -fblocks -fobjc-weak -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-FRAGILE3 4@interface Object5- (instancetype) retain;6- (void) run;7@end8 9// The ivars in HighlyAlignedSubclass should be placed in the tail-padding10// of the superclass.  Ensure that they're still covered by layouts.11@interface HighlyAligned : Object {12  __attribute__((aligned(32))) void *array[2];13}14@end15// CHECK-MODERN: @"OBJC_IVAR_$_HighlyAlignedSubclass.ivar2" ={{.*}} global i64 24,16// CHECK-MODERN: @"OBJC_IVAR_$_HighlyAlignedSubclass.ivar" ={{.*}} global i64 16,17// CHECK-MODERN: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\02\00"18// CHECK-MODERN: @"_OBJC_CLASS_RO_$_HighlyAlignedSubclass" = {{.*}} {19// CHECK-FRAGILE: @OBJC_INSTANCE_VARIABLES_HighlyAlignedSubclass = {{.*}}, i32 8 }, {{.*}}, i32 12 }]20// CHECK-FRAGILE: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\02\00"21// CHECK-FRAGILE: @OBJC_CLASS_HighlyAlignedSubclass22@interface HighlyAlignedSubclass : HighlyAligned {23  __weak id ivar;24  __weak id ivar2;25}26@end27@implementation HighlyAlignedSubclass @end28 29// CHECK-MODERN: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"30// CHECK-MODERN: @"_OBJC_CLASS_RO_$_Foo" = {{.*}} { i32 77231//   772 == 0x30432//            ^ HasMRCWeakIvars33//            ^ HasCXXDestructorOnly34//              ^ HasCXXStructors35 36// CHECK-FRAGILE: @OBJC_CLASS_NAME_{{.*}} = {{.*}} c"\01\00"37// CHECK-FRAGILE: @OBJC_CLASS_Foo = {{.*}} i32 134225921,38//   134225921 == 0x0800200139//                   ^ HasMRCWeakIvars40//                      ^ HasCXXStructors41//                         ^ Factory42@interface Foo : Object {43  __weak id ivar;44}45@end46 47@implementation Foo48// CHECK-LABEL: define internal void @"\01-[Foo .cxx_destruct]"49// CHECK: call void @llvm.objc.destroyWeak50@end51 52 53void test1(__weak id x) {}54// CHECK-LABEL: define{{.*}} void @test155// CHECK:      [[X:%.*]] = alloca ptr,56// CHECK-NEXT: @llvm.objc.initWeak57// CHECK-NEXT: @llvm.objc.destroyWeak58// CHECK-NEXT: ret void59 60void test2(id y) {61  __weak id z = y;62}63// CHECK-LABEL: define{{.*}} void @test264// CHECK:      [[Y:%.*]] = alloca ptr,65// CHECK-NEXT: [[Z:%.*]] = alloca ptr,66// CHECK-NEXT: store67// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[Y]]68// CHECK-NEXT: call ptr @llvm.objc.initWeak(ptr [[Z]], ptr [[T0]])69// CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[Z]])70// CHECK-NEXT: ret void71 72void test3(id y) {73  __weak id z;74  z = y;75}76// CHECK-LABEL: define{{.*}} void @test377// CHECK:      [[Y:%.*]] = alloca ptr,78// CHECK-NEXT: [[Z:%.*]] = alloca ptr,79// CHECK-NEXT: store80// CHECK-NEXT: store ptr null, ptr [[Z]]81// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[Y]]82// CHECK-NEXT: call ptr @llvm.objc.storeWeak(ptr [[Z]], ptr [[T0]])83// CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[Z]])84// CHECK-NEXT: ret void85 86void test4(__weak id *p) {87  id y = *p;88}89// CHECK-LABEL: define{{.*}} void @test490// CHECK:      [[P:%.*]] = alloca ptr,91// CHECK-NEXT: [[Y:%.*]] = alloca ptr,92// CHECK-NEXT: store93// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[P]]94// CHECK-NEXT: [[T1:%.*]] = call ptr @llvm.objc.loadWeak(ptr [[T0]])95// CHECK-NEXT: store ptr [[T1]], ptr [[Y]]96// CHECK-NEXT: ret void97 98void test5(__weak id *p) {99  id y = [*p retain];100}101// CHECK-LABEL: define{{.*}} void @test5102// CHECK:      [[P:%.*]] = alloca ptr,103// CHECK-NEXT: [[Y:%.*]] = alloca ptr,104// CHECK-NEXT: store105// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[P]]106// CHECK-NEXT: [[T1:%.*]] = call ptr @llvm.objc.loadWeakRetained(ptr [[T0]])107// CHECK-NEXT: store ptr [[T1]], ptr [[Y]]108// CHECK-NEXT: ret void109 110void test6(__weak Foo **p) {111  Foo *y = [*p retain];112}113// CHECK-LABEL: define{{.*}} void @test6114// CHECK:      [[P:%.*]] = alloca ptr,115// CHECK-NEXT: [[Y:%.*]] = alloca ptr,116// CHECK-NEXT: store117// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[P]]118// CHECK-NEXT: [[T2:%.*]] = call ptr @llvm.objc.loadWeakRetained(ptr [[T0]])119// CHECK-NEXT: store ptr [[T2]], ptr [[Y]]120// CHECK-NEXT: ret void121 122extern id get_object(void);123extern void use_block(void (^)(void));124 125void test7(void) {126  __weak Foo *p = get_object();127  use_block(^{ [p run ]; });128}129// CHECK-LABEL: define{{.*}} void @test7130// CHECK:       [[P:%.*]] = alloca ptr,131// CHECK:       [[T0:%.*]] = call ptr @get_object()132// CHECK-NEXT:  call ptr @llvm.objc.initWeak(ptr [[P]], ptr [[T0]])133// CHECK:       call void @llvm.objc.copyWeak134// CHECK:       call void @use_block135// CHECK:       call void @llvm.objc.destroyWeak136 137// CHECK-LABEL: define linkonce_odr hidden void @__copy_helper_block138// CHECK:       @llvm.objc.copyWeak139 140// CHECK-LABEL: define linkonce_odr hidden void @__destroy_helper_block141// CHECK:       @llvm.objc.destroyWeak142 143void test8(void) {144  __block __weak Foo *p = get_object();145  use_block(^{ [p run ]; });146}147// CHECK-LABEL: define{{.*}} void @test8148// CHECK:       call ptr @llvm.objc.initWeak149// CHECK-NOT:   call void @llvm.objc.copyWeak150// CHECK:       call void @use_block151// CHECK:       call void @llvm.objc.destroyWeak152 153// CHECK-LABEL: define internal void @__Block_byref_object_copy154// CHECK:       call void @llvm.objc.moveWeak155 156// CHECK-LABEL: define internal void @__Block_byref_object_dispose157// CHECK:       call void @llvm.objc.destroyWeak158 159// CHECK-LABEL: define{{.*}} void @test9_baseline()160// CHECK:       define linkonce_odr hidden void @__copy_helper161// CHECK:       define linkonce_odr hidden void @__destroy_helper162void test9_baseline(void) {163  Foo *p = get_object();164  use_block(^{ [p run]; });165}166 167// CHECK-LABEL: define{{.*}} void @test9()168// CHECK-NOT:   define linkonce_odr hidden void @__copy_helper169// CHECK-NOT:   define linkonce_odr hidden void @__destroy_helper170// CHECK:       define{{.*}} void @test9_fin()171void test9(void) {172  __unsafe_unretained Foo *p = get_object();173  use_block(^{ [p run]; });174}175void test9_fin(void) {}176 177// CHECK-LABEL: define{{.*}} void @test10()178// CHECK-NOT:   define linkonce_odr hidden void @__copy_helper179// CHECK-NOT:   define linkonce_odr hidden void @__destroy_helper180// CHECK:       define{{.*}} void @test10_fin()181void test10(void) {182  typedef __unsafe_unretained Foo *UnsafeFooPtr;183  UnsafeFooPtr p = get_object();184  use_block(^{ [p run]; });185}186void test10_fin(void) {}187