File: next-objc-dispatch.m

package info (click to toggle)
llvm-toolchain-3.9 1%3A3.9.1-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 441,060 kB
  • ctags: 428,777
  • sloc: cpp: 2,546,577; ansic: 538,318; asm: 119,677; objc: 103,316; python: 102,148; sh: 27,847; pascal: 5,626; ml: 5,510; perl: 5,293; lisp: 4,801; makefile: 2,177; xml: 686; cs: 362; php: 212; csh: 117
file content (73 lines) | stat: -rw-r--r-- 2,458 bytes parent folder | download | duplicates (24)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s \
// RUN:   -fobjc-dispatch-method=legacy | \
// RUN:   FileCheck -check-prefix CHECK-FRAGILE_LEGACY %s
//
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s    \
// RUN:   -fobjc-dispatch-method=legacy | \
// RUN:   FileCheck -check-prefix CHECK-NONFRAGILE_LEGACY %s
//
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s    \
// RUN:   -fobjc-dispatch-method=non-legacy | \
// RUN:   FileCheck -check-prefix CHECK-NONFRAGILE_NONLEGACY %s
//
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -emit-llvm -o - %s    \
// RUN:   -fobjc-dispatch-method=mixed | \
// RUN:   FileCheck -check-prefix CHECK-NONFRAGILE_MIXED %s
//
// <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];
}