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;