changeset 690:5d3b4669854c

fix prindirect
author kono
date Wed, 10 Oct 2007 15:05:04 +0900
parents baa67e2e54d2
children 25115b50d033
files Changes Makefile mc-codegen.c mc-inline.c mc-macro.c mc-parse.c mc-parse.h mc.h test/int.c test/simp.c
diffstat 10 files changed, 180 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Oct 07 17:46:00 2007 +0900
+++ b/Changes	Wed Oct 10 15:05:04 2007 +0900
@@ -9507,6 +9507,11 @@
 
 とした時にまずい?
 
+これは、local_scope の中で enter_scope するかどうかの問題
+だったようです。
+
+関数定義の時のnptr は、def していないようだ...
+
 Sat Oct  6 15:47:41 JST 2007
 
 ようやっと出来たよ...
@@ -9520,3 +9525,60 @@
 parse tree を導入するのだったら、one path mode は、切ってしまった
 方が、mc-parse.c が小さくなる。どうせ、debug しなくなるだろうし。
 case 文の逐次比較モードと同じか。
+
+   goto(fuga(ab,c))
+
+みたいな構文にすれば、#define で reflection 可能。まぁねぇ。
+でも、通常、引数の拡大が必要 (meta state)。やっぱり、汎用の
+reflection 構文が必要なんじゃないかな〜
+
+__code goto(fname,args,...)
+{
+     goto();
+}
+
+を定義すると、goto そのものの意味が変わるというのが良い?
+
+anchor も考えてないしな〜
+
+そうか、ia32 を sse2化するっていうのも残っているのか。
+どこで mmx register を save する? caller 側?
+
+Mon Oct  8 00:24:58 JST 2007
+
+main のinline化で、まだ、通ってないものがたくさん。float が
+若干おかしいらしい。varargs/alloca がだめらしい。
+
+あぁ、そうか。エラーメッセージの表示場所がわからなくなってしまう。
+これは、あれをやるしかないのか?
+
+Mon Oct  8 14:13:57 JST 2007
+
+inline されたlocal 変数のscope は? top level だけ変?
+
+Wed Oct 10 13:46:49 JST 2007
+
+cast は、(float)1 みたいなのだと、correct_type は、rvalue する。
+
+(hoge *)p みたいな場合でも、ravlue  するべき? 左辺のcastの
+場合は、rvalue してはまずい。右辺では? RSTRUCT では?
+
+うーん、やっぱり RCAST が必要なみたいだな。correct_type では、
+int/long などの時には、rvalue している。これは正しい。
+CAST は、rvalue されない。ravlue では、CASTは no touch。
+
+わかりました。
+
+1422                type = cadddr(e1);
+1423                return correct_type(pexpr(e2),caddr(e1));
+
+で、pepxr(e2) が type を書き換えている。prindirec で、間違った
+type を返しているのがまずい。両方直すんだろうな。
+
+
+
+
+
+
+
+
--- a/Makefile	Sun Oct 07 17:46:00 2007 +0900
+++ b/Makefile	Wed Oct 10 15:05:04 2007 +0900
@@ -1,5 +1,4 @@
-# CC = gcc -std=c99 -arch ppc
-CC = gcc -std=c99
+CC = gcc -std=c99 $(CCEXT)
 # -O3
 MCFLAGS = -DUSE_CODE_KEYWORD
 CFLAGS = -g -O -Wall -I. $(MCFLAGS)
@@ -26,6 +25,9 @@
 
 all: mc
 
+ppc:
+	make ARCH=powerpc CCEXT="-arch ppc" check-all
+
 mc:   mc-$(ARCH)
 	cp mc-$(ARCH) mc
 
--- a/mc-codegen.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc-codegen.c	Wed Oct 10 15:05:04 2007 +0900
@@ -4215,6 +4215,9 @@
 	return(indirect(RINDIRECT+op,cadr(e),type0));
     case IVAR: case ARRAY: case PERIOD: case ARROW:
 	return(indirect(RINDIRECT+op,e,type0));   // RIVAR?
+    case CAST:
+	op = rvalue_t(cadr(e),cadddr(e));
+	return list4(CAST,op,caddr(e),cadddr(e));  // should be RCAST?
     default:return(e); /* idempotent case? */
     }
 }
