From d567612fd6344204c6c8438b8fe7fe7dbd54d924 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Fri, 19 Sep 2025 16:56:32 +0300 Subject: fix multiple labels at same instruction --- tests/z_double_label.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/z_double_label.c (limited to 'tests/z_double_label.c') diff --git a/tests/z_double_label.c b/tests/z_double_label.c new file mode 100644 index 0000000..4817d8c --- /dev/null +++ b/tests/z_double_label.c @@ -0,0 +1,38 @@ +#include +#include +#include "do_jit.h" + +int main(int argc, char *argv[]) +{ + (void)argv; + bool do_jit = argc > 1; + struct ejit_func *f = ejit_create_func(EJIT_INT32, 0, NULL); + ejit_movi(f, EJIT_GPR(0), 0); + + struct ejit_reloc l1 = ejit_jmp(f); + struct ejit_label mid = ejit_label(f); + struct ejit_reloc l2 = ejit_jmp(f); + + /* patch relocs to same address with two separate labels. */ + ejit_patch(f, l1, ejit_label(f)); + ejit_patch(f, l2, ejit_label(f)); + + /* we came from the first jump, jump to the end */ + struct ejit_reloc end = ejit_beqi(f, EJIT_GPR(0), 1); + + /* set r0 to 1 to indicate that we've done the first jump */ + ejit_movi(f, EJIT_GPR(0), 1); + + /* jump in between the two jumps */ + ejit_patch(f, ejit_jmp(f), mid); + + ejit_patch(f, end, ejit_label(f)); + ejit_reti(f, 0); + + + ejit_select_compile_func(f, 1, 0, false, do_jit, true); + + assert(ejit_run_func_i(f, 0, NULL) == 0); + + ejit_destroy_func(f); +} -- cgit v1.2.3