# HG changeset patch # User Shinji KONO # Date 1290797215 -32400 # Node ID fe751ca164a2d22034a73000408e7afbc0b73e44 # Parent 9598ecec0af5d749b8c1d116e88e820747efec26 i64 parse_mode fix... diff -r 9598ecec0af5 -r fe751ca164a2 mc-code-i64.c --- a/mc-code-i64.c Fri Nov 26 19:38:40 2010 +0900 +++ b/mc-code-i64.c Sat Nov 27 03:46:55 2010 +0900 @@ -1179,6 +1179,16 @@ offset = disp; reg_in_arg = arg_size; printf("\t.set %s%d,%d\n",lpfx,lvar_offset_label,reg_in_arg); + if (!parse_mode && dots) { + int stype = type; int smode = mode; + type = INT; + mode = LDECL; + stmode = 0; + // lsearch defines local name + NMTBL *n = def(lsearch("__my_va_list",0),0); + n->dsp = offset; + type = stype; mode = smode; + } for(args = fnptr->dsp;args;args = cadr(args)) { n = ncadddr(args); @@ -1221,6 +1231,7 @@ list3n(LVAR,offset,0),reg,LONGLONG,LONGLONG)); offset+=SIZE_OF_LONGLONG; reg_var++; + free_register(cadr(reg)); } // Intel64 keeps number of double value in %al while ((reg = get_input_dregister_var(freg_var,0,0,0))) { @@ -1228,6 +1239,7 @@ list3n(LVAR,offset,0),reg,DOUBLE,DOUBLE)); offset+=SIZE_OF_DOUBLE; freg_var++; + free_register(cadr(reg)); } } // my_func_args = offset; @@ -1246,6 +1258,7 @@ int is_code0 = is_code(fnptr); int dots; arg_offset_v = 0; + int func_reg_arg_size = 0; function_type(fnptr->ty,&dots); if (dots && (in || !parse_mode)) { @@ -1253,22 +1266,23 @@ mode = LDECL; stmode = 0; n = def(lsearch("__my_va_list",0),0); - n->dsp = 0; // first argument + n->dsp = 0; // first argument } if (in) return; + // def in code_decl is useless, we have to recalcurate while (args) { - // we should use increment_arg - /* process in reverse order */ n = ncadddr(args); type = n->ty; + int sz = size(type); + arg_offset_v = code_arg_alignment(arg_offset_v,n, type,sz, is_code0); if (type==LONGLONG||type==ULONGLONG) { // scalar includes LONGLONG, check first if ((reg = get_input_lregister_var(reg_var,n,is_code0))) { n->sc = LREGISTER; n->dsp = cadr(reg); regs[n->dsp]= INPUT_REG; reg_var+=1; - arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type)); + func_reg_arg_size += SIZE_OF_LONGLONG ; } } else if (scalar(type)) { if ((reg = get_input_register_var(reg_var,n,is_code0))) { @@ -1276,7 +1290,7 @@ n->dsp = cadr(reg); regs[n->dsp]= INPUT_REG; reg_var++; - arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type)); + func_reg_arg_size += SIZE_OF_LONGLONG ; } } else if (type==FLOAT) { if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) { @@ -1284,7 +1298,7 @@ n->dsp = cadr(reg); regs[n->dsp]= INPUT_REG; freg_var++; - arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type)); + func_reg_arg_size += SIZE_OF_LONGLONG ; } } else if (type==DOUBLE) { if ((reg = get_input_dregister_var(freg_var,n,is_code0,1))) { @@ -1292,15 +1306,15 @@ n->dsp = cadr(reg); regs[n->dsp]= INPUT_REG; freg_var++; - arg_offset_v += SIZE_OF_LONGLONG; // (caddr(args)=size(type)); + func_reg_arg_size += SIZE_OF_LONGLONG ; } - } + } args = cadr(args); } if (is_function(fnptr)) { if (dots) { // %al の値によって float を適切にloadする必要がある sigh... - arg_offset_v = + func_reg_arg_size = MAX_INPUT_REGISTER_VAR*SIZE_OF_LONGLONG + MAX_INPUT_DREGISTER_VAR*SIZE_OF_DOUBLE; #ifndef __APPLE__ @@ -1308,7 +1322,8 @@ arg_offset_v+ arg_offset); #endif } - code_save_input_registers(dots, arg_offset_v); + code_save_input_registers(dots, func_reg_arg_size ); + arg_offset_v = func_reg_arg_size; } } diff -r 9598ecec0af5 -r fe751ca164a2 mc-codegen.c --- a/mc-codegen.c Fri Nov 26 19:38:40 2010 +0900 +++ b/mc-codegen.c Sat Nov 27 03:46:55 2010 +0900 @@ -3517,7 +3517,10 @@ n->dsp = args++; n->sc = IVAR; } else { - args = code_arg_alignment(args,n,type0,sz, is_code(fnptr)); + // this is useless, because we cannot know this function is code or function now + // args = code_arg_alignment(args,n,type0,sz, is_code(fnptr)); + n->dsp = (args += size(type)); + n->sc = LVAR; } caddr(fnptr->dsp)=sz; @@ -3679,14 +3682,14 @@ // generate constant on global memory // static int -emit_name(int e,NMTBL *n) +emit_name(int e,NMTBL *n, int sz) { switch(car(e)) { case CONST: - if (lp64) emit_longlong(e); else emit_int(cadr(e)); + if (lp64 && sz>4) emit_longlong(e); else emit_int(cadr(e)); return 1; case LCONST: - if (lp64) emit_longlong(e); else emit_int(lcadr(e)); + if (lp64 && sz>4) emit_longlong(e); else emit_int(lcadr(e)); return 1; case ADDRESS: if (car(cadr(e))==GVAR) @@ -3755,7 +3758,7 @@ emit_longlong(e); return; } - if (lp64 && emit_name(e,n)) return; + if (lp64 && emit_name(e,n,size(t))) return; break; default: if (t<0) error(-1); @@ -3767,7 +3770,7 @@ if (car(t)!=POINTER&&car(t)!=ARRAY) error(-1); case INT: case UNSIGNED: /* including address case */ case ENUM: - if (emit_name(e,n)) return; + if (emit_name(e,n,size(t))) return; } error(INERR); } diff -r 9598ecec0af5 -r fe751ca164a2 mc-parse.c --- a/mc-parse.c Fri Nov 26 19:38:40 2010 +0900 +++ b/mc-parse.c Sat Nov 27 03:46:55 2010 +0900 @@ -2065,16 +2065,6 @@ extern void code_arguments_fix(NMTBL *fnptr) { -#if 0 - /* reverse all argument offset (with size) */ - int t; - int arglist = fnptr->dsp; - for(t=arglist;t;t=cadr(t)) { - NMTBL *n=ncadddr(t); - if(n->sc==LVAR) - n->dsp = -n->dsp-caddr(t); - } -#endif arg_register(fnptr, inmode); }