annotate CbC-examples/stack1.c @ 133:420680fc7707

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