# HG changeset patch # User kono # Date 1131616277 -32400 # Node ID 5e1acbe824839e325546d0aeff4db74d8d406f2b # Parent 308192c08e0ae12d217b8ee4cf2bf68a9af6cba8 struct alignment diff -r 308192c08e0a -r 5e1acbe82483 Changes --- a/Changes Thu Nov 10 14:33:49 2005 +0900 +++ b/Changes Thu Nov 10 18:51:17 2005 +0900 @@ -7241,4 +7241,29 @@ ia32 の emit_copy が無限ループ。 - +Thu Nov 10 18:46:39 JST 2005 + +ia32 のfloat drindirect のoffset + +構造体のalignmentをやってませんでした。 + +Unioon のdisp の計算、変じゃないか? + + } else if (mode==GUDECL||mode==LUDECL) { + // disp = ((disp+(size_of_int-1))&~(size_of_int-1)); + if (type>0 && car(type)==BIT_FIELD) { + cadr(caddr(type)) = 0; sz = size(cadr(type)); + } else { + sz = size(type); + } + fields = list4(type,fields,(int)(n->nm),0); + ^^^ disp じゃないの? + .... + + case GUDECL: case LUDECL: + if (disp < sz) disp = sz; + return n; + +と union だけdispが特別扱いのようですが... あんまりテストされてないなぁ。 + + diff -r 308192c08e0a -r 5e1acbe82483 mc-codegen.c --- a/mc-codegen.c Thu Nov 10 14:33:49 2005 +0900 +++ b/mc-codegen.c Thu Nov 10 18:51:17 2005 +0900 @@ -2700,6 +2700,9 @@ #endif } else { sz = size(type); + if (sz%size_of_int==0) { + disp = ((disp+(size_of_int-1))&~(size_of_int-1)); + } } if (n!=&null_nptr) fields = list4(type,fields,(int)(n->nm),disp); @@ -2822,6 +2825,9 @@ nsc = car(ndsp); ndsp = cadr(ndsp); } else { + if (sz%size_of_int==0) { + disp = ((disp+(size_of_int-1))&~(size_of_int-1)); + } nsc = LVAR; ndsp = new_lvar(sz); }