x86-64: Fix stdarg for large non-float structs

Some structs are passed in registers.  When they need more than
one the implementation of __va_arg on x86-64 didn't correctly account
for this.  This fixes only the cases where the structs consist of
integer types, as there the register save area is consecutive.

Fixes some tests from 73_arm64.c, but still leaves those failing
that use floating point in the large-but-regpassed structs.
master
Michael Matz 2015-03-09 03:54:33 +01:00
parent 2eb4f4a3ba
commit 25b2779c3d
1 changed files with 3 additions and 4 deletions

View File

@ -688,11 +688,10 @@ void *__va_arg(__va_list_struct *ap,
align = (align + 7) & ~7;
switch (arg_type) {
case __va_gen_reg:
if (ap->gp_offset < 48) {
ap->gp_offset += 8;
return ap->reg_save_area + ap->gp_offset - 8;
if (ap->gp_offset + size <= 48) {
ap->gp_offset += size;
return ap->reg_save_area + ap->gp_offset - size;
}
size = 8;
goto use_overflow_area;
case __va_float_reg: