On 07/10/2017 03:47 AM, Lluís Vilanova wrote:
Richard Henderson writes:
On 07/07/2017 07:18 AM, Lluís Vilanova wrote:
There was no code being generated after this specific case, but I haven't
checked if DISAS_EXC is set in any other place that is not immediately followed
by a "goto done_generating".
Typically we haven't actually done a goto, but simply exit the loop and emit
nothing within the final cleanup (tb_stop?).
The case handled by DISAS_SKIP ignores tb_stop() (the target code can simply
return when DISAS_EXC is found instead of DISAS_SKIP) *and* gen_io_end(); this
last one is never omitted when DISAS_EXC is found now, and theoretically
DISAS_EXC can be set by any target-specific hook. Thus my question if the
generic call to gen_io_end() should check for DISAS_EXC too (I have no idea if
it would be an error to call it with DISAS_EXC set, or whether it makes sense to
for a target to set it so that gen_io_start() is called but gen_io_end() is then
skipped by a DISAS_EXC set in ops->translate_insn()).
It is not an error to call gen_io_start when gen_io_end isn't called (or isn't
reached). There are many ways that can happen.
The reason that arm does the goto after the gen_exception for single-stepping
was simply convenience. Nothing would have gone wrong if it had used
dc->is_jmp = DISAS_EXC;
break;
instead.
r~