Mercurial > hg > CbC > CbC_gcc
comparison CbC-examples/code_segment_pointer_check/code_segment_pointer_check.cbc @ 27:f9b1a53df341
implemented indirect sibcall for ppc.
author | kent@teto.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Tue, 10 Nov 2009 16:34:29 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
26:b388631e4738 | 27:f9b1a53df341 |
---|---|
1 #include<stdio.h> | |
2 #include<stdlib.h> | |
3 #define dprint(f, args...) \ | |
4 printf("in %s env=%p: "f, __FUNCTION__, __builtin_frame_address(0), ## args) | |
5 | |
6 /* | |
7 * コードセグメント間の遷移で | |
8 * | |
9 * | |
10 * | |
11 */ | |
12 | |
13 __code schedule (); | |
14 __code cs0a (); | |
15 __code cs1a (int a); | |
16 __code cs2a (int a, double b); | |
17 __code cs3a (int a, double b, int c); | |
18 __code cs4a (int a, double b, int c, float d); | |
19 __code cs0b (); | |
20 __code cs1b (int a); | |
21 __code cs2b (int a, double b); | |
22 __code cs3b (int a, double b, int c); | |
23 __code cs4b (int a, double b, int c, float d); | |
24 | |
25 /* defined in file code_segment_pointer_check.cbc at offset 1649 */ | |
26 int main (); | |
27 | |
28 __code end(int a) { | |
29 dprint("exit with code %d\n",a); | |
30 exit(a); | |
31 } | |
32 | |
33 __code (*cs0) (); | |
34 __code (*cs1) (int); | |
35 __code (*cs2) (int, double); | |
36 __code (*cs3) (int, double, int); | |
37 __code (*cs4) (int, double, int, float); | |
38 int i=0; | |
39 __code schedule() { | |
40 dprint("i=%d\n",i); | |
41 if ( i>=100 ) { | |
42 goto end(0); | |
43 } | |
44 switch (i++%5) { | |
45 case 0: | |
46 goto cs0(); | |
47 case 1: | |
48 goto cs1(i); | |
49 case 2: | |
50 goto cs2(i, i*1.3); | |
51 case 3: | |
52 goto cs3(i, i*1.3, 20*i); | |
53 case 4: | |
54 goto cs4(i, i*1.3, 20*i, i*0.8); | |
55 default: | |
56 exit(0); | |
57 } | |
58 dprint("code unreachable!\n"); | |
59 } | |
60 | |
61 __code cs0a() { | |
62 dprint("no args\n"); | |
63 cs0 = cs0b; | |
64 goto schedule(); | |
65 } | |
66 __code cs1a(int a) { | |
67 dprint("int a=%d\n", a); | |
68 cs1 = cs1b; | |
69 goto schedule(); | |
70 } | |
71 __code cs2a(int a, double b) { | |
72 dprint("int a=%d, double b=%lf\n", a, b); | |
73 cs2 = cs2b; | |
74 goto schedule(); | |
75 } | |
76 __code cs3a(int a, double b, int c) { | |
77 dprint("int a=%d, double b=%lf, int c=%d\n", a, b, c); | |
78 cs3 = cs3b; | |
79 goto schedule(); | |
80 } | |
81 __code cs4a(int a, double b, int c, float d) { | |
82 dprint("int a=%d, double b=%lf, int c=%d, float d=%f\n", a, b, c, d); | |
83 cs4 = cs4b; | |
84 goto schedule(); | |
85 } | |
86 | |
87 __code cs0b() { | |
88 dprint("no args\n"); | |
89 cs0 = cs0a; | |
90 goto schedule(); | |
91 } | |
92 __code cs1b(int a) { | |
93 dprint("int a=%d\n", a); | |
94 cs1 = cs1a; | |
95 goto schedule(); | |
96 } | |
97 __code cs2b(int a, double b) { | |
98 dprint("int a=%d, double b=%lf\n", a, b); | |
99 cs2 = cs2a; | |
100 goto schedule(); | |
101 } | |
102 __code cs3b(int a, double b, int c) { | |
103 dprint("int a=%d, double b=%lf, int c=%d\n", a, b, c); | |
104 cs3 = cs3a; | |
105 goto schedule(); | |
106 } | |
107 __code cs4b(int a, double b, int c, float d) { | |
108 dprint("int a=%d, double b=%lf, int c=%d, float d=%f\n", a, b, c, d); | |
109 cs4 = cs4a; | |
110 goto schedule(); | |
111 } | |
112 | |
113 int main() { | |
114 cs0 = cs0a; | |
115 cs1 = cs1a; | |
116 cs2 = cs2a; | |
117 cs3 = cs3a; | |
118 cs4 = cs4a; | |
119 goto schedule(); | |
120 } |