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