diff options
| author | Michael Matz <matz@suse.de> | 2017-05-27 22:42:18 +0200 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2017-05-27 22:42:18 +0200 |
| commit | 7cd1ae7710aefad30e2f9893fbf6d3db29f8ae01 (patch) | |
| tree | 357d5d27731819004010834b2f5d9c6234ec6cdd /x86_64-gen.c | |
| parent | 53c5fc2246270e0242903de0152a9a5d40f3d679 (diff) | |
| download | tinycc-7cd1ae7710aefad30e2f9893fbf6d3db29f8ae01.tar.gz tinycc-7cd1ae7710aefad30e2f9893fbf6d3db29f8ae01.tar.bz2 | |
x86-64: Fix psABI stdarg prologue
If there were more than 6 integer arguments before the ellipsis, or
there were used more than 8 slots used until the ellipsis (e.g. by
a large intermediate struct) we generated wrong code. See testcase.
Diffstat (limited to 'x86_64-gen.c')
| -rw-r--r-- | x86_64-gen.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/x86_64-gen.c b/x86_64-gen.c index 0067fdc..19d5dd7 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -1423,21 +1423,15 @@ void gfunc_prolog(CType *func_type) break; case x86_64_mode_integer: - if (seen_reg_num + reg_count <= 8) { - seen_reg_num += reg_count; - } else { - seen_reg_num = 8; - goto stack_arg; - } + if (seen_reg_num + reg_count > REGN) + goto stack_arg; + seen_reg_num += reg_count; break; case x86_64_mode_sse: - if (seen_sse_num + reg_count <= 8) { - seen_sse_num += reg_count; - } else { - seen_sse_num = 8; - goto stack_arg; - } + if (seen_sse_num + reg_count > 8) + goto stack_arg; + seen_sse_num += reg_count; break; } } |
