mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-20 02:30:23 +02:00
Clean up stack after calls
This commit is contained in:
parent
99b4fd2d79
commit
573af9c19b
2 changed files with 21 additions and 1 deletions
2
jit.h
2
jit.h
|
@ -170,7 +170,7 @@ JIT_API void jit_patch_here(jit_state_t*, jit_reloc_t);
|
||||||
JIT_API void jit_patch_there(jit_state_t*, jit_reloc_t, jit_pointer_t);
|
JIT_API void jit_patch_there(jit_state_t*, jit_reloc_t, jit_pointer_t);
|
||||||
|
|
||||||
/* Note that all functions that take jit_arg_t args[] use the args as scratch
|
/* Note that all functions that take jit_arg_t args[] use the args as scratch
|
||||||
space. */
|
space while shuffling values into position. */
|
||||||
JIT_API void jit_calli(jit_state_t *, jit_pointer_t f,
|
JIT_API void jit_calli(jit_state_t *, jit_pointer_t f,
|
||||||
size_t argc, const jit_arg_abi_t abi[],
|
size_t argc, const jit_arg_abi_t abi[],
|
||||||
jit_arg_t args[]);
|
jit_arg_t args[]);
|
||||||
|
|
20
jit/x86.c
20
jit/x86.c
|
@ -735,6 +735,22 @@ prepare_args(jit_state_t *_jit, size_t argc, const jit_arg_abi_t abi[],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
cleanup_stack_after_call(jit_state_t *_jit, size_t argc,
|
||||||
|
const jit_arg_abi_t abi[])
|
||||||
|
{
|
||||||
|
jit_arg_t scratch;
|
||||||
|
struct abi_arg_iterator iter;
|
||||||
|
|
||||||
|
// Compute stack arg size.
|
||||||
|
reset_abi_arg_iterator(&iter, argc, abi);
|
||||||
|
for (size_t i = 0; i < argc; i++)
|
||||||
|
next_abi_arg(&iter, &scratch);
|
||||||
|
|
||||||
|
if (iter.stack_size)
|
||||||
|
jit_addi(_jit, JIT_SP, JIT_SP, iter.stack_size);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
jit_calli(jit_state_t *_jit, jit_pointer_t f,
|
jit_calli(jit_state_t *_jit, jit_pointer_t f,
|
||||||
size_t argc, const jit_arg_abi_t abi[], jit_arg_t args[])
|
size_t argc, const jit_arg_abi_t abi[], jit_arg_t args[])
|
||||||
|
@ -742,6 +758,8 @@ jit_calli(jit_state_t *_jit, jit_pointer_t f,
|
||||||
prepare_args(_jit, argc, abi, args);
|
prepare_args(_jit, argc, abi, args);
|
||||||
|
|
||||||
calli(_jit, (jit_word_t)f);
|
calli(_jit, (jit_word_t)f);
|
||||||
|
|
||||||
|
cleanup_stack_after_call(_jit, argc, abi);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -751,6 +769,8 @@ jit_callr(jit_state_t *_jit, jit_gpr_t f,
|
||||||
prepare_args(_jit, argc, abi, args);
|
prepare_args(_jit, argc, abi, args);
|
||||||
|
|
||||||
callr(_jit, rn(f));
|
callr(_jit, rn(f));
|
||||||
|
|
||||||
|
cleanup_stack_after_call(_jit, argc, abi);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue