diff options
| author | Michael Matz <matz@suse.de> | 2015-03-09 03:54:33 +0100 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2015-03-09 03:54:33 +0100 |
| commit | 25b2779c3d88b0acdf86e99c0c60836153ec401b (patch) | |
| tree | 2b08a17a7368395d7f19fc3e6410a7c3b69dbf0a /lib/libtcc1.c | |
| parent | 2eb4f4a3badd181876698e7964a4c4f4bec2c8bf (diff) | |
| download | tinycc-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/libtcc1.c')
| -rw-r--r-- | lib/libtcc1.c | 7 |
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: |