@@ -4432,10 +4435,12 @@
 	    return list2(DMINUS,e1);
 	}
 	if (op==SUB) {
-	    op=ADD; dcadr(e2) = -dcadr(e2);
+	    op=ADD; e2 = dlist2(DCONST,-dcadr(e2));
+	    // op=ADD; dcadr(e2) = -dcadr(e2);
 	} else if(op==DIV) {
 	    if(dcadr(e2)==0.0) error(EXERR);
-	    op=MUL; dcadr(e2)=1/dcadr(e2);
+	    op=MUL; e2 = dlist2(DCONST,1.0/dcadr(e2));
+	    // op=MUL; dcadr(e2)=1/dcadr(e2);
 	}
     }
     if ((op==ADD||op==MUL) && (
--- a/mc-inline.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc-inline.c	Wed Oct 10 15:05:04 2007 +0900
@@ -213,7 +213,7 @@
 	gen_jmp( cslabel=fwdlabel());
     } else {
 	cst = 0;
-	gexpr(e,1);       /* switch value */
+	g_expr(e);       /* switch value */
 	csvalue1=csvalue() ;
 	cslabel = control = 0;
     }
@@ -422,7 +422,7 @@
 	    if (nptr0->ty>0&&car(nptr0->ty)==FUNCTION)
 		car(nptr0->ty)=CODE;
 	}
-	gexpr(list3(JUMP,e1,env),0);
+	g_expr_u(list3(JUMP,e1,env));
 	control=0;
 	// conv->sm_();
 	return ;
@@ -451,11 +451,14 @@
     fwddef(cadr(lb));
 }
 
