# HG changeset patch # User kono # Date 1134358848 -32400 # Node ID f84d4525ffc8609aefce308e7d71bd1f9b9126d4 # Parent 77cab9687d3f496ac73d8d369f6dcf36e10f287c lvar alignment diff -r 77cab9687d3f -r f84d4525ffc8 Changes --- a/Changes Sun Dec 11 23:53:27 2005 +0900 +++ b/Changes Mon Dec 12 12:40:48 2005 +0900 @@ -7354,6 +7354,9 @@ attribute は変数にしかつかない。関数の型にconstを入れるとすれば、 ANSI-Cとの互換性を考えても type system に入れるべきでしょう。 +emit_data で、型だけ見て処理してました。値の型を見ないとね。 +address 以外は型検査で落していたらしい。 + int a0(); int a5(); diff -r 77cab9687d3f -r f84d4525ffc8 mc-code-arm.c --- a/mc-code-arm.c Sun Dec 11 23:53:27 2005 +0900 +++ b/mc-code-arm.c Mon Dec 12 12:40:48 2005 +0900 @@ -550,7 +550,6 @@ size_of_double = SIZE_OF_DOUBLE; size_of_longlong = SIZE_OF_LONGLONG; endian = ENDIAN; - disp_align = 4; init_src = init_src0; reg=RET_LREGISTER; diff -r 77cab9687d3f -r f84d4525ffc8 mc-codegen.c --- a/mc-codegen.c Sun Dec 11 23:53:27 2005 +0900 +++ b/mc-codegen.c Mon Dec 12 12:40:48 2005 +0900 @@ -18,7 +18,6 @@ int size_of_longlong; int bit_of_byte; int endian; -int disp_align; static void assign(int e1); #if ASM_CODE @@ -2825,9 +2824,7 @@ nsc = car(ndsp); ndsp = cadr(ndsp); } else { - if (sz%size_of_int==0) { - disp = ((disp+(size_of_int-1))&~(size_of_int-1)); - } + /* local variable alignment is done by new_lvar */ nsc = LVAR; ndsp = new_lvar(sz); } @@ -3971,14 +3968,13 @@ extern int new_lvar0(int sz) { - switch (disp_align) { - default: - case 0: return disp-=sz; - case 4: - disp-=sz; - if (sz>=4) disp &= -4; - return disp; + disp-=sz; +#if 1 + if (sz>=4 && (disp & (4-1))) { + disp &= ~(4-1); } +#endif + return disp; } extern int diff -r 77cab9687d3f -r f84d4525ffc8 mc-codegen.h --- a/mc-codegen.h Sun Dec 11 23:53:27 2005 +0900 +++ b/mc-codegen.h Mon Dec 12 12:40:48 2005 +0900 @@ -12,7 +12,6 @@ extern int size_of_longlong; extern int bit_of_byte; extern int endian; -extern int disp_align; #define USE_CREG (-1) #define ASM_INPUT 1