1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00

VM does not initialize stack frames

* libguile/jit.c (compile_alloc_frame): Stop initializing locals.
  (compile_bind_rest): Use emit_alloc_frame.
* libguile/vm-engine.c (assert_nargs_ee_locals, allocate_frame): Don't
  initialize locals.
  (bind_rest): Don't initialize locals, and assert that the locals count
  has a minimum.
This commit is contained in:
Andy Wingo 2019-06-06 17:39:53 +02:00
parent c86758c298
commit f07fadc72e
2 changed files with 10 additions and 51 deletions

View file

@ -1851,38 +1851,8 @@ compile_assert_nargs_le (scm_jit_state *j, uint32_t nlocals)
static void
compile_alloc_frame (scm_jit_state *j, uint32_t nlocals)
{
jit_gpr_t t = T0, saved_frame_size = T1_PRESERVED;
if (j->frame_size_min != j->frame_size_max)
jit_subr (j->jit, saved_frame_size, FP, SP);
/* This will clear the regalloc, so no need to track clobbers. */
emit_alloc_frame (j, t, nlocals);
if (j->frame_size_min == j->frame_size_max)
{
int32_t slots = nlocals - j->frame_size_min;
if (slots > 0)
{
jit_movi (j->jit, t, SCM_UNPACK (SCM_UNDEFINED));
while (slots-- > 0)
emit_sp_set_scm (j, slots, t);
}
}
else
{
jit_gpr_t walk = saved_frame_size;
jit_subr (j->jit, walk, FP, saved_frame_size);
jit_reloc_t k = jit_bler (j->jit, walk, SP);
jit_movi (j->jit, t, SCM_UNPACK (SCM_UNDEFINED));
void *head = jit_address (j->jit);
jit_subi (j->jit, walk, walk, sizeof (union scm_vm_stack_element));
jit_str (j->jit, walk, t);
jit_patch_there (j->jit, jit_bner (j->jit, walk, SP), head);
jit_patch_here (j->jit, k);
}
emit_alloc_frame (j, T0, nlocals);
j->frame_size_min = j->frame_size_max = nlocals;
}
@ -2007,7 +1977,7 @@ compile_bind_rest (scm_jit_state *j, uint32_t dst)
cons = emit_branch_if_frame_locals_count_greater_than (j, t, dst);
compile_alloc_frame (j, dst + 1);
emit_alloc_frame (j, t, dst + 1);
emit_movi (j, t, SCM_UNPACK (SCM_EOL));
emit_sp_set_scm (j, 0, t);
k = jit_jmp (j->jit);