Skip to content

Commit

Permalink
target/sh4: Do not singlestep after exceptions
Browse files Browse the repository at this point in the history
If we've already raised an exception (and set NORETURN),
do not emit unreachable code to raise a debug exception.
Note that gen_goto_tb takes single-stepping into account.

Signed-off-by: Richard Henderson <rth@twiddle.net>
Message-Id: <20170907185057.23421-4-richard.henderson@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
  • Loading branch information
rth7680 authored and aurel32 committed Dec 18, 2017
1 parent 4834871 commit 34cf567
Showing 1 changed file with 16 additions and 16 deletions.
32 changes: 16 additions & 16 deletions target/sh4/translate.c
Expand Up @@ -270,6 +270,7 @@ static void gen_jump(DisasContext * ctx)
} else {
tcg_gen_lookup_and_goto_ptr();
}
ctx->bstate = DISAS_NORETURN;
} else {
gen_goto_tb(ctx, 0, ctx->delayed_pc);
}
Expand Down Expand Up @@ -2341,24 +2342,23 @@ void gen_intermediate_code(CPUState *cs, struct TranslationBlock *tb)
ctx.envflags &= ~GUSA_MASK;
}

if (cs->singlestep_enabled) {
switch (ctx.bstate) {
case DISAS_STOP:
gen_save_cpu_state(&ctx, true);
gen_helper_debug(cpu_env);
} else {
switch (ctx.bstate) {
case DISAS_STOP:
gen_save_cpu_state(&ctx, true);
if (cs->singlestep_enabled) {
gen_helper_debug(cpu_env);
} else {
tcg_gen_exit_tb(0);
break;
case DISAS_NEXT:
gen_save_cpu_state(&ctx, false);
gen_goto_tb(&ctx, 0, ctx.pc);
break;
case DISAS_NORETURN:
break;
default:
g_assert_not_reached();
}
}
break;
case DISAS_NEXT:
gen_save_cpu_state(&ctx, false);
gen_goto_tb(&ctx, 0, ctx.pc);
break;
case DISAS_NORETURN:
break;
default:
g_assert_not_reached();
}

gen_tb_end(tb, num_insns);
Expand Down

0 comments on commit 34cf567

Please sign in to comment.