Mercurial > hg > CbC > CbC_examples
view stack1.c @ 14:7d168c1829c9
modify makefile
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Apr 2015 16:09:28 +0900 |
parents | 90e6146d24cd |
children | 586096c45873 |
line wrap: on
line source
/* test for CbC converted __code from C */ #include <stdio.h> #include <stdlib.h> #define NULL 0 typedef void *stack; void *stack0; /* size of void* == 1 */ struct cont_save { /* General Return Continuation */ __code (*ret)(int, void*); }; __code g(int,void *); __code f_g0(int ,int ,void *); __code f_g1(int,void *); __code print(int i,int j,__code (*exit1)(),void*exit1env); int main0( int ac, char *av[]); struct f_g0_save { /* Specialized Return Continuation */ __code (*ret)(); int ii,kk,jj; }; __code g(int i,void *sp) { goto (* ((struct cont_save *)sp)->ret)(i+4,sp); } __code __attribute__ ((fastcall)) f_g1(int j,void *sp) { /* Continuation */ int k; struct f_g0_save *c; c = sp; k = c->kk; sp += sizeof(struct f_g0_save); goto (* ((struct cont_save *)sp)->ret)(k+4+j,sp); } __code f(int i,void *sp) { int k,j; struct f_g0_save *c; printf("#0042:f 0 sp: %lx\n",sp-stack0); k = 3+i; printf("#0046:f 1 sp: %lx\n",sp-stack0); sp -= sizeof(struct f_g0_save); printf("#0048:f 2 sp: %lx\n",sp-stack0); c = sp; c->kk = k; c->ii = i; c->jj = j; c->ret = f_g1; goto g(i,sp); } struct f0_save { /* Specialized Return Continuation */ __code (*ret)(int, void*); __code (*exit1)(int, void*); void *exit1env; int jj; }; __code f1(int i,void *sp) ; __code f0(int i,int j,__code(*exit2)(int, void*), void *exit2env,void *sp) { struct f0_save *c; printf("#0070:f0 1 sp: %lx\n",sp-stack0); sp -= sizeof(struct f0_save); printf("#0072:f0 2 sp: %lx\n",sp-stack0); c = sp; c->jj = j; c->exit1 = exit2; c->exit1env = exit2env; c->ret = f1; printf("#0078:f0 3 sp: %lx\n",sp-stack0); goto f(i,sp); } __code f1(int i,void *sp) { int j; int *exit2env; __code (*exit2)(int, void*); struct f0_save *c; c = sp; j = c->jj; exit2 = c->exit1; exit2env = c->exit1env; sp += sizeof(struct f0_save); goto print(i,j,exit2,exit2env); } int main(int ac, char*av[]){ main0(ac,av); } int main0( int ac, char *av[]) { int i,j; int *sp; i = 1; stack0 = ((char *)malloc(1024)+1024); sp = stack0; j = i; printf("#0108:sp: %lx %lx\n",sp-(int*)stack0,sizeof(*stack0)); goto f0(i,j,NULL,NULL,sp); return 0; } __code print(int i,int j,__code (*exit1)(),void*exit1env) { printf("#0114:%d %d\n",i,j); exit(0); }