Mercurial > hg > CbC > old > device
changeset 603:2baddc88097d
*** empty log message ***
author | kono |
---|---|
date | Sat, 28 Jan 2006 21:58:00 +0900 (2006-01-28) |
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;