Fix table idx resolving in op call_indirect/return_call_indirect (#3726)

The table index in the call_indirect/return_call_indirect opcode should be
one byte 0x00 when ref-types/GC isn't enabled, and should be treated as
leb u32 when ref-types/GC is enabled.

And make aot compiler bail out if ref-types/GC is disabled by command line
argument while ref-types instructions are used.
This commit is contained in:
Wenyong Huang
2024-08-19 10:57:36 +08:00
committed by GitHub
parent 88caa0c53a
commit 97c95a2e2f
4 changed files with 30 additions and 8 deletions

View File

@ -7149,10 +7149,10 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
case WASM_OP_RETURN_CALL_INDIRECT:
#endif
skip_leb_uint32(p, p_end); /* typeidx */
#if WASM_ENABLE_REF_TYPES == 0 && WASM_ENABLE_GC == 0
u8 = read_uint8(p); /* 0x00 */
#else
#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0
skip_leb_uint32(p, p_end); /* tableidx */
#else
u8 = read_uint8(p); /* 0x00 */
#endif
break;
@ -12005,10 +12005,12 @@ re_scan:
read_leb_uint32(p, p_end, type_idx);
#if WASM_ENABLE_REF_TYPES != 0 || WASM_ENABLE_GC != 0
#if WASM_ENABLE_WAMR_COMPILER != 0
if (*p != 0x00) {
// Any non-0x00 byte requires the ref types proposal.
// This is different from checking the table_idx value
// since `0x80 0x00` etc. are all valid encodings of zero.
if (p + 1 < p_end && *p != 0x00) {
/*
* Any non-0x00 byte requires the ref types proposal.
* This is different from checking the table_idx value
* since `0x80 0x00` etc. are all valid encodings of zero.
*/
module->is_ref_types_used = true;
}
#endif