+static 
+char *plinebuf;    // last comment in parse tree (for compiler debug)
+
 extern void
 st_comment(int e1){
     glineno++;
     printf("## %d ",glineno);
-    gen_comment((char *)caddr(e1));
+    gen_comment(plinebuf=(char *)caddr(e1));
 }
 
 /* 
@@ -510,6 +513,11 @@
 {
     int lvar;
     int offset = caddr(e);
+    int type0;
+    type = cadddr(e);
+    type0 = type_value(type);
+    if (type0>0 && car(type0)==POINTER) 
+            type=set_type_with_attr(cadr(type),type);
     if (car(lvar=cadr(e))==IVAR) {
 	lvar=p_lvar(cadr(e)); // can be anything....
 	switch(car(lvar)) {
@@ -548,9 +556,12 @@
 static int
 p_conv(int e1,int e2)
 {
-    int t;
+    int t,stype = type;
     if (is_const(e2) && (t=type_of_conv(e1))) {
-	return correct_type(e2,t);
+	type = INT;
+	e1 =  correct_type(e2,t);
+	type = stype;
+	return e1;
     }
     return list3(CONV,pexpr(e2),e1);
 }
@@ -693,7 +704,7 @@
     }
 #endif
     if (car(e)==ADDRESS||car(e)==GVAR) {
-        if (scalar(t)) {
+        if (scalar(t)||car(t)==ARRAY) {
             t = list2(POINTER,VOID); // fake
         } else {
             error(TYERR);
@@ -1000,17 +1011,21 @@
 static int
 p_switch(int e)
 {
-    int e2 = pexpr(caddr(e));
-    int e3 = pexpr(cadddr(e));
+    int e2 = pexpr(caddr(e));     // switch variable
+    int e3 = pexpr(cadddr(e));    // a statement in switch 
     // if cadr(e) is a constant, we have to prune case statement.
-    //   here?
+    // No we cannot. A statement in case may contain labels or 
+    // falling down entry.
+    // case constants are need to be pexpred in p_case. 
+
     return list4(ST_SWITCH,pexpr(cadr(e)),e2,e3);
 }
 
 static int
 p_comp(int e)
 {
-    int e1=pexpr(caddr(e));
+    int e1;
+    e1=pexpr(caddr(e));
     return list3(ST_COMP,pexpr(cadr(e)),e1);
 }
 
@@ -1031,8 +1046,9 @@
 {
     int new=0,clist = caddr(e);
     // insert destory clist, we have to copy it now
+    // car(clist) have to be expred, it may contain operators.
     for(;clist;clist=cadr(clist))
-	new=glist3(car(clist),new,0);
+	new=glist3(cexpr(pexpr(car(clist))),new,0);
     return list3(ST_CASE,pexpr(cadr(e)),reverse0(new));
 }
 
@@ -1405,10 +1421,11 @@
 	    return list3(DECL_DATA,pexpr(cadr(e2)),caddr(e2));
 	}
 	if (type_compatible(caddr(e1),cadddr(e1))) {
-	    return pexpr(e2);
+	    return pexpr(e2); // rvalue ?
 	} else {
+	    e2 = pexpr(e2); // will override type
 	    type = cadddr(e1);
-	    return correct_type(pexpr(e2),caddr(e1));
+	    return correct_type(e2,caddr(e1));
 	    // return list4(CAST,pexpr(e2),caddr(e1),cadddr(e1));
 	}
     case DECL_DATA:
--- a/mc-macro.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc-macro.c	Wed Oct 10 15:05:04 2007 +0900
@@ -130,10 +130,12 @@
     // genrated macro will be overwrited by cheap, but it's OK, again
     mconcat = 0;
     set_lfree(slfree);
-//     if (lsrc && !asmf && nptrm->sc==FMACRO) {
-// 	gen_comment(macropp);
-// 	if (0 && t[-2]!='\n') putchar('\n');
-//     }
+#if 0
+     if (lsrc && !asmf && nptrm->sc==FMACRO) {
+ 	gen_comment(macropp);
+ 	if (0 && t[-2]!='\n') putchar('\n');
+     }
+#endif
     // push previous chptr, and change it to the generate macro
     chptrsave = glist2((int)chptr,chptrsave);  // push old one into the stack
     chsave = glist2(ch,chsave);
--- a/mc-parse.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc-parse.c	Wed Oct 10 15:05:04 2007 +0900
@@ -46,6 +46,8 @@
 extern double strtod(const char *nptr, char **endptr);
 #endif
 
+static const int parse_mode = 1; // generate parse tree for all code
+
 static int HEAP_REPORT = 0;
 static int lfree_type_limit;     // debugging purpose
 				 // list of local declared type have to be
@@ -934,7 +936,9 @@
 	    init = decl_data(type,n,0,0); data_closing(n); 
 	}
 	if (inmode && (mode==LDECL||mode==LLDECL)) { 
-	    parse = list5(ST_DECL,parse,(int)n,list3(mode,stmode,ctmode),init);
+	    NMTBL *n1 = get_nptr();
+	    *n1 = *n; // to prevent rewind in leave scope
+	    parse = list5(ST_DECL,parse,(int)n1,list3(mode,stmode,ctmode),init);
 	}
 	while(sym==COMMA) {
 	    init = 0;
@@ -1304,7 +1308,9 @@
     int stype,smode,sd,sargs,sstmode;
     int argtypes;
     int sctmode = ctmode;
+    int sinmode = inmode;
     ctmode=0;
+    if (parse_mode) inmode = INLINE;
 
     sstmode=stmode; stmode=REGISTER; /* nobody use this? */
     stype=type;
@@ -1364,6 +1370,7 @@
     sdecl_f = sd;
     ctmode = sctmode;
     stmode=sstmode;
+    inmode = sinmode;
     return argtypes;
 }
 
