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;