From b39f4c5c9b5e0c7a0b08d4a1ce7b69fe429663be Mon Sep 17 00:00:00 2001 From: Xu Jun <693788454@qq.com> Date: Thu, 16 Jun 2022 09:51:01 +0800 Subject: [PATCH 1/2] Fix drop opcode issue in fast interpreter (#1231) Fix fast interpreter issue reported in #1230 --- core/iwasm/interpreter/wasm_loader.c | 22 +++++++++++++++++---- core/iwasm/interpreter/wasm_mini_loader.c | 24 ++++++++++++++++++----- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/core/iwasm/interpreter/wasm_loader.c b/core/iwasm/interpreter/wasm_loader.c index fecf75773..bc3cf1a89 100644 --- a/core/iwasm/interpreter/wasm_loader.c +++ b/core/iwasm/interpreter/wasm_loader.c @@ -6552,6 +6552,16 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, } #if WASM_ENABLE_FAST_INTERP != 0 + /* For the first traverse, the initial value of preserved_local_offset has + * not been determined, we use the INT16_MAX to represent that a slot has + * been copied to preserve space. For second traverse, this field will be + * set to the appropriate value in wasm_loader_ctx_reinit. + * This is for Issue #1230, + * https://github.com/bytecodealliance/wasm-micro-runtime/issues/1230, the + * drop opcodes need to know which slots are preserved, so those slots will + * not be treated as dynamically allocated slots */ + loader_ctx->preserved_local_offset = INT16_MAX; + re_scan: if (loader_ctx->code_compiled_size > 0) { if (!wasm_loader_ctx_reinit(loader_ctx)) { @@ -7209,8 +7219,10 @@ re_scan: #if WASM_ENABLE_FAST_INTERP != 0 skip_label(); loader_ctx->frame_offset--; - if (*(loader_ctx->frame_offset) - > loader_ctx->start_dynamic_offset) + if ((*(loader_ctx->frame_offset) + > loader_ctx->start_dynamic_offset) + && (*(loader_ctx->frame_offset) + < loader_ctx->max_dynamic_offset)) loader_ctx->dynamic_offset--; #endif } @@ -7223,8 +7235,10 @@ re_scan: #if WASM_ENABLE_FAST_INTERP != 0 skip_label(); loader_ctx->frame_offset -= 2; - if (*(loader_ctx->frame_offset) - > loader_ctx->start_dynamic_offset) + if ((*(loader_ctx->frame_offset) + > loader_ctx->start_dynamic_offset) + && (*(loader_ctx->frame_offset) + < loader_ctx->max_dynamic_offset)) loader_ctx->dynamic_offset -= 2; #endif } diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index f33adaf1c..e39b1af7e 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -4870,6 +4870,16 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func, } #if WASM_ENABLE_FAST_INTERP != 0 + /* For the first traverse, the initial value of preserved_local_offset has + * not been determined, we use the INT16_MAX to represent that a slot has + * been copied to preserve space. For second traverse, this field will be + * set to the appropriate value in wasm_loader_ctx_reinit. + * This is for Issue #1230, + * https://github.com/bytecodealliance/wasm-micro-runtime/issues/1230, the + * drop opcodes need to know which slots are preserved, so those slots will + * not be treated as dynamically allocated slots */ + loader_ctx->preserved_local_offset = INT16_MAX; + re_scan: if (loader_ctx->code_compiled_size > 0) { if (!wasm_loader_ctx_reinit(loader_ctx)) { @@ -5446,8 +5456,10 @@ re_scan: #if WASM_ENABLE_FAST_INTERP != 0 skip_label(); loader_ctx->frame_offset--; - if (*(loader_ctx->frame_offset) - > loader_ctx->start_dynamic_offset) + if ((*(loader_ctx->frame_offset) + > loader_ctx->start_dynamic_offset) + && (*(loader_ctx->frame_offset) + < loader_ctx->max_dynamic_offset)) loader_ctx->dynamic_offset--; #endif } @@ -5460,9 +5472,11 @@ re_scan: #if WASM_ENABLE_FAST_INTERP != 0 skip_label(); loader_ctx->frame_offset -= 2; - if (*(loader_ctx->frame_offset) - > loader_ctx->start_dynamic_offset) - loader_ctx->dynamic_offset -= 2; + if ((*(loader_ctx->frame_offset) + > loader_ctx->start_dynamic_offset) + && (*(loader_ctx->frame_offset) + < loader_ctx->max_dynamic_offset)) + loader_ctx->dynamic_offset--; #endif } else { From 188d5e70e9ab887685c99f808f6528d9f7e0d163 Mon Sep 17 00:00:00 2001 From: Xu Jun <693788454@qq.com> Date: Thu, 16 Jun 2022 12:07:32 +0800 Subject: [PATCH 2/2] Fix typo in wasm_mini_loader.c (#1232) --- core/iwasm/interpreter/wasm_mini_loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c index e39b1af7e..c7dc6ab8f 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c @@ -5476,7 +5476,7 @@ re_scan: > loader_ctx->start_dynamic_offset) && (*(loader_ctx->frame_offset) < loader_ctx->max_dynamic_offset)) - loader_ctx->dynamic_offset--; + loader_ctx->dynamic_offset -= 2; #endif } else {