Mercurial > hg > CbC > old > device
changeset 690:5d3b4669854c
fix prindirect
author | kono |
---|---|
date | Wed, 10 Oct 2007 15:05:04 +0900 |
parents | baa67e2e54d2 |
children | 25115b50d033 |
files | Changes Makefile mc-codegen.c mc-inline.c mc-macro.c mc-parse.c mc-parse.h mc.h test/int.c test/simp.c |
diffstat | 10 files changed, 180 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun Oct 07 17:46:00 2007 +0900 +++ b/Changes Wed Oct 10 15:05:04 2007 +0900 @@ -9507,6 +9507,11 @@ とした時にまずい? +これは、local_scope の中で enter_scope するかどうかの問題 +だったようです。 + +関数定義の時のnptr は、def していないようだ... + Sat Oct 6 15:47:41 JST 2007 ようやっと出来たよ... @@ -9520,3 +9525,60 @@ parse tree を導入するのだったら、one path mode は、切ってしまった 方が、mc-parse.c が小さくなる。どうせ、debug しなくなるだろうし。 case 文の逐次比較モードと同じか。 + + goto(fuga(ab,c)) + +みたいな構文にすれば、#define で reflection 可能。まぁねぇ。 +でも、通常、引数の拡大が必要 (meta state)。やっぱり、汎用の +reflection 構文が必要なんじゃないかな〜 + +__code goto(fname,args,...) +{ + goto(); +} + +を定義すると、goto そのものの意味が変わるというのが良い? + +anchor も考えてないしな〜 + +そうか、ia32 を sse2化するっていうのも残っているのか。 +どこで mmx register を save する? caller 側? + +Mon Oct 8 00:24:58 JST 2007 + +main のinline化で、まだ、通ってないものがたくさん。float が +若干おかしいらしい。varargs/alloca がだめらしい。 + +あぁ、そうか。エラーメッセージの表示場所がわからなくなってしまう。 +これは、あれをやるしかないのか? + +Mon Oct 8 14:13:57 JST 2007 + +inline されたlocal 変数のscope は? top level だけ変? + +Wed Oct 10 13:46:49 JST 2007 + +cast は、(float)1 みたいなのだと、correct_type は、rvalue する。 + +(hoge *)p みたいな場合でも、ravlue するべき? 左辺のcastの +場合は、rvalue してはまずい。右辺では? RSTRUCT では? + +うーん、やっぱり RCAST が必要なみたいだな。correct_type では、 +int/long などの時には、rvalue している。これは正しい。 +CAST は、rvalue されない。ravlue では、CASTは no touch。 + +わかりました。 + +1422 type = cadddr(e1); +1423 return correct_type(pexpr(e2),caddr(e1)); + +で、pepxr(e2) が type を書き換えている。prindirec で、間違った +type を返しているのがまずい。両方直すんだろうな。 + + + + + + + +
--- a/Makefile Sun Oct 07 17:46:00 2007 +0900 +++ b/Makefile Wed Oct 10 15:05:04 2007 +0900 @@ -1,5 +1,4 @@ -# CC = gcc -std=c99 -arch ppc -CC = gcc -std=c99 +CC = gcc -std=c99 $(CCEXT) # -O3 MCFLAGS = -DUSE_CODE_KEYWORD CFLAGS = -g -O -Wall -I. $(MCFLAGS) @@ -26,6 +25,9 @@ all: mc +ppc: + make ARCH=powerpc CCEXT="-arch ppc" check-all + mc: mc-$(ARCH) cp mc-$(ARCH) mc
--- a/mc-codegen.c Sun Oct 07 17:46:00 2007 +0900 +++ b/mc-codegen.c Wed Oct 10 15:05:04 2007 +0900 @@ -4215,6 +4215,9 @@ return(indirect(RINDIRECT+op,cadr(e),type0)); case IVAR: case ARRAY: case PERIOD: case ARROW: return(indirect(RINDIRECT+op,e,type0)); // RIVAR? + case CAST: + op = rvalue_t(cadr(e),cadddr(e)); + return list4(CAST,op,caddr(e),cadddr(e)); // should be RCAST? default:return(e); /* idempotent case? */ } } @@ -4432,10 +4435,12 @@ return list2(DMINUS,e1); } if (op==SUB) { - op=ADD; dcadr(e2) = -dcadr(e2); + op=ADD; e2 = dlist2(DCONST,-dcadr(e2)); + // op=ADD; dcadr(e2) = -dcadr(e2); } else if(op==DIV) { if(dcadr(e2)==0.0) error(EXERR); - op=MUL; dcadr(e2)=1/dcadr(e2); + op=MUL; e2 = dlist2(DCONST,1.0/dcadr(e2)); + // op=MUL; dcadr(e2)=1/dcadr(e2); } } if ((op==ADD||op==MUL) && (
--- a/mc-inline.c Sun Oct 07 17:46:00 2007 +0900 +++ b/mc-inline.c Wed Oct 10 15:05:04 2007 +0900 @@ -213,7 +213,7 @@ gen_jmp( cslabel=fwdlabel()); } else { cst = 0; - gexpr(e,1); /* switch value */ + g_expr(e); /* switch value */ csvalue1=csvalue() ; cslabel = control = 0; } @@ -422,7 +422,7 @@ if (nptr0->ty>0&&car(nptr0->ty)==FUNCTION) car(nptr0->ty)=CODE; } - gexpr(list3(JUMP,e1,env),0); + g_expr_u(list3(JUMP,e1,env)); control=0; // conv->sm_(); return ; @@ -451,11 +451,14 @@ fwddef(cadr(lb)); } +static +char *plinebuf; // last comment in parse tree (for compiler debug) + extern void st_comment(int e1){ glineno++; printf("## %d ",glineno); - gen_comment((char *)caddr(e1)); + gen_comment(plinebuf=(char *)caddr(e1)); } /* @@ -510,6 +513,11 @@ { int lvar; int offset = caddr(e); + int type0; + type = cadddr(e); + type0 = type_value(type); + if (type0>0 && car(type0)==POINTER) + type=set_type_with_attr(cadr(type),type); if (car(lvar=cadr(e))==IVAR) { lvar=p_lvar(cadr(e)); // can be anything.... switch(car(lvar)) { @@ -548,9 +556,12 @@ static int p_conv(int e1,int e2) { - int t; + int t,stype = type; if (is_const(e2) && (t=type_of_conv(e1))) { - return correct_type(e2,t); + type = INT; + e1 = correct_type(e2,t); + type = stype; + return e1; } return list3(CONV,pexpr(e2),e1); } @@ -693,7 +704,7 @@ } #endif if (car(e)==ADDRESS||car(e)==GVAR) { - if (scalar(t)) { + if (scalar(t)||car(t)==ARRAY) { t = list2(POINTER,VOID); // fake } else { error(TYERR); @@ -1000,17 +1011,21 @@ static int p_switch(int e) { - int e2 = pexpr(caddr(e)); - int e3 = pexpr(cadddr(e)); + int e2 = pexpr(caddr(e)); // switch variable + int e3 = pexpr(cadddr(e)); // a statement in switch // if cadr(e) is a constant, we have to prune case statement. - // here? + // No we cannot. A statement in case may contain labels or + // falling down entry. + // case constants are need to be pexpred in p_case. + return list4(ST_SWITCH,pexpr(cadr(e)),e2,e3); } static int p_comp(int e) { - int e1=pexpr(caddr(e)); + int e1; + e1=pexpr(caddr(e)); return list3(ST_COMP,pexpr(cadr(e)),e1); } @@ -1031,8 +1046,9 @@ { int new=0,clist = caddr(e); // insert destory clist, we have to copy it now + // car(clist) have to be expred, it may contain operators. for(;clist;clist=cadr(clist)) - new=glist3(car(clist),new,0); + new=glist3(cexpr(pexpr(car(clist))),new,0); return list3(ST_CASE,pexpr(cadr(e)),reverse0(new)); } @@ -1405,10 +1421,11 @@ return list3(DECL_DATA,pexpr(cadr(e2)),caddr(e2)); } if (type_compatible(caddr(e1),cadddr(e1))) { - return pexpr(e2); + return pexpr(e2); // rvalue ? } else { + e2 = pexpr(e2); // will override type type = cadddr(e1); - return correct_type(pexpr(e2),caddr(e1)); + return correct_type(e2,caddr(e1)); // return list4(CAST,pexpr(e2),caddr(e1),cadddr(e1)); } case DECL_DATA:
--- a/mc-macro.c Sun Oct 07 17:46:00 2007 +0900 +++ b/mc-macro.c Wed Oct 10 15:05:04 2007 +0900 @@ -130,10 +130,12 @@ // genrated macro will be overwrited by cheap, but it's OK, again mconcat = 0; set_lfree(slfree); -// if (lsrc && !asmf && nptrm->sc==FMACRO) { -// gen_comment(macropp); -// if (0 && t[-2]!='\n') putchar('\n'); -// } +#if 0 + if (lsrc && !asmf && nptrm->sc==FMACRO) { + gen_comment(macropp); + if (0 && t[-2]!='\n') putchar('\n'); + } +#endif // push previous chptr, and change it to the generate macro chptrsave = glist2((int)chptr,chptrsave); // push old one into the stack chsave = glist2(ch,chsave);
--- a/mc-parse.c Sun Oct 07 17:46:00 2007 +0900 +++ b/mc-parse.c Wed Oct 10 15:05:04 2007 +0900 @@ -46,6 +46,8 @@ extern double strtod(const char *nptr, char **endptr); #endif +static const int parse_mode = 1; // generate parse tree for all code + static int HEAP_REPORT = 0; static int lfree_type_limit; // debugging purpose // list of local declared type have to be @@ -934,7 +936,9 @@ init = decl_data(type,n,0,0); data_closing(n); } if (inmode && (mode==LDECL||mode==LLDECL)) { - parse = list5(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode),init); + NMTBL *n1 = get_nptr(); + *n1 = *n; // to prevent rewind in leave scope + parse = list5(ST_DECL,parse,(int)n1,list3(mode,stmode,ctmode),init); } while(sym==COMMA) { init = 0; @@ -1304,7 +1308,9 @@ int stype,smode,sd,sargs,sstmode; int argtypes; int sctmode = ctmode; + int sinmode = inmode; ctmode=0; + if (parse_mode) inmode = INLINE; sstmode=stmode; stmode=REGISTER; /* nobody use this? */ stype=type; @@ -1364,6 +1370,7 @@ sdecl_f = sd; ctmode = sctmode; stmode=sstmode; + inmode = sinmode; return argtypes; } @@ -2008,6 +2015,11 @@ code_decl(NMTBL *n) { int t,arglist; + int sinmode; + if (parse_mode) { + sinmode = inmode; + inmode = INLINE; + } if (!inmode) { if (stmode==0 && n->sc==STATIC) { @@ -2068,6 +2080,13 @@ if(!inmode && !chk) gen_code_leave(fnptr->nm); args = 0; // lfree_type_limit = 0; + if (parse_mode) { + // do not generate static inline function + if (sinmode && n->sc==STATIC) return; + inmode = 0; + pcode_decl(fnptr); + inmode = 0; + } } static NMTBL *tmp_struct; @@ -2080,6 +2099,11 @@ { int sd = stypedecl; int arglist,arg_disp; + int sinmode; + if (parse_mode) { + sinmode = inmode; + inmode = INLINE; + } if (!inmode) { if (stmode==0 && n->sc==STATIC) { // static proto type, no storage class in definition @@ -2158,6 +2182,13 @@ control=0; arglist=0; lfree_type_limit = 0; + if (parse_mode) { + // do not generate static inline function + if (sinmode && n->sc==STATIC) return; + inmode = 0; + pfdecl(fnptr); + inmode = 0; + } } /* generate function from parse tree */ @@ -2173,6 +2204,9 @@ int offset=0; NMTBL *a,*n1; + if (has_attr(n,GENERATED)) return; + set_attr(n,GENERATED,0); + top_init(); stmode = STATIC; @@ -2866,7 +2900,7 @@ conv->case_begin_(0,0); getsym(0); // we have to make it global? - c = cexpr(expr(1)); + c = inmode?expr(1): cexpr(expr(1)); if (!inmode && cst) { clist |= (cadr(csvalue1)==c); conv->case_(list2(c,0),0);
--- a/mc-parse.h Sun Oct 07 17:46:00 2007 +0900 +++ b/mc-parse.h Wed Oct 10 15:05:04 2007 +0900 @@ -193,6 +193,7 @@ extern struct cheap * reset_cheap(struct cheap *scheap); extern struct cheap * new_cheap(); extern void pfdecl(NMTBL *nptr); +extern void pcode_decl(NMTBL *nptr); #if CASE_CODE extern int docase_eq(); #endif
--- a/mc.h Sun Oct 07 17:46:00 2007 +0900 +++ b/mc.h Wed Oct 10 15:05:04 2007 +0900 @@ -111,7 +111,8 @@ #define C_LINE (-64) #define ALIGNED (-65) -#define NORETURN (-66) +#define GENERATED (-66) +#define NORETURN (-67) /* reserved word end */ @@ -536,7 +537,7 @@ we need automatic increment of gsyms? */ #define GSYMS (8192*32) -#define HEAPSIZE 120000 +#define HEAPSIZE 150000 #define CHEAPSIZE (sizeof(NMTBL)*8192) #define LBUFSIZE 4096 #define STRSIZE 4096
--- a/test/int.c Sun Oct 07 17:46:00 2007 +0900 +++ b/test/int.c Wed Oct 10 15:05:04 2007 +0900 @@ -373,14 +373,22 @@ int test2(int f,int i) { - int g,h; + int g,h,s; + printf("#0370:rec: %d %d\n",i,f); if (i<=0) return f; -#if 0 - printf("#0379:rec: %d %d\n",i,f); -#endif g = f*2; h = f-3.5; +#if 1 + printf("#0371:rec: %d %d\n",i,f); + s = f*1.5; + printf("#0372: %d\n", s); + s = test2(s,i-1); + printf("#0373: %d\n", s); + s = s/(h-1); + printf("#0374: %d\n", s); + printf("#0375: %d\n", h/3-(3.0-(g+3)*s/(h-1))); +#endif return h/3-(3.0-(g+3)*test2(f*1.5,i-1)/(h-1)); }
--- a/test/simp.c Sun Oct 07 17:46:00 2007 +0900 +++ b/test/simp.c Wed Oct 10 15:05:04 2007 +0900 @@ -3,6 +3,24 @@ // #define UNDECL +long long q = 122; + +void +main5() +{ + long long *p; + int r[10]; + double d; + + p = (long long *)&r; + *p = q; + + d= (double)(*(long long*)&r); + + printf("%lld %g\n",*p,d); +} + + float f = 3; float g = 4096.0f; @@ -42,6 +60,7 @@ j = k; // undeclared global variable printf("#0037:%d\n",h); #endif + main5(); return main0(ac,ch,av); }