next-objc-dispatch.m [plain text]
// RUN: // RUN: -fobjc-dispatch-method=legacy | \
// RUN: FileCheck -check-prefix CHECK-FRAGILE_LEGACY //
// RUN: // RUN: -fobjc-dispatch-method=legacy | \
// RUN: FileCheck -check-prefix CHECK-NONFRAGILE_LEGACY //
// RUN: // RUN: -fobjc-dispatch-method=non-legacy | \
// RUN: FileCheck -check-prefix CHECK-NONFRAGILE_NONLEGACY //
// RUN: // RUN: -fobjc-dispatch-method=mixed | \
// RUN: FileCheck -check-prefix CHECK-NONFRAGILE_MIXED //
// <rdar://problem/7866951>
// There are basically four ways that we end up doing message dispatch for the
// NeXT runtime. They are:
// (1) fragile ABI, legacy dispatch
// (2) non-fragile ABI, legacy dispatch
// (2) non-fragile ABI, non-legacy dispatch
// (2) non-fragile ABI, mixed dispatch
//
// Note that fragile ABI and non-fragile ABI legacy dispatch are not the same,
// they use some different API calls (objc_msgSendSuper vs objc_msgSendSuper2).
// CHECK-FRAGILE_LEGACY: ModuleID
// CHECK-FRAGILE_LEGACY-NOT: declare i8* @objc_msgSendSuper2_fixup(
// CHECK-FRAGILE_LEGACY-NOT: declare i8* @objc_msgSend_fixup(
// CHECK-FRAGILE_LEGACY: declare i8* @objc_msgSendSuper(
// CHECK-FRAGILE_LEGACY: declare i8* @objc_msgSend(
// CHECK-NONFRAGILE_LEGACY: ModuleID
// CHECK-NONFRAGILE_LEGACY-NOT: declare i8* @objc_msgSendSuper2_fixup(
// CHECK-NONFRAGILE_LEGACY-NOT: declare i8* @objc_msgSend_fixup(
// CHECK-NONFRAGILE_LEGACY: declare i8* @objc_msgSendSuper2(
// CHECK-NONFRAGILE_LEGACY: declare i8* @objc_msgSend(
// CHECK-NONFRAGILE_NONLEGACY: ModuleID
// CHECK-NONFRAGILE_NONLEGACY: declare i8* @objc_msgSendSuper2_fixup(
// CHECK-NONFRAGILE_NONLEGACY: declare i8* @objc_msgSend_fixup(
// CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSendSuper2_fixup(
// CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSendSuper2(
// CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSend_fixup(
// CHECK-NONFRAGILE_MIXED: declare i8* @objc_msgSend(
@interface NSObject
+ (id)alloc;
- (id)init;
@end
@interface I0 : NSObject
-(void) im0;
@end
@implementation I0
+(id) alloc {
return [super alloc];
}
-(id) init {
[super init];
return self;
}
-(void) im0 {}
@end
void f0(I0 *a) {
[I0 alloc];
[a im0];
}