Wasm backend should implement its own disassember for Wasm instructions. Signed-off-by: Kohei Tokunaga <ktokunaga.m...@gmail.com> --- tcg/wasm32.c | 243 +-------------------------------------------------- 1 file changed, 1 insertion(+), 242 deletions(-)
diff --git a/tcg/wasm32.c b/tcg/wasm32.c index 6de9b26b76..4bc53d76d0 100644 --- a/tcg/wasm32.c +++ b/tcg/wasm32.c @@ -831,246 +831,5 @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env, } /* - * Disassembler that matches the interpreter + * TODO: Disassembler is not implemented */ - -static const char *str_r(TCGReg r) -{ - static const char regs[TCG_TARGET_NB_REGS][4] = { - "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "r13", "env", "sp" - }; - - QEMU_BUILD_BUG_ON(TCG_AREG0 != TCG_REG_R14); - QEMU_BUILD_BUG_ON(TCG_REG_CALL_STACK != TCG_REG_R15); - - assert((unsigned)r < TCG_TARGET_NB_REGS); - return regs[r]; -} - -static const char *str_c(TCGCond c) -{ - static const char cond[16][8] = { - [TCG_COND_NEVER] = "never", - [TCG_COND_ALWAYS] = "always", - [TCG_COND_EQ] = "eq", - [TCG_COND_NE] = "ne", - [TCG_COND_LT] = "lt", - [TCG_COND_GE] = "ge", - [TCG_COND_LE] = "le", - [TCG_COND_GT] = "gt", - [TCG_COND_LTU] = "ltu", - [TCG_COND_GEU] = "geu", - [TCG_COND_LEU] = "leu", - [TCG_COND_GTU] = "gtu", - [TCG_COND_TSTEQ] = "tsteq", - [TCG_COND_TSTNE] = "tstne", - }; - - assert((unsigned)c < ARRAY_SIZE(cond)); - assert(cond[c][0] != 0); - return cond[c]; -} - -/* Disassemble TCI bytecode. */ -int print_insn_tci(bfd_vma addr, disassemble_info *info) -{ - const uint32_t *tb_ptr = (const void *)(uintptr_t)addr; - const TCGOpDef *def; - const char *op_name; - uint32_t insn; - TCGOpcode op; - TCGReg r0, r1, r2, r3, r4; - tcg_target_ulong i1; - int32_t s2; - TCGCond c; - MemOpIdx oi; - uint8_t pos, len; - void *ptr; - - /* TCI is always the host, so we don't need to load indirect. */ - insn = *tb_ptr++; - - info->fprintf_func(info->stream, "%08x ", insn); - - op = extract32(insn, 0, 8); - def = &tcg_op_defs[op]; - op_name = def->name; - - switch (op) { - case INDEX_op_br: - case INDEX_op_exit_tb: - case INDEX_op_goto_tb: - tci_args_l(insn, tb_ptr, &ptr); - info->fprintf_func(info->stream, "%-12s %p", op_name, ptr); - break; - - case INDEX_op_goto_ptr: - tci_args_r(insn, &r0); - info->fprintf_func(info->stream, "%-12s %s", op_name, str_r(r0)); - break; - - case INDEX_op_call: - tci_args_nl(insn, tb_ptr, &len, &ptr); - info->fprintf_func(info->stream, "%-12s %d, %p", op_name, len, ptr); - break; - - case INDEX_op_brcond: - tci_args_rl(insn, tb_ptr, &r0, &ptr); - info->fprintf_func(info->stream, "%-12s %s, 0, ne, %p", - op_name, str_r(r0), ptr); - break; - - case INDEX_op_setcond: - case INDEX_op_tci_setcond32: - tci_args_rrrc(insn, &r0, &r1, &r2, &c); - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s", - op_name, str_r(r0), str_r(r1), str_r(r2), str_c(c)); - break; - - case INDEX_op_tci_movi: - tci_args_ri(insn, &r0, &i1); - info->fprintf_func(info->stream, "%-12s %s, 0x%" TCG_PRIlx, - op_name, str_r(r0), i1); - break; - - case INDEX_op_tci_movl: - tci_args_rl(insn, tb_ptr, &r0, &ptr); - info->fprintf_func(info->stream, "%-12s %s, %p", - op_name, str_r(r0), ptr); - break; - - case INDEX_op_tci_setcarry: - info->fprintf_func(info->stream, "%-12s", op_name); - break; - - case INDEX_op_ld8u: - case INDEX_op_ld8s: - case INDEX_op_ld16u: - case INDEX_op_ld16s: - case INDEX_op_ld32u: - case INDEX_op_ld: - case INDEX_op_st8: - case INDEX_op_st16: - case INDEX_op_st32: - case INDEX_op_st: - tci_args_rrs(insn, &r0, &r1, &s2); - info->fprintf_func(info->stream, "%-12s %s, %s, %d", - op_name, str_r(r0), str_r(r1), s2); - break; - - case INDEX_op_bswap16: - case INDEX_op_bswap32: - case INDEX_op_ctpop: - case INDEX_op_mov: - case INDEX_op_neg: - case INDEX_op_not: - case INDEX_op_ext_i32_i64: - case INDEX_op_extu_i32_i64: - case INDEX_op_bswap64: - tci_args_rr(insn, &r0, &r1); - info->fprintf_func(info->stream, "%-12s %s, %s", - op_name, str_r(r0), str_r(r1)); - break; - - case INDEX_op_add: - case INDEX_op_addci: - case INDEX_op_addcio: - case INDEX_op_addco: - case INDEX_op_and: - case INDEX_op_andc: - case INDEX_op_clz: - case INDEX_op_ctz: - case INDEX_op_divs: - case INDEX_op_divu: - case INDEX_op_eqv: - case INDEX_op_mul: - case INDEX_op_nand: - case INDEX_op_nor: - case INDEX_op_or: - case INDEX_op_orc: - case INDEX_op_rems: - case INDEX_op_remu: - case INDEX_op_rotl: - case INDEX_op_rotr: - case INDEX_op_sar: - case INDEX_op_shl: - case INDEX_op_shr: - case INDEX_op_sub: - case INDEX_op_subbi: - case INDEX_op_subbio: - case INDEX_op_subbo: - case INDEX_op_xor: - case INDEX_op_tci_ctz32: - case INDEX_op_tci_clz32: - case INDEX_op_tci_divs32: - case INDEX_op_tci_divu32: - case INDEX_op_tci_rems32: - case INDEX_op_tci_remu32: - case INDEX_op_tci_rotl32: - case INDEX_op_tci_rotr32: - tci_args_rrr(insn, &r0, &r1, &r2); - info->fprintf_func(info->stream, "%-12s %s, %s, %s", - op_name, str_r(r0), str_r(r1), str_r(r2)); - break; - - case INDEX_op_deposit: - tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len); - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %d, %d", - op_name, str_r(r0), str_r(r1), str_r(r2), pos, len); - break; - - case INDEX_op_extract: - case INDEX_op_sextract: - tci_args_rrbb(insn, &r0, &r1, &pos, &len); - info->fprintf_func(info->stream, "%-12s %s,%s,%d,%d", - op_name, str_r(r0), str_r(r1), pos, len); - break; - - case INDEX_op_tci_movcond32: - case INDEX_op_movcond: - case INDEX_op_setcond2_i32: - tci_args_rrrrrc(insn, &r0, &r1, &r2, &r3, &r4, &c); - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s, %s, %s", - op_name, str_r(r0), str_r(r1), str_r(r2), - str_r(r3), str_r(r4), str_c(c)); - break; - - case INDEX_op_muls2: - case INDEX_op_mulu2: - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s", - op_name, str_r(r0), str_r(r1), - str_r(r2), str_r(r3)); - break; - - case INDEX_op_qemu_ld: - case INDEX_op_qemu_st: - tci_args_rrm(insn, &r0, &r1, &oi); - info->fprintf_func(info->stream, "%-12s %s, %s, %x", - op_name, str_r(r0), str_r(r1), oi); - break; - - case INDEX_op_qemu_ld2: - case INDEX_op_qemu_st2: - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s", - op_name, str_r(r0), str_r(r1), - str_r(r2), str_r(r3)); - break; - - case 0: - /* tcg_out_nop_fill uses zeros */ - if (insn == 0) { - info->fprintf_func(info->stream, "align"); - break; - } - /* fall through */ - - default: - info->fprintf_func(info->stream, "illegal opcode %d", op); - break; - } - - return sizeof(insn); -} -- 2.43.0