16
|
1 /*
|
|
2 test for CbC converted __code from C
|
|
3 */
|
|
4
|
|
5 //#include <stdio.h>
|
|
6 #define NULL 0
|
|
7
|
|
8 extern void *malloc(int);
|
|
9
|
|
10 typedef void *stack;
|
|
11
|
|
12 void *stack0; /* size of void* == 1 */
|
|
13
|
|
14 struct cont_save { /* General Return Continuation */
|
|
15 __code (*ret)();
|
|
16 };
|
|
17
|
|
18 __code g(int,void *);
|
|
19 __code f_g0(int ,int ,void *);
|
|
20 __code f_g1(int,void *);
|
|
21 __code print(int i,int j,__code (*exit1)(),void*exit1env);
|
|
22
|
|
23 struct f_g0_save { /* Specialized Return Continuation */
|
|
24 __code (*ret)();
|
|
25 int ii,kk,jj;
|
|
26 };
|
|
27
|
|
28 __code g(int i,void *sp) {
|
|
29 goto (* ((struct cont_save *)sp)->ret)(i+4,sp);
|
|
30 }
|
|
31
|
|
32 __code __attribute__ ((fastcall)) f_g1(int j,void *sp) { /* Continuation */
|
|
33 int k;
|
|
34 struct f_g0_save *c;
|
|
35
|
|
36 c = sp;
|
|
37 k = c->kk;
|
|
38 sp += sizeof(struct f_g0_save);
|
|
39 goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp);
|
|
40 }
|
|
41
|
|
42 __code f(int i,void *sp) {
|
|
43 int k,j;
|
|
44 struct f_g0_save *c;
|
|
45 printf("#0042:f 0 sp: %x\n",sp-stack0);
|
|
46
|
|
47 k = 3+i;
|
|
48
|
|
49 printf("#0046:f 1 sp: %x\n",sp-stack0);
|
|
50 sp -= sizeof(struct f_g0_save);
|
|
51 printf("#0048:f 2 sp: %x\n",sp-stack0);
|
|
52 c = sp;
|
|
53 c->kk = k;
|
|
54 c->ii = i;
|
|
55 c->jj = j;
|
|
56 c->ret = f_g1;
|
|
57 goto g(i,sp);
|
|
58 }
|
|
59
|
|
60
|
|
61
|
|
62 struct f0_save { /* Specialized Return Continuation */
|
|
63 __code (*ret)();
|
|
64 __code (*exit1)();
|
|
65 void *exit1env;
|
|
66 int jj;
|
|
67 };
|
|
68
|
|
69 __code f1(int i,void *sp) ;
|
|
70 __code f0(int i,int j,__code(*exit2)(), void *exit2env,void *sp)
|
|
71 {
|
|
72 struct f0_save *c;
|
|
73 printf("#0070:f0 1 sp: %x\n",sp-stack0);
|
|
74 sp -= sizeof(struct f0_save);
|
|
75 printf("#0072:f0 2 sp: %x\n",sp-stack0);
|
|
76 c = sp;
|
|
77 c->jj = j;
|
|
78 c->exit1 = exit2;
|
|
79 c->exit1env = exit2env;
|
|
80 c->ret = f1;
|
|
81 printf("#0078:f0 3 sp: %x\n",sp-stack0);
|
|
82 goto f(i,sp);
|
|
83 }
|
|
84
|
|
85 __code f1(int i,void *sp) {
|
|
86 int j;
|
|
87 int *exit2env;
|
|
88 __code (*exit2)();
|
|
89 struct f0_save *c;
|
|
90
|
|
91 c = sp;
|
|
92 j = c->jj;
|
|
93 exit2 = c->exit1;
|
|
94 exit2env = c->exit1env;
|
|
95
|
|
96 sp += sizeof(struct f0_save);
|
|
97 goto print(i,j,exit2,exit2env);
|
|
98 }
|
|
99
|
|
100 int main(int ac, char*av[]){
|
|
101 main0(ac,av);
|
|
102 }
|
|
103
|
|
104 int main0( int ac, char *av[])
|
|
105 {
|
|
106 int i,j;
|
|
107 int *sp;
|
|
108
|
|
109 // i = atoi(av[1]);
|
|
110 i = 1;
|
|
111 stack0 = ((char *)malloc(1024)+1024);
|
|
112 sp = stack0;
|
|
113 j = i;
|
|
114
|
|
115 printf("#0108:sp: %x %x\n",sp-(int*)stack0,sizeof(*stack0));
|
|
116 //goto f0(i,j,_CbC_return,_CbC_environment,sp);
|
|
117 goto f0(i,j,NULL,NULL,sp);
|
|
118 }
|
|
119
|
|
120 __code print(int i,int j,__code (*exit1)(),void*exit1env)
|
|
121 {
|
|
122 printf("#0114:%d %d\n",i,j);
|
|
123 //goto (*exit1)(0),exit1env;
|
|
124 exit(0);
|
|
125 }
|
|
126
|