Wasm backend should implement its own disassember for Wasm
instructions.
Signed-off-by: Kohei Tokunaga <ktokunaga.mail@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