@@ -2008,6 +2015,11 @@
 code_decl(NMTBL *n)
 {
     int t,arglist;
+    int sinmode;
+    if (parse_mode)  {
+	sinmode = inmode;
+	inmode = INLINE;
+    }
 
     if (!inmode) {
 	if (stmode==0 && n->sc==STATIC) {
@@ -2068,6 +2080,13 @@
     if(!inmode && !chk) gen_code_leave(fnptr->nm);
     args = 0;
     // lfree_type_limit = 0;
+    if (parse_mode) {
+	// do not generate static inline function
+	if (sinmode && n->sc==STATIC) return;
+	inmode = 0;
+	pcode_decl(fnptr);
+	inmode = 0;
+    }
 }
 
 static NMTBL *tmp_struct;
@@ -2080,6 +2099,11 @@
 {
     int sd = stypedecl;
     int arglist,arg_disp;
+    int sinmode;
+    if (parse_mode)  {
+	sinmode = inmode;
+	inmode = INLINE;
+    }
     if (!inmode) {
 	if (stmode==0 && n->sc==STATIC) {
 	    // static proto type, no storage class in definition
@@ -2158,6 +2182,13 @@
     control=0;
     arglist=0;
     lfree_type_limit  = 0;
+    if (parse_mode) {
+	// do not generate static inline function
+	if (sinmode && n->sc==STATIC) return;
+	inmode = 0;
+	pfdecl(fnptr);
+	inmode = 0;
+    }
 }
 
 /* generate function from parse tree */
@@ -2173,6 +2204,9 @@
     int offset=0;
     NMTBL *a,*n1;
 
+    if (has_attr(n,GENERATED)) return;
+    set_attr(n,GENERATED,0);
+
     top_init();
 
     stmode = STATIC;
@@ -2866,7 +2900,7 @@
 	conv->case_begin_(0,0);
 	getsym(0);
 	// we have to make it global?
-	c = cexpr(expr(1));
+	c = inmode?expr(1): cexpr(expr(1));
 	if (!inmode && cst) {
 	    clist |= (cadr(csvalue1)==c);
 	    conv->case_(list2(c,0),0);
--- a/mc-parse.h	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc-parse.h	Wed Oct 10 15:05:04 2007 +0900
@@ -193,6 +193,7 @@
 extern struct cheap * reset_cheap(struct cheap *scheap);
 extern struct cheap * new_cheap();
 extern void pfdecl(NMTBL *nptr);
+extern void pcode_decl(NMTBL *nptr);
 #if CASE_CODE
 extern int docase_eq();
 #endif
--- a/mc.h	Sun Oct 07 17:46:00 2007 +0900
+++ b/mc.h	Wed Oct 10 15:05:04 2007 +0900
@@ -111,7 +111,8 @@
 #define C_LINE     (-64)
 
 #define ALIGNED     (-65)
-#define NORETURN     (-66)
+#define GENERATED     (-66)
+#define NORETURN     (-67)
 
 /* reserved word end */
 
@@ -536,7 +537,7 @@
        we need automatic increment of gsyms?
  */
 #define GSYMS		(8192*32)
-#define HEAPSIZE        120000
+#define HEAPSIZE        150000
 #define CHEAPSIZE       (sizeof(NMTBL)*8192)
 #define LBUFSIZE        4096
 #define STRSIZE		4096
--- a/test/int.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/test/int.c	Wed Oct 10 15:05:04 2007 +0900
@@ -373,14 +373,22 @@
 int
 test2(int f,int i)
 {
-    int g,h;
+    int g,h,s;
   
+    printf("#0370:rec: %d %d\n",i,f);
     if (i<=0) return f;
-#if 0
-    printf("#0379:rec: %d %d\n",i,f);
-#endif
     g =  f*2;
     h =  f-3.5;
+#if 1
+    printf("#0371:rec: %d %d\n",i,f);
+    s = f*1.5;
+    printf("#0372: %d\n", s);
+    s = test2(s,i-1);
+    printf("#0373: %d\n", s);
+    s = s/(h-1);
+    printf("#0374: %d\n", s);
+    printf("#0375: %d\n", h/3-(3.0-(g+3)*s/(h-1)));
+#endif
     return h/3-(3.0-(g+3)*test2(f*1.5,i-1)/(h-1));
 }
 
--- a/test/simp.c	Sun Oct 07 17:46:00 2007 +0900
+++ b/test/simp.c	Wed Oct 10 15:05:04 2007 +0900
@@ -3,6 +3,24 @@
 
 // #define UNDECL
 
+long long q = 122;
+
+void
+main5()
+{
+    long long *p;
+    int r[10];
+    double d;
+
+    p = (long long *)&r;
+    *p = q;
+
+    d= (double)(*(long long*)&r);
+
+    printf("%lld %g\n",*p,d);
+}
+
+
 float f = 3;
 float g = 4096.0f;
 
@@ -42,6 +60,7 @@
     j = k;   // undeclared global variable
     printf("#0037:%d\n",h);
 #endif
+    main5();
     return main0(ac,ch,av);
 }