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; +}