aboutsummaryrefslogtreecommitdiff
path: root/x86_64-gen.c
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2017-05-27 22:42:18 +0200
committerMichael Matz <matz@suse.de>2017-05-27 22:42:18 +0200
commit7cd1ae7710aefad30e2f9893fbf6d3db29f8ae01 (patch)
tree357d5d27731819004010834b2f5d9c6234ec6cdd /x86_64-gen.c
parent53c5fc2246270e0242903de0152a9a5d40f3d679 (diff)
downloadtinycc-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.c18
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;
}
}