From 25b2779c3d88b0acdf86e99c0c60836153ec401b Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Mon, 9 Mar 2015 03:54:33 +0100 Subject: [PATCH] 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. --- lib/libtcc1.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/libtcc1.c b/lib/libtcc1.c index 4a923a22..ece6413b 100644 --- a/lib/libtcc1.c +++ b/lib/libtcc1.c @@ -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: