This is a slightly hackish Friday afternoon attempt to include the guest address in our out_asm output in an effort to make it a little easier to see what is generating what final assembly.
Signed-off-by: Alex Bennée <alex.ben...@linaro.org> --- accel/tcg/translate-all.c | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c index 9924e66d1f..31711de938 100644 --- a/accel/tcg/translate-all.c +++ b/accel/tcg/translate-all.c @@ -1789,14 +1789,42 @@ TranslationBlock *tb_gen_code(CPUState *cpu, if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM) && qemu_log_in_addr_range(tb->pc)) { FILE *logfile = qemu_log_lock(); + size_t code_size, data_size = 0; + size_t insn_start; + int insn = 0; qemu_log("OUT: [size=%d]\n", gen_code_size); if (tcg_ctx->data_gen_ptr) { - size_t code_size = tcg_ctx->data_gen_ptr - tb->tc.ptr; - size_t data_size = gen_code_size - code_size; - size_t i; + code_size = tcg_ctx->data_gen_ptr - tb->tc.ptr; + data_size = gen_code_size - code_size; + } else { + code_size = gen_code_size; + } + + /* first dump prologue */ + insn_start = tcg_ctx->gen_insn_end_off[0]; + if (insn_start > 0) { + qemu_log(" prologue: [size=%ld]\n", insn_start); + log_disas(tb->tc.ptr, insn_start); + } + + do { + size_t insn_end; + if (insn < (tb->icount - 1)) { + insn_end = tcg_ctx->gen_insn_end_off[insn + 1]; + } else { + insn_end = code_size; + } + qemu_log(" for guest addr: " TARGET_FMT_lx ":\n", + tcg_ctx->gen_insn_data[insn][0]); + + log_disas(tb->tc.ptr + insn_start, insn_end - insn_start); - log_disas(tb->tc.ptr, code_size); + insn_start = insn_end; + } while (++insn < tb->icount && insn_start < code_size); + if (data_size) { + int i; + qemu_log(" data: [size=%ld]\n", data_size); for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) { if (sizeof(tcg_target_ulong) == 8) { qemu_log("0x%08" PRIxPTR ": .quad 0x%016" PRIx64 "\n", @@ -1808,8 +1836,6 @@ TranslationBlock *tb_gen_code(CPUState *cpu, *(uint32_t *)(tcg_ctx->data_gen_ptr + i)); } } - } else { - log_disas(tb->tc.ptr, gen_code_size); } qemu_log("\n"); qemu_log_flush(); -- 2.20.1