aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Glöckner <daniel-gl@gmx.net>2014-03-29 17:50:40 +0100
committerDaniel Glöckner <daniel-gl@gmx.net>2014-03-29 17:50:40 +0100
commit10750872419df9dc92421c4fd719f42e5561ee77 (patch)
tree6f3f038903e3a2b23dfb8f3a4e54e1b12404e110
parentf272407353f2abdc09f9f6bcb54bcf4b6521d782 (diff)
downloadtinycc-10750872419df9dc92421c4fd719f42e5561ee77.tar.gz
tinycc-10750872419df9dc92421c4fd719f42e5561ee77.tar.bz2
ARM: Fix passing arrays to varadic functions
TinyCC miscompiled void g(int,...); void f(void) { char b[4000]; g(1, 2, 3, 4, b); } in two ways: 1. It didn't align the stack to 8 bytes before the call 2. It added sizeof(b) to the stack pointer after the call
-rw-r--r--arm-gen.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/arm-gen.c b/arm-gen.c
index 1ee008f..a9c05fe 100644
--- a/arm-gen.c
+++ b/arm-gen.c
@@ -959,7 +959,9 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo)
memset(plan->clsplans, 0, sizeof(plan->clsplans));
for(i = nb_args; i-- ;) {
int j, start_vfpreg = 0;
- size = type_size(&vtop[-i].type, &align);
+ CType type = vtop[-i].type;
+ type.t &= ~VT_ARRAY;
+ size = type_size(&type, &align);
size = (size + 3) & ~3;
align = (align + 3) & ~3;
switch(vtop[-i].type.t & VT_BTYPE) {