py/emitnative: Ensure stack settling is safe mid-branch.
And add a test for the case where REG_RET could be in use. Fixes #7523. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
This commit is contained in:
parent
d0227d5862
commit
0e3752e82a
|
@ -877,7 +877,7 @@ STATIC vtype_kind_t load_reg_stack_imm(emit_t *emit, int reg_dest, const stack_i
|
||||||
// Copies all unsettled registers and immediates that are Python values into the
|
// Copies all unsettled registers and immediates that are Python values into the
|
||||||
// concrete Python stack. This ensures the concrete Python stack holds valid
|
// concrete Python stack. This ensures the concrete Python stack holds valid
|
||||||
// values for the current stack_size.
|
// values for the current stack_size.
|
||||||
// This function may clobber REG_TEMP0.
|
// This function may clobber REG_TEMP1.
|
||||||
STATIC void need_stack_settled(emit_t *emit) {
|
STATIC void need_stack_settled(emit_t *emit) {
|
||||||
DEBUG_printf(" need_stack_settled; stack_size=%d\n", emit->stack_size);
|
DEBUG_printf(" need_stack_settled; stack_size=%d\n", emit->stack_size);
|
||||||
need_reg_all(emit);
|
need_reg_all(emit);
|
||||||
|
@ -886,8 +886,9 @@ STATIC void need_stack_settled(emit_t *emit) {
|
||||||
if (si->kind == STACK_IMM) {
|
if (si->kind == STACK_IMM) {
|
||||||
DEBUG_printf(" imm(" INT_FMT ") to local(%u)\n", si->data.u_imm, emit->stack_start + i);
|
DEBUG_printf(" imm(" INT_FMT ") to local(%u)\n", si->data.u_imm, emit->stack_start + i);
|
||||||
si->kind = STACK_VALUE;
|
si->kind = STACK_VALUE;
|
||||||
si->vtype = load_reg_stack_imm(emit, REG_TEMP0, si, false);
|
// using REG_TEMP1 to avoid clobbering REG_TEMP0 (aka REG_RET)
|
||||||
emit_native_mov_state_reg(emit, emit->stack_start + i, REG_TEMP0);
|
si->vtype = load_reg_stack_imm(emit, REG_TEMP1, si, false);
|
||||||
|
emit_native_mov_state_reg(emit, emit->stack_start + i, REG_TEMP1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,3 +38,13 @@ def f(a):
|
||||||
|
|
||||||
f(False)
|
f(False)
|
||||||
f(True)
|
f(True)
|
||||||
|
|
||||||
|
|
||||||
|
# stack settling in branch
|
||||||
|
@micropython.native
|
||||||
|
def f(a):
|
||||||
|
print(1, 2, 3, 4 if a else 5)
|
||||||
|
|
||||||
|
|
||||||
|
f(False)
|
||||||
|
f(True)
|
||||||
|
|
|
@ -4,3 +4,5 @@
|
||||||
6
|
6
|
||||||
True
|
True
|
||||||
False
|
False
|
||||||
|
1 2 3 5
|
||||||
|
1 2 3 4
|
||||||
|
|
Loading…
Reference in New Issue