From 6c7813a05f8772489a8543e10654d40558219baf Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Thu, 30 Jul 2020 11:51:56 +0200 Subject: [PATCH] Ensure tail caller and callee in jmpi test have compatible ABI * tests/jmpi.c: Emit the tail callee using the JIT, to ensure that it saves and restores registers in the same way as the caller. Fixes #16. --- tests/jmpi.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/tests/jmpi.c b/tests/jmpi.c index 2f9213fec..e73ace055 100644 --- a/tests/jmpi.c +++ b/tests/jmpi.c @@ -1,21 +1,41 @@ #include "test.h" -static int tail(void) { return 42; } +void *tail; + +static void *target; static void run_test(jit_state_t *j, uint8_t *arena_base, size_t arena_size) { jit_begin(j, arena_base, arena_size); - - jit_jmpi(j, tail); - + jit_enter_jit_abi(j, 0, 0, 0); + jit_movi(j, JIT_R0, 42); + jit_jmpi(j, target); + // Unreachable. + jit_breakpoint(j); int (*f)(void) = jit_end(j, NULL); - ASSERT(f() == 42); } +// Make the tail-call target via a separate main_helper because probably the new +// arena will be allocated farther away, forcing nonlocal jumps. +static void +make_target(jit_state_t *j, uint8_t *arena_base, size_t arena_size) +{ + jit_begin(j, arena_base, arena_size); + size_t align = jit_enter_jit_abi(j, 0, 0, 0); + // Tail call target assumes tail caller called enter_jit_abi with compatible + // parameters. + target = jit_address(j); + jit_leave_jit_abi(j, 0, 0, align); + jit_retr(j, JIT_R0); + jit_end(j, NULL); + + main_helper(0, NULL, run_test); +} + int main (int argc, char *argv[]) { - return main_helper(argc, argv, run_test); + return main_helper(argc, argv, make_target); }