aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2015-03-09 03:54:33 +0100
committerMichael Matz <matz@suse.de>2015-03-09 03:54:33 +0100
commit25b2779c3d88b0acdf86e99c0c60836153ec401b (patch)
tree2b08a17a7368395d7f19fc3e6410a7c3b69dbf0a /lib
parent2eb4f4a3badd181876698e7964a4c4f4bec2c8bf (diff)
downloadtinycc-25b2779c3d88b0acdf86e99c0c60836153ec401b.tar.gz
tinycc-25b2779c3d88b0acdf86e99c0c60836153ec401b.tar.bz2
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/libtcc1.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/lib/libtcc1.c b/lib/libtcc1.c
index 4a923a2..ece6413 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: