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;