From a6d256fa47a543a12c9325a8267b92da67b2970d Mon Sep 17 00:00:00 2001 From: Scott Graham Date: Thu, 2 May 2024 22:34:09 -0700 Subject: [PATCH] Fix incorrect parameter offset calculation on Windows beyond argument 5 Fixes #17. --- src/codegen.in.c | 6 +++++- test/struct_bug17.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 test/struct_bug17.c diff --git a/src/codegen.in.c b/src/codegen.in.c index 400929c..24d0b73 100644 --- a/src/codegen.in.c +++ b/src/codegen.in.c @@ -2113,7 +2113,11 @@ static void assign_lvar_offsets(Obj* prog) { var->offset = top; // outaf("int stack %s at stack 0x%x\n", var->name, var->offset); - top += MAX(8, var->ty->size); + if (var->is_param_passed_by_reference) { + top += 8; + } else { + top += MAX(8, var->ty->size); + } } // Assign offsets to local variables. diff --git a/test/struct_bug17.c b/test/struct_bug17.c new file mode 100644 index 0000000..97238be --- /dev/null +++ b/test/struct_bug17.c @@ -0,0 +1,30 @@ +#include "test.h" + +struct StructA { + int x1, x2, x3; +}; + +void func(int dummy1, + int dummy2, + int dummy3, + int dummy4, + struct StructA trigger, + struct StructA bug_occurred) { + // Crash was occurring due to incorrect calculation of parameter offsets when + // passed by reference beyond register slots. + ASSERT(0, bug_occurred.x1); + ASSERT(1, bug_occurred.x2); + ASSERT(2, bug_occurred.x3); +} + +extern void XXXXX(int dummy1, + int dummy2, + int dummy3, + int dummy4, + struct StructA trigger, + struct StructA bug_occurred); +int main(void) { + struct StructA var = {0, 1, 2}; + func(1, 2, 3, 4, var, var); + return 0; +}