target-sparc: Fix -singlestep.
Single-stepping was not properly updating npc, resulting in some instructions being executed twice. In addition, we were emitting dead code at the end of the TB. Fix both by teaching gen_goto_tb to avoid goto_tb for single-step and removing the special-case code in gen_intermediate_code_internal. Signed-off-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
a303f9e37b
commit
060718c194
|
@ -79,6 +79,7 @@ typedef struct DisasContext {
|
||||||
int mem_idx;
|
int mem_idx;
|
||||||
int fpu_enabled;
|
int fpu_enabled;
|
||||||
int address_mask_32bit;
|
int address_mask_32bit;
|
||||||
|
int singlestep;
|
||||||
uint32_t cc_op; /* current CC operation */
|
uint32_t cc_op; /* current CC operation */
|
||||||
struct TranslationBlock *tb;
|
struct TranslationBlock *tb;
|
||||||
sparc_def_t *def;
|
sparc_def_t *def;
|
||||||
|
@ -234,7 +235,8 @@ static inline void gen_goto_tb(DisasContext *s, int tb_num,
|
||||||
|
|
||||||
tb = s->tb;
|
tb = s->tb;
|
||||||
if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) &&
|
if ((pc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) &&
|
||||||
(npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK)) {
|
(npc & TARGET_PAGE_MASK) == (tb->pc & TARGET_PAGE_MASK) &&
|
||||||
|
!s->singlestep) {
|
||||||
/* jump to same page: we can use a direct jump */
|
/* jump to same page: we can use a direct jump */
|
||||||
tcg_gen_goto_tb(tb_num);
|
tcg_gen_goto_tb(tb_num);
|
||||||
tcg_gen_movi_tl(cpu_pc, pc);
|
tcg_gen_movi_tl(cpu_pc, pc);
|
||||||
|
@ -4694,6 +4696,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
|
||||||
#ifdef TARGET_SPARC64
|
#ifdef TARGET_SPARC64
|
||||||
dc->address_mask_32bit = env->pstate & PS_AM;
|
dc->address_mask_32bit = env->pstate & PS_AM;
|
||||||
#endif
|
#endif
|
||||||
|
dc->singlestep = (env->singlestep_enabled || singlestep);
|
||||||
gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
|
gen_opc_end = gen_opc_buf + OPC_MAX_SIZE;
|
||||||
|
|
||||||
cpu_tmp0 = tcg_temp_new();
|
cpu_tmp0 = tcg_temp_new();
|
||||||
|
@ -4754,9 +4757,7 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
|
||||||
break;
|
break;
|
||||||
/* if single step mode, we generate only one instruction and
|
/* if single step mode, we generate only one instruction and
|
||||||
generate an exception */
|
generate an exception */
|
||||||
if (env->singlestep_enabled || singlestep) {
|
if (dc->singlestep) {
|
||||||
tcg_gen_movi_tl(cpu_pc, dc->pc);
|
|
||||||
tcg_gen_exit_tb(0);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while ((gen_opc_ptr < gen_opc_end) &&
|
} while ((gen_opc_ptr < gen_opc_end) &&
|
||||||
|
|
Loading…
Reference in a new issue