Fix issues found by GC and Fast JIT, refine some codes (#1055)

Fix handle OP_TABLE_COPY issue
Fix loader handle OP_BLOCK/IF/LOOP issue if type_index is larger than 256
Fix loader handle OP_GET_GLOBAL, allow to change to GET_GLOBAL_64 for
aot compiler similiar to handling OP_SET_GLOBAL
Refine loader handle OP_GET/SET/TEE_LOCAL, disable changing opcode when
source debugging is enabled, so as no need to record the change of opcode
Refine wasm_interp_interp_frame_size to reduce the wasm operand stack usage

Signed-off-by: Wenyong Huang <wenyong.huang@intel.com>
This commit is contained in:
Wenyong Huang 2022-03-24 14:14:42 +08:00 committed by GitHub
parent b6e5206e61
commit 7262aebf77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 29 additions and 59 deletions

View File

@ -2819,8 +2819,8 @@ aot_table_copy(AOTModuleInstance *module_inst, uint32 src_tbl_idx,
dst_tbl_inst = aot_get_table_inst(module_inst, dst_tbl_idx); dst_tbl_inst = aot_get_table_inst(module_inst, dst_tbl_idx);
bh_assert(dst_tbl_inst); bh_assert(dst_tbl_inst);
if ((uint64)src_offset + length > dst_tbl_inst->cur_size if ((uint64)dst_offset + length > dst_tbl_inst->cur_size
|| (uint64)dst_offset + length > src_tbl_inst->cur_size) { || (uint64)src_offset + length > src_tbl_inst->cur_size) {
aot_set_exception_with_id(module_inst, EXCE_OUT_OF_BOUNDS_TABLE_ACCESS); aot_set_exception_with_id(module_inst, EXCE_OUT_OF_BOUNDS_TABLE_ACCESS);
return; return;
} }

View File

@ -489,6 +489,7 @@ aot_compile_func(AOTCompContext *comp_ctx, uint32 func_index)
break; break;
case WASM_OP_GET_GLOBAL: case WASM_OP_GET_GLOBAL:
case WASM_OP_GET_GLOBAL_64:
read_leb_uint32(frame_ip, frame_ip_end, global_idx); read_leb_uint32(frame_ip, frame_ip_end, global_idx);
if (!aot_compile_op_get_global(comp_ctx, func_ctx, global_idx)) if (!aot_compile_op_get_global(comp_ctx, func_ctx, global_idx))
return false; return false;

View File

@ -68,8 +68,14 @@ typedef struct WASMInterpFrame {
static inline unsigned static inline unsigned
wasm_interp_interp_frame_size(unsigned all_cell_num) wasm_interp_interp_frame_size(unsigned all_cell_num)
{ {
return align_uint((uint32)offsetof(WASMInterpFrame, lp) + all_cell_num * 5, unsigned frame_size;
4);
#if WASM_ENABLE_FAST_INTERP == 0
frame_size = (uint32)offsetof(WASMInterpFrame, lp) + all_cell_num * 4;
#else
frame_size = (uint32)offsetof(WASMInterpFrame, operand) + all_cell_num * 4;
#endif
return align_uint(frame_size, 4);
} }
void void

View File

@ -3067,8 +3067,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
s = (uint32)POP_I32(); s = (uint32)POP_I32();
d = (uint32)POP_I32(); d = (uint32)POP_I32();
if (s + n > dst_tbl_inst->cur_size if (d + n > dst_tbl_inst->cur_size
|| d + n > src_tbl_inst->cur_size) { || s + n > src_tbl_inst->cur_size) {
wasm_set_exception(module, wasm_set_exception(module,
"out of bounds table access"); "out of bounds table access");
goto got_exception; goto got_exception;

View File

@ -2984,8 +2984,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
s = (uint32)POP_I32(); s = (uint32)POP_I32();
d = (uint32)POP_I32(); d = (uint32)POP_I32();
if (s + n > dst_tbl_inst->cur_size if (d + n > dst_tbl_inst->cur_size
|| d + n > src_tbl_inst->cur_size) { || s + n > src_tbl_inst->cur_size) {
wasm_set_exception(module, wasm_set_exception(module,
"out of bounds table access"); "out of bounds table access");
goto got_exception; goto got_exception;

View File

@ -6414,6 +6414,7 @@ re_scan:
uint8 value_type; uint8 value_type;
BlockType block_type; BlockType block_type;
p_org = p - 1;
value_type = read_uint8(p); value_type = read_uint8(p);
if (is_byte_a_type(value_type)) { if (is_byte_a_type(value_type)) {
/* If the first byte is one of these special values: /* If the first byte is one of these special values:
@ -6441,9 +6442,9 @@ re_scan:
* the block quickly. * the block quickly.
*/ */
#if WASM_ENABLE_DEBUG_INTERP != 0 #if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p - 2, *(p - 2)); record_fast_op(module, p_org, *p_org);
#endif #endif
*(p - 2) = EXT_OP_BLOCK + (opcode - WASM_OP_BLOCK); *p_org = EXT_OP_BLOCK + (opcode - WASM_OP_BLOCK);
#endif #endif
} }
@ -7309,33 +7310,22 @@ re_scan:
operand_offset = local_offset; operand_offset = local_offset;
PUSH_OFFSET_TYPE(local_type); PUSH_OFFSET_TYPE(local_type);
#else #else
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) #if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) \
&& (WASM_ENABLE_DEBUG_INTERP == 0)
if (local_offset < 0x80) { if (local_offset < 0x80) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = EXT_OP_GET_LOCAL_FAST; *p_org++ = EXT_OP_GET_LOCAL_FAST;
if (is_32bit_type(local_type)) { if (is_32bit_type(local_type)) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)local_offset; *p_org++ = (uint8)local_offset;
} }
else { else {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)(local_offset | 0x80); *p_org++ = (uint8)(local_offset | 0x80);
} }
while (p_org < p) { while (p_org < p) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = WASM_OP_NOP; *p_org++ = WASM_OP_NOP;
} }
} }
#endif #endif
#endif #endif /* end of WASM_ENABLE_FAST_INTERP != 0 */
break; break;
} }
@ -7384,33 +7374,22 @@ re_scan:
POP_OFFSET_TYPE(local_type); POP_OFFSET_TYPE(local_type);
} }
#else #else
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) #if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) \
&& (WASM_ENABLE_DEBUG_INTERP == 0)
if (local_offset < 0x80) { if (local_offset < 0x80) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = EXT_OP_SET_LOCAL_FAST; *p_org++ = EXT_OP_SET_LOCAL_FAST;
if (is_32bit_type(local_type)) { if (is_32bit_type(local_type)) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)local_offset; *p_org++ = (uint8)local_offset;
} }
else { else {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)(local_offset | 0x80); *p_org++ = (uint8)(local_offset | 0x80);
} }
while (p_org < p) { while (p_org < p) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = WASM_OP_NOP; *p_org++ = WASM_OP_NOP;
} }
} }
#endif #endif
#endif #endif /* end of WASM_ENABLE_FAST_INTERP != 0 */
break; break;
} }
@ -7455,33 +7434,22 @@ re_scan:
*(loader_ctx->frame_offset *(loader_ctx->frame_offset
- wasm_value_type_cell_num(local_type))); - wasm_value_type_cell_num(local_type)));
#else #else
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) #if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0) \
&& (WASM_ENABLE_DEBUG_INTERP == 0)
if (local_offset < 0x80) { if (local_offset < 0x80) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = EXT_OP_TEE_LOCAL_FAST; *p_org++ = EXT_OP_TEE_LOCAL_FAST;
if (is_32bit_type(local_type)) { if (is_32bit_type(local_type)) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)local_offset; *p_org++ = (uint8)local_offset;
} }
else { else {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = (uint8)(local_offset | 0x80); *p_org++ = (uint8)(local_offset | 0x80);
} }
while (p_org < p) { while (p_org < p) {
#if WASM_ENABLE_DEBUG_INTERP != 0
record_fast_op(module, p_org, *p_org);
#endif
*p_org++ = WASM_OP_NOP; *p_org++ = WASM_OP_NOP;
} }
} }
#endif #endif
#endif #endif /* end of WASM_ENABLE_FAST_INTERP != 0 */
break; break;
} }
@ -7505,7 +7473,6 @@ re_scan:
PUSH_TYPE(global_type); PUSH_TYPE(global_type);
#if WASM_ENABLE_FAST_INTERP == 0 #if WASM_ENABLE_FAST_INTERP == 0
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0)
if (global_type == VALUE_TYPE_I64 if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) { || global_type == VALUE_TYPE_F64) {
#if WASM_ENABLE_DEBUG_INTERP != 0 #if WASM_ENABLE_DEBUG_INTERP != 0
@ -7513,7 +7480,6 @@ re_scan:
#endif #endif
*p_org = WASM_OP_GET_GLOBAL_64; *p_org = WASM_OP_GET_GLOBAL_64;
} }
#endif
#else /* else of WASM_ENABLE_FAST_INTERP */ #else /* else of WASM_ENABLE_FAST_INTERP */
if (global_type == VALUE_TYPE_I64 if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) { || global_type == VALUE_TYPE_F64) {

View File

@ -4813,6 +4813,7 @@ re_scan:
uint8 value_type; uint8 value_type;
BlockType block_type; BlockType block_type;
p_org = p - 1;
value_type = read_uint8(p); value_type = read_uint8(p);
if (is_byte_a_type(value_type)) { if (is_byte_a_type(value_type)) {
/* If the first byte is one of these special values: /* If the first byte is one of these special values:
@ -4835,7 +4836,7 @@ re_scan:
* to new extended opcode so that interpreter can resolve * to new extended opcode so that interpreter can resolve
* the block quickly. * the block quickly.
*/ */
*(p - 2) = EXT_OP_BLOCK + (opcode - WASM_OP_BLOCK); *p_org = EXT_OP_BLOCK + (opcode - WASM_OP_BLOCK);
#endif #endif
} }
@ -5744,12 +5745,10 @@ re_scan:
PUSH_TYPE(global_type); PUSH_TYPE(global_type);
#if WASM_ENABLE_FAST_INTERP == 0 #if WASM_ENABLE_FAST_INTERP == 0
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0)
if (global_type == VALUE_TYPE_I64 if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) { || global_type == VALUE_TYPE_F64) {
*p_org = WASM_OP_GET_GLOBAL_64; *p_org = WASM_OP_GET_GLOBAL_64;
} }
#endif
#else /* else of WASM_ENABLE_FAST_INTERP */ #else /* else of WASM_ENABLE_FAST_INTERP */
if (is_64bit_type(global_type)) { if (is_64bit_type(global_type)) {
skip_label(); skip_label();
@ -5789,7 +5788,6 @@ re_scan:
POP_TYPE(global_type); POP_TYPE(global_type);
#if WASM_ENABLE_FAST_INTERP == 0 #if WASM_ENABLE_FAST_INTERP == 0
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0)
if (is_64bit_type(global_type)) { if (is_64bit_type(global_type)) {
*p_org = WASM_OP_SET_GLOBAL_64; *p_org = WASM_OP_SET_GLOBAL_64;
} }
@ -5797,7 +5795,6 @@ re_scan:
&& global_idx == module->aux_stack_top_global_index) { && global_idx == module->aux_stack_top_global_index) {
*p_org = WASM_OP_SET_GLOBAL_AUX_STACK; *p_org = WASM_OP_SET_GLOBAL_AUX_STACK;
} }
#endif
#else /* else of WASM_ENABLE_FAST_INTERP */ #else /* else of WASM_ENABLE_FAST_INTERP */
if (is_64bit_type(global_type)) { if (is_64bit_type(global_type)) {
skip_label(); skip_label();