1 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s \ 2 // RUN: -fobjc-dispatch-method=legacy | \ 3 // RUN: FileCheck -check-prefix CHECK-FRAGILE_LEGACY %s 4 // 5 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s \ 6 // RUN: -fobjc-dispatch-method=legacy | \ 7 // RUN: FileCheck -check-prefix CHECK-NONFRAGILE_LEGACY %s 8 // 9 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s \ 10 // RUN: -fobjc-dispatch-method=non-legacy | \ 11 // RUN: FileCheck -check-prefix CHECK-NONFRAGILE_NONLEGACY %s 12 // 13 // RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s \ 14 // RUN: -fobjc-dispatch-method=mixed | \ 15 // RUN: FileCheck -check-prefix CHECK-NONFRAGILE_MIXED %s 16 // 17 // <rdar://problem/7866951> 18 19 // There are basically four ways that we end up doing message dispatch for the 20 // NeXT runtime. They are: 21 // (1) fragile ABI, legacy dispatch 22 // (2) non-fragile ABI, legacy dispatch 23 // (2) non-fragile ABI, non-legacy dispatch 24 // (2) non-fragile ABI, mixed dispatch 25 // 26 // Note that fragile ABI and non-fragile ABI legacy dispatch are not the same, 27 // they use some different API calls (objc_msgSendSuper vs objc_msgSendSuper2). 28 29 // CHECK-FRAGILE_LEGACY: ModuleID 30 // CHECK-FRAGILE_LEGACY-NOT: declare i8* @objc_msgSendSuper2_fixup( 31 // CHECK-FRAGILE_LEGACY-NOT: declare i8* @objc_msgSend_fixup( 32 // CHECK-FRAGILE_LEGACY: declare i8* @objc_msgSendSuper( 33 // CHECK-FRAGILE_LEGACY: declare i8* @objc_msgSend( 34 35 // CHECK-NONFRAGILE_LEGACY: ModuleID 36 // CHECK-NONFRAGILE_LEGACY-NOT: declare i8* @objc_msgSendSuper2_fixup( 37 // CHECK-NONFRAGILE_LEGACY-NOT: declare i8* @objc_msgSend_fixup( 38 // CHECK-NONFRAGILE_LEGACY: declare i8* @objc_msgSendSuper2( 39 // CHECK-NONFRAGILE_LEGACY: declare i8* @objc_msgSend( 40 41 // CHECK-NONFRAGILE_NONLEGACY: ModuleID 42 // CHECK-NONFRAGILE_NONLEGACY: declare i8* @objc_msgSendSuper2_fixup( 43 // CHECK-NONFRAGILE_NONLEGACY: declare i8* @objc_msgSend_fixup( 44 45 // CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSendSuper2_fixup( 46 // CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSendSuper2( 47 // CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSend_fixup( 48 // CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSend( 49 50 @interface NSObject 51 + (id)alloc; 52 - (id)init; 53 @end 54 55 @interface I0 : NSObject 56 -(void) im0; 57 @end 58 59 @implementation I0 60 +(id) alloc { 61 return [super alloc]; 62 } 63 -(id) init { 64 [super init]; 65 return self; 66 } 67 -(void) im0 {} 68 @end 69 70 void f0(I0 *a) { 71 [I0 alloc]; 72 [a im0]; 73 } 74