Mercurial > hg > CbC > old > device
changeset 603:2baddc88097d
*** empty log message ***
author | kono |
---|---|
date | Sat, 28 Jan 2006 21:58:00 +0900 |
parents | 429ec87e03e7 |
children | ff033b46cac5 |
files | Changes mc-code-powerpc.c mc-codegen.c mc-parse.c |
diffstat | 4 files changed, 58 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Fri Jan 27 14:35:38 2006 +0900 +++ b/Changes Sat Jan 28 21:58:00 2006 +0900 @@ -8625,3 +8625,28 @@ 構文木が保存されるから、そっちがいいわけね。 確かに、RINDIRECTで、IVAR の先読みをするのはおかしいものな。 + +bitfield と RSTUCT は、なんか変だよ。rvalue の扱いがあまり +consistent でないらしい。 + +問題は、RIVAR の導入でどれくらいバグが出るかだな。 + RIVAR = INDIRECT + IVAR + RARRAY = INDIRECT + ARRAY + RPERIOD = INDIRECT + PERIOD + RARROW = INDIRECT + ARROW +で、良いわけなんですが... + +これで、expr のtreeから、構文木を生成できるはずだが。 + +Fri Jan 27 20:47:00 JST 2006 + +PowerPC で、r1 の下の方を呼び出した関数がいじってしまうのは、 +なんでなんだろう? register save 分かとも思うが、生成された +コードにはそういうのはないんだよな.... + +RIVAR = INDIRECT + IVAR にすると、CRIVAR とかを作らない +といけないらしい。type を持ち歩けば、そのあたりは不要な +わけなんだけど。むしろ逆にRINDIRECT only でもいいわけね。 + + +
--- a/mc-code-powerpc.c Fri Jan 27 14:35:38 2006 +0900 +++ b/mc-code-powerpc.c Sat Jan 28 21:58:00 2006 +0900 @@ -2806,7 +2806,7 @@ { int r1_offsetv; disp&= -SIZE_OF_INT; - r1_offsetv = -disp+max_func_args*SIZE_OF_INT -code_disp_offset0 +8+32; + r1_offsetv = -disp+max_func_args*SIZE_OF_INT -code_disp_offset0 +8+32+48; printf(".set L_%d,%d\n",code_disp_label,-r1_offsetv); if (max_func_arg_label) {
--- a/mc-codegen.c Fri Jan 27 14:35:38 2006 +0900 +++ b/mc-codegen.c Sat Jan 28 21:58:00 2006 +0900 @@ -3338,13 +3338,16 @@ /* In K&R style, order of argment list and order of argment type decl are differnt. Fix them. + + arg defined in f(a,b,c) + new_arg defined in int b; short a; char c; */ extern int arg_reorder(int arg,int new_arg) { /* list4(type,fnptr->dsp,(int)n,size); */ - int i,j,sz; + int i,j,sz,arg_types = 0; int dsp = 0; NMTBL *n,*n1; @@ -3384,10 +3387,12 @@ if (sz==1||sz==size_of_short) sz = size_of_int; dsp += sz; } + arg_types = glist2(n->ty, arg_types); } #if ARG_REORDER_DEBUG fprintf(stderr,"arg_reorder end:\n"); #endif + caddr(fnptr->ty) = reverse0(arg_types); return arg; } @@ -3618,6 +3623,7 @@ if(car(e)==INDIRECT) return cadr(e); return list2(ADDRESS,e); case STRUCT: case UNION: + // RINDIRECT がいいのかも if(car(e)==RSTRUCT) return e; /* ??? */ return list3(RSTRUCT,e,cadr(type) /* size */); case FUNCTION: @@ -4308,7 +4314,7 @@ extern int correct_type(int e,int t0) { - int t = type_value(t0); + int t = type_value(t0),t1; /* e = rvalue(e); */ #if BIT_FIELD_CODE if (type==BIT_FIELD) e = rvalue(e); @@ -4320,39 +4326,42 @@ else if (type==SHORT) t=INT; else if (type==USHORT) t=UNSIGNED; } - if (type_value(type)>0 && car(type_value(type))==ARRAY && car(e)==GVAR) { + if ((t1=type_value(type))>0 && + car(type_value(type))==ARRAY && car(e)==GVAR) { e=list2(ADDRESS,e); } if (t>0) { switch(car(t)) { case POINTER: - if (cadr(t)>0 && car(cadr(t))==FUNCTION) { + if (cadr(t)>0) { + switch(car(cadr(t))) { + case FUNCTION: // type でチェックするべきだよね? 本来... // compatible(cadr(t),cadr(type)); // ではあかんの? -#if 1 - if (car(e)==FNAME) { - NMTBL *n = (NMTBL*)cadr(e); - int targ0 = caddr(cadr(t)); - int targ1 = caddr(n->ty); - if (is_function(n)) { - // return type - compatible(cadr(cadr(t)),cadr(n->ty)); + if (car(e)==FNAME) { + NMTBL *n = (NMTBL*)cadr(e); + int targ0 = caddr(cadr(t)); + int targ1 = caddr(n->ty); + if (is_function(n)) { + // return type + compatible(cadr(cadr(t)),cadr(n->ty)); + } + // arguments + if (targ0) + compatible(targ0,targ1); } - // arguments - if (targ0) - compatible(targ0,targ1); + break; + default: + // if (t1>0) compatible(cadr(t),cadr(t1)); + if (!scalar(t1)) error(TYERR); } -#else - // なんかダメみたいだな... - compatible(cadr(t),cadr(type)); -#endif - // type should be checked... } else { - // compatible(cadr(t),cadr(type)); + if (!scalar(t1)) error(TYERR); } break; case STRUCT: case UNION: + if (scalar(t1)) error(TYERR); if(size(t)!=size(type)) error(TYERR); break; }
--- a/mc-parse.c Fri Jan 27 14:35:38 2006 +0900 +++ b/mc-parse.c Sat Jan 28 21:58:00 2006 +0900 @@ -3669,7 +3669,8 @@ } // this is wrong... should be // code (*)(return_type); - type=list2(POINTER,CODE); + type=list2(POINTER,list3(CODE,VOID,cadr(fnptr->ty))); + // type arg e1=list2(RETURN,(int)fnptr); getsym(0); break;