# HG changeset patch # User kono # Date 1045566859 -32400 # Node ID 64a4e3789fd2b32aa2d163a3b3ea27cd22bb67b2 # Parent ddaa1aa5b49bc93af11c3b0b1436604312acde2f parallel assign works. diff -r ddaa1aa5b49b -r 64a4e3789fd2 .gdbinit --- a/.gdbinit Mon Feb 17 13:06:18 2003 +0900 +++ b/.gdbinit Tue Feb 18 20:14:19 2003 +0900 @@ -14,4 +14,4 @@ end b error b errmsg -r -s test/fact-a.c +r -s test/arg.c diff -r ddaa1aa5b49b -r 64a4e3789fd2 Idea --- a/Idea Mon Feb 17 13:06:18 2003 +0900 +++ b/Idea Tue Feb 18 20:14:19 2003 +0900 @@ -1581,3 +1581,30 @@ 並列代入は出来たみたい。代入は小さいものを先にすべきなのか? まぁ、できりゃいいんだけど、横に避けるものが大きいのはいや だよね。 + +Tue Feb 18 11:56:10 JST 2003 + +overraped 用の emit_copy +float/double +long long + +Tue Feb 18 19:34:31 JST 2003 + +code argument の符号を反転させると、list2(LVAR,offset) +のoffsetがアドレスの方向と一致しているという前提が +崩れる。それで、構造体の格納順序がずれてしまう... + +ということは... def(n) でcodeの時はargumentは、局所変数と同じ +扱いでマイナス符号で処理した方が良い。 + +できたみたい。でもさ、 + +int main( int ac, char *av[]) +{ + int n; + goto arg1(0,1,2,3,4,return,environment); +} + +って、きっと return 文がないと、文句を +言われるよね。むむむ。 + diff -r ddaa1aa5b49b -r 64a4e3789fd2 mc-nop-386.c --- a/mc-nop-386.c Mon Feb 17 13:06:18 2003 +0900 +++ b/mc-nop-386.c Tue Feb 18 20:14:19 2003 +0900 @@ -34,7 +34,6 @@ static int edx_setup() ; static int lvar(int l); -static int cvar(int l); static void jump(int e1, int env); static void data_mode(char *name); static void text_mode(void); @@ -86,26 +85,28 @@ static int func_disp_label; /* - -16 local2 - -12 local1 - -8 arg1 - -4 arg2 - 0 arg3 - 0 (%edi) - local1 <----14 local variable 0 (%esi) + -16 -8 local2 + -12 -4 local1 + -8 8 arg3 + -4 4 arg2 + 0 0 arg1 + local2 -20 4 0 (%edi) + local1 <-- -16 0 local variable 0 (%esi) %edi -12 <- disp_offset %ebp %esi -8 %ebx -4 %ebp = %esp 0 %eip 4 <- arg_offset - arg1 8 + arg1 8 0 + arg2 12 4 see enter/enter1/leave see code_enter */ int arg_offset = 8; -int code_arg_offset = -4; int disp_offset = -12; int func_disp_offset = -12; -int code_disp_offset = -4; +int code_disp_offset = 0; +int jump_offset = 0; + int size_of_int = 4; int endian = 0; int MAX_REGISTER=6; /* intel386のレジスタを4つまで使う*/ @@ -1106,7 +1107,7 @@ return list2(assign_expr0(t,e1,ty,ty),e1); } else { disp-=sz; - g_expr(assign_expr0((e1=list2(LVAR,cvar(disp))),s,ty,ty)); + g_expr(assign_expr0((e1=list2(LVAR,disp)),s,ty,ty)); return list2(assign_expr0(t,e1,ty,ty),-1); } } @@ -1214,16 +1215,15 @@ int processing = 0; /* まず、サイズを計算しながら、決まった形に落す。 */ - /* ここで、書込先アドレスを決める */ arg_size = 0; regs = 0; max_regs = MAX_REGISTER_VAR-1; for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) { e2 = car(e3); sz = size(ty=caddr(e3)); - if (regs <= max_regs&&integral(ty)) { + if (regs <= max_regs&&scalar(ty)) { target=list4(list2(REGISTER,virtual((regs++)+REG_ESI)), target,ty,e2); } else { - target=list4(list2(LVAR,cvar(arg_size)), + target=list4(list2(LVAR,0), target,ty,e2); arg_size += sz; } @@ -1235,8 +1235,10 @@ /* disp を飛び先似合わせて修正 */ if (fnptr->sc==CODE) { if (-arg_sizesc==CODE) { - return (l<0)? l+code_disp_offset: -l+code_arg_offset; + return l+code_disp_offset; } else if (l<0) { return l+disp_offset; } else { @@ -2094,10 +2097,5 @@ } } -int -cvar(int l) -{ - return (fnptr->sc==CODE)?l:l+disp_offset; -} /* end */ diff -r ddaa1aa5b49b -r 64a4e3789fd2 mc-parse.c --- a/mc-parse.c Mon Feb 17 13:06:18 2003 +0900 +++ b/mc-parse.c Tue Feb 18 20:14:19 2003 +0900 @@ -678,8 +678,12 @@ } nsc=ndsp=0; if(car(type)==FUNCTION) { - fcheck(n); - return n; + if (n->sc==EXTRN || (mode==GDECL)) { + fcheck(n); + return n; + } else { + type=list2(POINTER,type); + } } if (n->sc!=EMPTY && !(n->sc==GVAR&&n->dsp==EXTRN) && @@ -732,10 +736,9 @@ nsc = TYPE; break; case ADECL: - arglist = list2((int)n,arglist); - if (stmode==REGISTER && reg_var sc = REGISTER; reg_var++; if (n->dsp==0) { @@ -744,11 +747,11 @@ } use_register_var(n->dsp); /* it has now value in it */ } + caddr(arglist)=size_of_int; return n; } n->sc = LVAR; if(type==CHAR) { - /* n->ty=INT; */ if (n->dsp==0) { n->dsp = args; if (endian) @@ -760,6 +763,7 @@ n->dsp = args; args += sz; } + caddr(arglist)=sz; if(type==VOID) { } else if (!scalar(type)) { if((t=car(type))==STRUCT || t==UNION) { @@ -976,6 +980,8 @@ void code_decl(NMTBL *n) { + int t; + if (n->sc==EMPTY) n->sc = CODE; code_enter(n->nm); fnptr=n; @@ -989,7 +995,12 @@ } if (args) disp = -args; else args = -disp; - init_vars=0; + /* reverse all argument offset (with size) */ + for(t=arglist;t;t=cadr(t)) { + n=(NMTBL *)car(t); + if(n->sc==LVAR) + n->dsp = -n->dsp-caddr(t); + } /* local variable declaration */ stmode=0; mode=STAT; @@ -1091,7 +1102,7 @@ void fcheck(NMTBL *n) { - if(mode!=GDECL||car(type)!=FUNCTION) error(DCERR); + if(!(mode==GDECL||mode==ADECL)||car(type)!=FUNCTION) error(DCERR); if(n->sc==FUNCTION) compatible(car(n->ty),cadr(type)); else { if(n->sc!=EMPTY) @@ -2023,6 +2034,8 @@ } else if(t==STRUCT || t==UNION) { t = cadr(type); /* size */ return list3(RSTRUCT,e,t); + } else if(t==FUNCTION) { + return e; } else if(t!=POINTER) error(TYERR); } switch(car(e)) { @@ -2084,7 +2097,7 @@ e=list2(INDIRECT,list3(ADD,e,list2(CONST,nptr->dsp))); break; case LVAR: - e=list2(car(e),cadr(e) + nptr->dsp); + e=list2(LVAR,cadr(e) + nptr->dsp); break; case INDIRECT: e=list2(INDIRECT,list3(ADD,cadr(e),list2(CONST,nptr->dsp))); @@ -2217,8 +2230,11 @@ /* function call */ + if(car(type)==POINTER) + if (car(cadr(type))==FUNCTION||car(cadr(type))==CODE) + e1=indop(e1); t=type; - if(integral(t)|| (car(t)!=FUNCTION && car(t)!=CODE)) + if(integral(t)|| ((car(t)!=FUNCTION)&&(car(t)!=CODE))) error(TYERR); getsym(); arglist=0; diff -r ddaa1aa5b49b -r 64a4e3789fd2 test/arg.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/arg.c Tue Feb 18 20:14:19 2003 +0900 @@ -0,0 +1,33 @@ +#include "stdio.h" + +struct arg { + int a0;int a1;int a2;int a3;int a4; +}; + +code arg1(int arg0,int arg1,int arg2,int arg3,int arg4,code(*exit1)(),void *env) +{ + struct arg args0; + printf("arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1,env); + args0.a0 = arg0; + args0.a1 = arg1; + args0.a2 = arg2; + args0.a3 = arg3; + args0.a4 = arg4; + goto args(args0,exit1,env); +} + +code args(struct arg args0,code exit1(),void *env) +{ + printf("args: %d %d %d %d %d : %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, + exit1,env); + goto (*exit1)(0),env; +} + + +int main( int ac, char *av[]) +{ + int n; + goto arg1(0,1,2,3,4,return,environment); +} + diff -r ddaa1aa5b49b -r 64a4e3789fd2 test/fact-a.c --- a/test/fact-a.c Mon Feb 17 13:06:18 2003 +0900 +++ b/test/fact-a.c Tue Feb 18 20:14:19 2003 +0900 @@ -24,7 +24,7 @@ code print(int n,int result,int orig,code(*print)(),(*exit1)(),void*exit1env) { - printf("%d! = %d\n",n, result); + printf("%d! = %d\n",orig, result); goto (*exit1)(1),exit1env; } diff -r ddaa1aa5b49b -r 64a4e3789fd2 test/tmp.c --- a/test/tmp.c Mon Feb 17 13:06:18 2003 +0900 +++ b/test/tmp.c Tue Feb 18 20:14:19 2003 +0900 @@ -1,3 +1,14 @@ + +int +main1(int ac,char *av[],int (*f)(),int g()) +{ +return (*f)(ac)+g(ac); +} + +int +g(int k) { + return k+1; +} main0(ac,av) { @@ -16,4 +27,5 @@ i = p[1]; p = p+i; printf("%d %s\n",i,p-i); + printf("%d\n",main1(ac,av,g,g)); }