mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-20 18:50:21 +02:00
Add new test case to check stack integrity on complex stack frames.
* check/stack.ok, check/stack.tst: New files to test data integrity on a deep chain of stack frames. * lib/jit_arm.c, lib/jit_arm-cpu.c, lib/jit_mips.c, lib/jit_mips-cpu.c, lib/jit_ppc.c, lib/jit_ppc-cpu.c, lib/jit_x86.c, lib/jit_x86-cpu.c: Calculate _jit->function->stack in the emit stage, otherwise it will calculate it wrong if need to jit_allocai space to spill registers. * lib/lightning.c: Correct wrong offset when updating the "current" jit function pointer in the code that may need to allocate stack space to spill registers. * check/lightning.c: Correct off by one data space check. * check/Makefile.am: Update for new test case.
This commit is contained in:
parent
b43ea1f908
commit
a74318a1d7
14 changed files with 387 additions and 29 deletions
|
@ -224,12 +224,6 @@ void
|
|||
_jit_epilog(jit_state_t *_jit)
|
||||
{
|
||||
assert(_jit->function);
|
||||
|
||||
_jit->function->stack = ((/* first 16 bytes must be allocated */
|
||||
(_jit->function->self.alen > 16 ?
|
||||
_jit->function->self.alen : 16) -
|
||||
/* align stack at 8 bytes */
|
||||
_jit->function->self.aoff) + 7) & -8;
|
||||
assert(_jit->function->epilog->next == NULL);
|
||||
jit_link(_jit->function->epilog);
|
||||
_jit->function = NULL;
|
||||
|
@ -266,13 +260,20 @@ _jit_arg_f(jit_state_t *_jit)
|
|||
|
||||
assert(_jit->function);
|
||||
offset = (_jit->function->self.size - stack_framesize) >> 2;
|
||||
if (offset < 4) {
|
||||
if (offset < 3) {
|
||||
if (!_jit->function->self.argi) {
|
||||
offset += 4;
|
||||
_jit->function->self.argf += 2;
|
||||
assert(!(offset & 1));
|
||||
}
|
||||
else
|
||||
else {
|
||||
_jit->function->self.argi += 2;
|
||||
if (offset & 1) {
|
||||
++_jit->function->self.argi;
|
||||
++offset;
|
||||
_jit->function->self.size += sizeof(jit_float32_t);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
offset = _jit->function->self.size;
|
||||
|
@ -395,7 +396,7 @@ void
|
|||
_jit_getarg_f(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_new_node_ww(jit_code_getarg_f, u, _A0 - (v >> 1));
|
||||
jit_new_node_ww(jit_code_getarg_f, u, _A0 - v);
|
||||
else if (v < 8)
|
||||
jit_movr_f(u, _F12 - ((v - 4) >> 1));
|
||||
else
|
||||
|
@ -406,7 +407,7 @@ void
|
|||
_jit_getarg_d(jit_state_t *_jit, jit_int32_t u, jit_int32_t v)
|
||||
{
|
||||
if (v < 4)
|
||||
jit_new_node_ww(jit_code_getarg_d, u, _A0 - (v >> 1));
|
||||
jit_new_node_ww(jit_code_getarg_d, u, _A0 - v);
|
||||
else if (v < 8)
|
||||
jit_movr_d(u, _F12 - ((v - 4) >> 1));
|
||||
else
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue