diff options
| author | Daniel Glöckner <daniel-gl@gmx.net> | 2014-03-29 17:50:40 +0100 |
|---|---|---|
| committer | Daniel Glöckner <daniel-gl@gmx.net> | 2014-03-29 17:50:40 +0100 |
| commit | 10750872419df9dc92421c4fd719f42e5561ee77 (patch) | |
| tree | 6f3f038903e3a2b23dfb8f3a4e54e1b12404e110 /arm-gen.c | |
| parent | f272407353f2abdc09f9f6bcb54bcf4b6521d782 (diff) | |
| download | tinycc-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
Diffstat (limited to 'arm-gen.c')
| -rw-r--r-- | arm-gen.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -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) { |
