Mercurial > hg > CbC > old > device
changeset 98:07c2554e1cfa
*** empty log message ***
author | kono |
---|---|
date | Fri, 14 Mar 2003 12:34:47 +0900 |
parents | 6d42fcac07af |
children | 53899975154c |
files | .gdbinit Changes mc-code-ia32.c mc-code-powerpc.c mc-codegen.c mc-codegen.h mc-parse.c |
diffstat | 7 files changed, 98 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Fri Mar 14 01:07:37 2003 +0900 +++ b/.gdbinit Fri Mar 14 12:34:47 2003 +0900 @@ -13,4 +13,4 @@ x/1i $eip end b errmsg -r -s test/tmp7.c +r -s mc-parse.c
--- a/Changes Fri Mar 14 01:07:37 2003 +0900 +++ b/Changes Fri Mar 14 12:34:47 2003 +0900 @@ -2132,3 +2132,12 @@ 関数呼び出しがあったら、そうするようにする? いろいろめんどくさいなぁ... (いったい、いつなったらできるんだ?) + +Fri Mar 14 10:38:25 JST 2003 + +function の dsp が、arglist と extern flag の両方を入れてしまっている。 +本来は sc で区別するべき物だよね。 + +なんか、emit_pop_free のxregがLVARの時のバグを取るのに苦労した... +gdb は top level でのwhile を受け付けなくて、define してやなんないと +だめみたいね。
--- a/mc-code-ia32.c Fri Mar 14 01:07:37 2003 +0900 +++ b/mc-code-ia32.c Fri Mar 14 12:34:47 2003 +0900 @@ -326,7 +326,7 @@ { if (xreg==dreg) { regv[dreg]=0; - } else if (xreg!=-1) { + } else if (xreg>=0) { free_register(xreg); } } @@ -1513,7 +1513,7 @@ int lvar(int l) { - if (fnptr->sc==CODE) { + if (is_code(fnptr)) { return l+code_disp_offset; } else if (l<0) { return l+disp_offset;
--- a/mc-code-powerpc.c Fri Mar 14 01:07:37 2003 +0900 +++ b/mc-code-powerpc.c Fri Mar 14 12:34:47 2003 +0900 @@ -79,6 +79,8 @@ #define FREG_VAR_MIN 24 #define FREG_ARG_BASE 1 #define FREG_ARG_MAX 13 +#define MIN_TMP_FREG 1 +#define MAX_TMP_FREG 12 int MAX_REGISTER=30; /* PowerPCのレジスタを10個まで使う*/ int MAX_FREGISTER=30; @@ -115,10 +117,6 @@ "f30","f31" }; -static char *creg_name[] = { - "cr0","cr1","cr2","cr3","cr4","cr5","cr6","cr7" -}; - char * fload(int d); int code_d1(double d); int code_d2(double d); @@ -126,6 +124,9 @@ void code_save_stacks(); void regist_extern_function(); void clear_ptr_cache_reg(int r); +int fregister_var(int r); +int get_fregister_var(void); +void use_fregister_var(int r); void code_init(void) @@ -147,7 +148,7 @@ } int -replace_arg_var(int n) +replace_arg_var(int n,int type) { fnptr->dsp; } @@ -155,13 +156,13 @@ int get_register(void) { /* 使われていないレジスタを調べる */ - int i,n; + int i; for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) { if (! regs[i]) { /* 使われていないなら */ } else if (regs[i]==INPUT_REG) { - code_assign_lvar(lvar(replace_arg_var(i)),0); - } else if (regs[i]==PTRPC_REG) { - clear_ptr_cache_r(i); + code_assign_lvar(lvar(replace_arg_var(i,INT)),0); + } else if (regs[i]==PTRC_REG) { + clear_ptr_cache_reg(i); } else continue; regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */ @@ -177,7 +178,7 @@ } } /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ - error(REG_ERR); + error(REG_ERR); return creg; } int @@ -189,11 +190,11 @@ int get_fregister(void) { /* 使われていないレジスタを調べる */ - int i,n; + int i; for(i=MAX_TMP_FREG;i>MIN_TMP_FREG;i--) { if (! fregs[i]) { /* 使われていないなら */ } else if (fregs[i]==INPUT_REG) { - code_dassign_lvar(lvar(replace_arg_dvar(i)),0); + code_dassign_lvar(lvar(replace_arg_var(i,DOUBLE)),0); } else continue; fregs[i]=USING_REG; /* そのレジスタを使うことを宣言し */ @@ -209,7 +210,7 @@ } } /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */ - error(REG_ERR); + error(REG_ERR); return freg; } @@ -264,10 +265,19 @@ } void +use_fregister_var(int i) { + fregv[i]=1; +} + +void set_register_var() { } void +set_fregister_var() { +} + +void code_arg_register(int args) { NMTBL *n; @@ -329,7 +339,6 @@ void emit_init(void) { - int i; free_all_register(); init_ptr_cache(); max_reg_var=0; max_freg_var=0; @@ -425,7 +434,7 @@ car(ptcptr)=0; caddr(ptcptr)=0; free_register(caddr(ptcptr)); - retrun; + return; } ptcptr=cadr(ptcptr); } @@ -977,7 +986,7 @@ int function(int e1) { - int e2,e3,e4,e5,nargs,t,i; + int e2,e3,e4,e5,nargs,t; int reg_arg,freg_arg; NMTBL *n; int jmp; @@ -1048,10 +1057,10 @@ printf("\tbctrl\n"); free_register(jmp); } - for(;reg_argv>=REG_ARG_BASE;reg_argv--) - regs[reg_argv]=regv[reg_argv]=0; - for(;freg_argv>=FREG_ARG_BASE;freg_argv--) - fregs[freg_argv]=fregv[freg_argv]=0; + for(;reg_arg>=REG_ARG_BASE;reg_arg--) + regs[reg_arg]=regv[reg_arg]=0; + for(;freg_arg>=FREG_ARG_BASE;freg_arg--) + fregs[freg_arg]=fregv[freg_arg]=0; if (fnptr->ty==DOUBLE||fnptr->ty==FLOAT) { fregv[freg]=1; regv[creg]=0; } else if (fnptr->ty==VOID) { @@ -1513,7 +1522,7 @@ global_table(void) { NMTBL *n; - int init; + int init; char *extrn; init=0; for(n=ntable;n < &ntable[GSYMS];n++) { if (n->sc == GVAR && n->dsp != -1) { @@ -1526,7 +1535,7 @@ } } for(n=ntable;n < &ntable[GSYMS];n++) { - if (n->dsp == EXTRN1 && n-ty>0 && + if (n->dsp == EXTRN1 && n->ty>0 && (car(n->ty)==FUNCTION||car(n->ty)==CODE)) { extrn = n->nm; printf(".data"); @@ -1552,7 +1561,7 @@ } init = 0; for(n=ntable;n < &ntable[GSYMS];n++) { - if (n->dsp == EXTRN1 && !(n-ty>0 && + if (n->dsp == EXTRN1 && !(n->ty>0 && (car(n->ty)==FUNCTION||car(n->ty)==CODE))) { if(init==0) { printf(".data\n"); @@ -1707,13 +1716,15 @@ if (d==0.0) { float_zero_lib_used=1; r = get_ptr_cache("_float_zero"); - printf("\tfls %s,(%s)\n",frn,drn); + rrn = register_name(r); + printf("\tfls %s,(%s)\n",frn,rrn); return; } if (d==1.0) { float_one_lib_used=1; r = get_ptr_cache("_float_one"); - printf("\tfls %s,(%s)\n",frn,drn); + rrn = register_name(r); + printf("\tfls %s,(%s)\n",frn,rrn); return; } rrn = register_name((r=get_register())); @@ -2069,8 +2080,8 @@ void emit_lib(char *p[]) { - while(p++) { - printf("%s\n",p); + while(*p) { + printf("%s\n",*p++); } } @@ -2080,6 +2091,7 @@ if (d2u_lib_used) emit_lib(d2u_lib); if (u2d_lib_used) emit_lib(u2d_lib); if (float_one_lib_used) emit_lib(float_one_lib); + if (float_zero_lib_used) emit_lib(float_zero_lib); if (i2d_lib_used) emit_lib(i2d_lib); global_table(); printf("\t.ident \"Micro-C compiled\"\n");
--- a/mc-codegen.c Fri Mar 14 01:07:37 2003 +0900 +++ b/mc-codegen.c Fri Mar 14 12:34:47 2003 +0900 @@ -627,6 +627,21 @@ ); } +int +is_code(NMTBL *fnptr) +{ + int type = fnptr->ty; + return type==CODE|| (type>0 && car(type)==CODE); +} + +int +is_function(NMTBL *fnptr) +{ + int type = fnptr->ty; + return type==FUNCTION || (type>0 && car(type)==FUNCTION); +} + + void jump(int e1, int env) { @@ -655,7 +670,7 @@ } /* disp を飛び先似合わせて修正 */ - if (fnptr->sc==CODE) { + if (is_code(fnptr)) { if (-arg_size<disp) disp = -arg_size; } else { if (disp_offset-arg_size<disp) disp = disp_offset-arg_size; @@ -699,7 +714,7 @@ e2 = cadr(e1); if (car(e2) == FNAME) { code0=(NMTBL *)cadr(e2); - if (code0->sc!=CODE) { + if (!is_code(code0)) { error(TYERR); return; } } else { /* indirect */ @@ -724,7 +739,7 @@ e3 = emit_pop(0); code_frame_pointer(e3); emit_pop_free(e3); - } else if (fnptr->sc==FUNCTION) { + } else if (is_function(fnptr)) { code_fix_frame_pointer(disp_offset); }
--- a/mc-codegen.h Fri Mar 14 01:07:37 2003 +0900 +++ b/mc-codegen.h Fri Mar 14 12:34:47 2003 +0900 @@ -31,6 +31,9 @@ extern void emit_init(void); extern void fwddef(int l); +extern int is_code(NMTBL *fnptr); +extern int is_function(NMTBL *fnptr); + extern int csvalue(); extern void cmpdimm(int e, int csreg); extern void code_enter(char *name) ;
--- a/mc-parse.c Fri Mar 14 01:07:37 2003 +0900 +++ b/mc-parse.c Fri Mar 14 12:34:47 2003 +0900 @@ -730,8 +730,7 @@ } } if (n->sc!=EMPTY && - !(n->sc==GVAR&&(n->dsp&~1)==EXTRN) && - !(n->sc==FUNCTION&&(n->dsp&~1)==EXTRN) && + !((n->sc&~1)==EXTRN)&& (mode!=ADECL || n->sc!=LVAR || n->ty!=INT) && (mode!=ADECL || n->sc!=REGISTER || n->ty!=INT) && ((mode!=GSDECL&&mode!=LSDECL) || n->sc!=FIELD || n->dsp!=disp) && @@ -744,10 +743,9 @@ case STADECL: nsc = GVAR; ndsp = gpc; + n->dsp = ndsp; /* emit_data will override this */ if (stmode==EXTRN) - n->dsp = EXTRN; - else - n->dsp = ndsp; /* emit_data will override this */ + nsc = EXTRN; n->sc = nsc; if (stmode==LDECL) { copy(n,n->nm); @@ -850,10 +848,9 @@ error(DCERR); } n->sc = nsc; + n->dsp = ndsp; if (stmode==EXTRN) - n->dsp = EXTRN; - else - n->dsp = ndsp; + n->sc = EXTRN; return n; } @@ -1630,7 +1627,8 @@ e2 = cadr(e1); if (car(e2) == FNAME) { nptr0=(NMTBL *)cadr(e2); - nptr0->sc = CODE; + if (nptr0->sc==EMPTY||nptr0->sc==FUNCTION) + nptr0->sc = CODE; } gexpr(list3(CODE,e1,env),0); control=0; @@ -2128,7 +2126,18 @@ static void extrn_use(NMTBL *nptr) { - if(nptr->dsp==EXTRN) nptr->dsp=EXTRN1; + if(nptr->sc==EXTRN) nptr->sc=EXTRN1; +} + +static int +fname(NMTBL *nptr) +{ + int e1; + e1=list2(FNAME,(int)nptr); + type=list3(nptr->sc,nptr->ty,nptr->dsp); + getsym(); + extrn_use(nptr); + return expr16(e1); } static int @@ -2140,12 +2149,19 @@ case IDENT: conv->id_(sym,nptr); switch(nptr->sc) { + case EXTRN: case EXTRN1: + if(is_code(nptr)||is_function(nptr)) { + return fname(nptr); + } case GVAR: e1=list3(GVAR,nptr->dsp,(int)nptr->nm); type=nptr->ty; getsym(); extrn_use(nptr); break; + case FLABEL: case BLABEL: + case FUNCTION: case CODE: + return fname(nptr); case LVAR: e1=list2(LVAR,nptr->dsp); type=nptr->ty; @@ -2156,13 +2172,6 @@ type=nptr->ty; getsym(); break; - case FLABEL: case BLABEL: - case FUNCTION: case CODE: - e1=list2(FNAME,(int)nptr); - type=list3(nptr->sc,nptr->ty,nptr->dsp); - getsym(); - extrn_use(nptr); - break; case EMPTY: if(getsym()==LPAR) { nptr->sc = FUNCTION;