From 4126056fbe62dfc7897b0b2c52abf9fdfbfbffda Mon Sep 17 00:00:00 2001 From: Philip Date: Wed, 29 Apr 2015 21:32:14 +0000 Subject: [PATCH] fix vstack leak I think this code only affects the ARM EABI target, and only when returning small structures that might be unaligned. However, it was both leaking vstack entries and failing to achieve what I think is its purpose, to ensure the sret argument would be aligned properly. Both issues fixed. --- tccgen.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tccgen.c b/tccgen.c index 8c1165f..e054b4b 100644 --- a/tccgen.c +++ b/tccgen.c @@ -4916,12 +4916,13 @@ static void block(int *bsym, int *csym, int *case_sym, int *def_sym, size = type_size(&func_vt,&align); if ((vtop->r != (VT_LOCAL | VT_LVAL) || (vtop->c.i & (ret_align-1))) && (align & (ret_align-1))) { - loc = (loc - size) & -align; + loc = (loc - size) & -ret_align; addr = loc; type = func_vt; vset(&type, VT_LOCAL | VT_LVAL, addr); vswap(); vstore(); + vpop(); vset(&ret_type, VT_LOCAL | VT_LVAL, addr); } vtop->type = ret_type;