changeset 464:d88f08d81bba

inline continue.... const type lvar offset for inline local will be add
author kono
date Tue, 07 Dec 2004 12:30:18 +0900
parents 50a59dfb4606
children cdf827b1fcd9
files Changes mc-codegen.c mc-inline.c mc-parse.c mc.h
diffstat 5 files changed, 115 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Dec 04 12:21:47 2004 +0900
+++ b/Changes	Tue Dec 07 12:30:18 2004 +0900
@@ -7057,4 +7057,67 @@
 直前のSTが実行される(かもしれない)コードを含んでいるかどうか
 を判断する。pcontain = pcontrol のorみたいな感じ?
 
-
+Sat Dec  4 12:24:26 JST 2004
+
+問題は、is_readonly() だろ? (とりあえず)諦めちゃうっていう手
+もあるけど。is_readonly で、vartable に外のtreeをいれると、parse
+tree に外のlvarが入り込む。それを識別する方法が必要になる。
+それは、まぁ、debug のためにも必要だから良いんだけど、type tree
+の中に、list2(KONST,e) をいれると、他の型チェックが == では
+すまなくなってしまう。has_type(INT,t) みたいな形? それは、う
+っとうしすぎる。そもそもconst嫌いだし。でなければ、すべての
+タイプに*Cみたいなのを作る? いきなり倍ですか。いやだめだね。
+compund type にもconstは付くはずだから。const struct hoge
+みたいな?
+
+list2(LVAR,hoge,fuga) でhogeに足し算するようなコードはまずい。
+そういえば、大域変数の引き算とかはあんまりやってないな。
+
+Sat Dec  4 13:18:05 JST 2004
+
+そうか、inline function のcontinuation っていう問題があるの
+か。もちろん、外の関数に戻れば良いわけなんだけど、戻る場所が
+異ってしまう。inline が生成されるかどうかによって異る。inline
+の外に必ず戻るってのは、どちらかといえば容易に実現できる。こ
+っそり、return/env を渡してやれば良いから。
+
+goto で関数の任意の位置に戻れるってのは誘惑的だし、その方が
+整合的ではあるんだけど... 構文が良くわからないな。setjump に
+突っ込めるってのは一つの解決方法か。
+
+    if (setjmp(hoge)==0) {
+       goto f(&hoge);
+    }
+
+code f(jmp_buf *hoge) {
+    goto hoge(1);
+}
+
+ですか? そういえば、code の中でlongjmp するとどうなるんだろう?
+局所変数は壊してしまっているので、呼び出した関数には戻れないね。
+まぁ、やっぱり、それを戻れるようにするんじゃないの? setjmp 構文
+は、あんまり良くない。それをいうなら return/environmentも良くない
+けどね。shift/reset みたいな構文が良いか?
+
+
+Sun Dec  5 18:14:05 JST 2004
+
+関数の引数のconstの情報をどこにとっておくかが良くわからない。
+やっぱり CINT とか作る? 結局、const って、すべての型に直交している
+から、そういう風にしなければ、tree で持たないといけないよね。
+そうすると、あらゆるところで、pointer判断が入ってしまう。それは
+うれしくない。それよりは、
+   #define TYPE(a) (a & 0xfffffffe) 
+   #define IS_CONST(a) (a & 1) 
+のがまし? じゃぁ、
+   #define IS_UNSIGNED(a) (a & 2) 
+とかもいれる?
+
+それは、変更が大きいので、とりあえず、mc-inline.c のエラーを
+とってからにするか。
+
+Tue Dec  7 12:19:08 JST 2004
+
+lvar を二度置換するのはまずい。オフセットのタグを増やす方が良い。
+
+
--- a/mc-codegen.c	Sat Dec 04 12:21:47 2004 +0900
+++ b/mc-codegen.c	Tue Dec 07 12:30:18 2004 +0900
@@ -905,8 +905,6 @@
 
 #define DEBUG_PARALLEL_ASSIGN 0
 
-static int is_memory(int e1);
-
 /* overlap 
       return list of overlapped target
  */
@@ -3759,7 +3757,7 @@
 	    error(TYERR);
 	compatible(t1,t2);
 	e=list3(SUB,e1,e2);
-	e=binop(DIV,e,list2(CONST,size(cadr(t1))),UNSIGNED,INT);
+	e=binop(DIV,e,list2(CONST,size(cadr(t1))),INT,INT);
 	type= INT;
 	return e;
     }
--- a/mc-inline.c	Sat Dec 04 12:21:47 2004 +0900
+++ b/mc-inline.c	Tue Dec 07 12:30:18 2004 +0900
@@ -6,6 +6,8 @@
 #include "mc-parse.h"
 #include "mc-codegen.h"
 #include "mc-switch.h"
+#include "mc-code.h"
+#include "mc-inline.h"
 
 static int pvartable;
 static int pdisp;
