Home | History | Annotate | Download | only in CodeGenObjC
      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