Mercurial > hg > CbC > old > device
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);