From fd6d2180c5c801bb0b4c5dde27d61503059fc97d Mon Sep 17 00:00:00 2001 From: herman ten brugge Date: Mon, 31 Jul 2023 09:24:06 +0200 Subject: [PATCH] Align stack when returning structs. The stack was not aligned when a returned structure was stored on stack. This resulted in destoying of previous values stored on stack. See testcase 119 (tst_struct_return_align) where value d is overwritten. --- tccgen.c | 3 ++- tests/tests2/119_random_stuff.c | 21 +++++++++++++++++++++ tests/tests2/119_random_stuff.expect | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/tccgen.c b/tccgen.c index f91a43dd..d5e3b15f 100644 --- a/tccgen.c +++ b/tccgen.c @@ -6142,6 +6142,7 @@ special_math_val: space. Assume register size is power of 2. */ if (regsize > align) align = regsize; + loc &= -align; loc = (loc - size) & -align; addr = loc; offset = 0; @@ -6622,7 +6623,7 @@ static void gfunc_return(CType *func_type) size = type_size(func_type,&align); if ((vtop->r != (VT_LOCAL | VT_LVAL) || (vtop->c.i & (ret_align-1))) - || (align & (ret_align-1))) { + && (align & (ret_align-1))) { loc = (loc - size) & -ret_align; addr = loc; type = *func_type; diff --git a/tests/tests2/119_random_stuff.c b/tests/tests2/119_random_stuff.c index 0b7a4e50..5530c096 100644 --- a/tests/tests2/119_random_stuff.c +++ b/tests/tests2/119_random_stuff.c @@ -99,6 +99,26 @@ void tst_indir_func(void) tst_indir.print("tst_indir_func %d\n", 10); } +struct V { + int x, y, z; +}; + +struct V vec(void) +{ + return (struct V) { 1, 2, 3 }; +} + +void func(float f, struct V v) +{ + printf("%g\n", f); +} + +void tst_struct_return_align(void) +{ + float d = 5.0f; + func(d, vec()); +} + int main (void) { @@ -117,4 +137,5 @@ main (void) tst_pack(); tst_cast(); tst_indir_func(); + tst_struct_return_align(); } diff --git a/tests/tests2/119_random_stuff.expect b/tests/tests2/119_random_stuff.expect index 3bd4a87a..02ce2282 100644 --- a/tests/tests2/119_random_stuff.expect +++ b/tests/tests2/119_random_stuff.expect @@ -4,3 +4,4 @@ tst_compare: ok tst_pack: j.f = 5, i.f = 5 schar to ushort cast: ffff0033 tst_indir_func 10 +5