bytecodealliance / wasm-micro-runtime

WebAssembly Micro Runtime (WAMR)
Apache License 2.0
4.93k stars 624 forks source link

dump translated bytecode for fast interpreter #3185

Open yamt opened 8 months ago

yamt commented 8 months ago

for debugging etc, it would be great to have a way to dump translated bytecode in a human readable format. i feel WASM_DEBUG_PREPROCESSOR is a bit too primitive.

wenyongh commented 8 months ago

Hi, it may be a little complex to dump the pre-compiled bytecode with well-formed human readable format, is it good to dump the opcode mnemonics instead of the hex value? Here is the patch:

diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c
index 8bf2ed92..2a713f3a 100644
--- a/core/iwasm/interpreter/wasm_loader.c
+++ b/core/iwasm/interpreter/wasm_loader.c
@@ -7604,6 +7604,9 @@ fail:
 #if WASM_ENABLE_FAST_INTERP != 0

 #if WASM_DEBUG_PREPROCESSOR != 0
+#define HANDLE_OPCODE(opcode) #opcode
+DEFINE_GOTO_TABLE(const char *, opcode_names);
+#undef HANDLE_OPCODE
 #define LOG_OP(...) os_printf(__VA_ARGS__)
 #else
 #define LOG_OP(...) (void)0
@@ -8514,7 +8517,7 @@ fail:
 #define emit_label(opcode)                                      \
     do {                                                        \
         wasm_loader_emit_ptr(loader_ctx, handle_table[opcode]); \
-        LOG_OP("\nemit_op [%02x]\t", opcode);                   \
+        LOG_OP("\nemit_op [%s]\t", opcode_names[opcode]);       \
     } while (0)
 #define skip_label()                                            \
     do {                                                        \

And the output is like:

Processing func | [0] params | [0] locals | [0] return

emit_op [WASM_OP_END]
delete last op

emit_op [WASM_OP_RETURN]
emit_op [WASM_OP_END]
delete last op

emit_op [WASM_OP_RETURN]
Processing func | [0] params | [4] locals | [0] return

emit_op [WASM_OP_GET_GLOBAL]    0   4
emit_op [WASM_OP_I32_CONST]
delete last op
#### new const [1]: 16

emit_op [WASM_OP_I32_SUB]   -1  4   5
emit_op [WASM_OP_TEE_LOCAL]
delete last op

emit_op [EXT_OP_TEE_LOCAL_FAST] 0   5
emit_op [WASM_OP_SET_GLOBAL]    0   5
emit_op [WASM_OP_CALL]  47
emit_op [WASM_OP_I32_CONST]
delete last op
#### new const [2]: 3

emit_op [WASM_OP_SET_LOCAL]
delete last op
yamt commented 8 months ago

is it good to dump the opcode mnemonics instead of the hex value?

yes, it's nice. i'm also thinking to process "delete last op" automatically by having a one-line buffer.