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