@@ -392,7 +394,7 @@
 static int
 p_vartable(int e,int adisp,int ldisp)
 {
-    int i,e1,e3;
+    int i;
     pvartable = getfree(adisp+ldisp);
     pdisp = pvartable+adisp;
     for(i=adisp+ldisp;i>=0;i--) {
@@ -408,109 +410,109 @@
     int d = cadr(e1);
     int d1;
     if ((d1=(heap[pdisp+e1]))) return d1;
-    return (heap[pdisp+narg]=new_lvar(sz));
+    return (heap[pdisp+d]=new_lvar(sz));
 }
 
 static int
 pfunction(int e)
 {
-
+    return e;
 }
 
 static int
 prindirect(int e)
 {
-
+    return e;
 }
 
 static int
 paddress(int e)
 {
-
+    return e;
 }
 
 static int
-p_conv(int e)
+p_conv(int e1,int e2)
 {
-
+    return e1;
 }
 
 static int
-pbinop(int e)
+pbinop(int op,int e1,int e2)
 {
-
+    return e1;
 }
 
 static int
 psassign(int e)
 {
-
+    return e;
 }
 
 static int
 passign(int e)
 {
-
+    return e;
 }
 
 static int
 passop(int e)
 {
-
+    return e;
 }
 
 static int
 pdassign(int e)
 {
-
+    return e;
 }
 
 static int
 pdassop(int e)
 {
-
+    return e;
 }
 
 static int
 plassign(int e)
 {
-
+    return e;
 }
 
 static int
 plassop(int e)
 {
-
+    return e;
 }
 
 static int
 palloc(int e)
 {
-
+    return e;
 }
 
 static int
-pcomma(int e)
+pcomma(int e1,int e2)
 {
-
+    return e1;
 }
 
 static int
 prbit_field(int e)
 {
-
+    return e;
 }
 
 static int
 pbassign(int e)
 {
-
+    return e;
 }
 
 static int
 pbassop(int e)
 {
-
+    return e;
 }
 
 static int
@@ -549,98 +551,103 @@
 static int
 p_if(int e)
 {
-
+    return e;
 }
 
 static int
 p_do(int e)
 {
-
+    return e;
 }
 
 static int
 p_while(int e)
 {
-
+    return e;
 }
 
 static int
 p_for(int e)
 {
-
+    return e;
 }
 
 static int
 p_switch(int e)
 {
-
+    return e;
 }
 
 static int
 p_comp(int e)
 {
-
+    return e;
 }
 
 static int
 p_break(int e)
 {
-
+    return e;
 }
 
 static int
 p_continue(int e)
 {
-
+    return e;
 }
 
 static int
 p_case(int e)
 {
-
+    return e;
 }
 
 static int
 p_default(int e)
 {
-
+    return e;
 }
 
 static int
 p_return(int e)
 {
-
+    return e;
 }
 
 static int
 p_goto(int e)
 {
-
+    return e;
 }
 
 static int
 p_asm(int e)
 {
-
+    return e;
 }
 
 static int
 p_label(int e)
 {
-
+    return e;
 }
 
 static int
 p_bool(int e)
 {
+    return e;
+}
 
+static int
+p_comment(int e)
+{
+    return e;
 }
 
 extern int
 pexpr(int e1)
 {
     int e2,e3;
-    NMTBL *n;
 
     // if (inmode) error(-1);
     e2 = cadr(e1);
@@ -874,13 +881,14 @@
     int e1 = attr_value(n,INLINE);
     int parse = car(e1);
     int arg_disp = cadr(e1);
+    int e3,t;
 
     pvartable = p_vartable(e,pdisp=arg_disp,caddr(e1));
     /* inline function arguments */
     narg = 0;
     for (e3 = e1 = reverse0(caddr(e)); e3; e3 = cadr(e3)) {
         t=caddr(e3);
-	if (is_const(e3)||(is_memory(e3)&&is_readonly(e3))) {
+	if (is_const(e3) /* ||(is_memory(e3)&&is_readonly(e3)) */ ) {
 	    heap[pdisp+narg]=e3;
 	} else {
 	    arg = heap[pdisp+narg]=new_lvar(size(t));
@@ -889,8 +897,8 @@
 	narg += (size(t)+3)/4;
     }
     e = pexpr(parse);
-    convlvar = sconvlvar;
     pdisp = sdisp;
+    pvartable = svartable;
     return e;
 }
 
--- a/mc-parse.c	Sat Dec 04 12:21:47 2004 +0900
+++ b/mc-parse.c	Tue Dec 07 12:30:18 2004 +0900
@@ -97,7 +97,7 @@
 static int expr7(void);
 static int expr8(void);
 static int expr9(void);
-static int getfree(int n);
+extern int getfree(int n);
 static int ndecl0(void);
 static int ndecl1(void);
 static int postequ(int s1, int s2);
@@ -4396,7 +4396,7 @@
     return e;
 }
 
-static int
+extern int
 getfree(int n)
 {
     int e;
--- a/mc.h	Sat Dec 04 12:21:47 2004 +0900
+++ b/mc.h	Tue Dec 07 12:30:18 2004 +0900
@@ -483,6 +483,7 @@
 extern int list4(int e1, int e2, int e3,int e4);
 extern int list5(int e1, int e2, int e3,int e4,int e5);
 extern int length(int e1);
+extern int getfree(int size);
 extern int nth(int n,int e1);
 extern int reverse0(int t1);
 extern int append4(int p,int a1,int a2,int a3);