From 37d9a95912c3cfd7d84398a6c0491d8b23ba0621 Mon Sep 17 00:00:00 2001 From: eloparco Date: Sat, 18 Feb 2023 22:51:52 +0000 Subject: [PATCH 1/7] fix: fix data races --- core/iwasm/common/wasm_memory.c | 59 +++- core/iwasm/common/wasm_shared_memory.c | 31 +- core/iwasm/interpreter/wasm_opcode.h | 448 ++++++++++++------------- 3 files changed, 295 insertions(+), 243 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 0aa2d6415c..7f0bc7f9f9 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -16,6 +16,7 @@ typedef enum Memory_Mode { } Memory_Mode; static Memory_Mode memory_mode = MEMORY_MODE_UNKNOWN; +static korp_mutex mem_mode_lock; static mem_allocator_t pool_allocator = NULL; @@ -39,7 +40,9 @@ wasm_memory_init_with_pool(void *mem, unsigned int bytes) mem_allocator_t _allocator = mem_allocator_create(mem, bytes); if (_allocator) { + os_mutex_lock(&mem_mode_lock); memory_mode = MEMORY_MODE_POOL; + os_mutex_unlock(&mem_mode_lock); pool_allocator = _allocator; global_pool_size = bytes; return true; @@ -54,7 +57,9 @@ wasm_memory_init_with_allocator(void *_user_data, void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { + os_mutex_lock(&mem_mode_lock); memory_mode = MEMORY_MODE_ALLOCATOR; + os_mutex_unlock(&mem_mode_lock); allocator_user_data = _user_data; malloc_func = _malloc_func; realloc_func = _realloc_func; @@ -71,7 +76,9 @@ wasm_memory_init_with_allocator(void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { + os_mutex_lock(&mem_mode_lock); memory_mode = MEMORY_MODE_ALLOCATOR; + os_mutex_unlock(&mem_mode_lock); malloc_func = _malloc_func; realloc_func = _realloc_func; free_func = _free_func; @@ -106,7 +113,9 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, #endif } else if (mem_alloc_type == Alloc_With_System_Allocator) { + os_mutex_lock(&mem_mode_lock); memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR; + os_mutex_unlock(&mem_mode_lock); return true; } else { @@ -117,7 +126,11 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, void wasm_runtime_memory_destroy() { - if (memory_mode == MEMORY_MODE_POOL) { + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_POOL) { #if BH_ENABLE_GC_VERIFY == 0 (void)mem_allocator_destroy(pool_allocator); #else @@ -128,13 +141,19 @@ wasm_runtime_memory_destroy() } #endif } + os_mutex_lock(&mem_mode_lock); memory_mode = MEMORY_MODE_UNKNOWN; + os_mutex_unlock(&mem_mode_lock); } unsigned wasm_runtime_memory_pool_size() { - if (memory_mode == MEMORY_MODE_POOL) + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_POOL) return global_pool_size; else return UINT32_MAX; @@ -143,15 +162,19 @@ wasm_runtime_memory_pool_size() static inline void * wasm_runtime_malloc_internal(unsigned int size) { - if (memory_mode == MEMORY_MODE_UNKNOWN) { + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_malloc failed: memory hasn't been initialize.\n"); return NULL; } - else if (memory_mode == MEMORY_MODE_POOL) { + else if (mem_mode == MEMORY_MODE_POOL) { return mem_allocator_malloc(pool_allocator, size); } - else if (memory_mode == MEMORY_MODE_ALLOCATOR) { + else if (mem_mode == MEMORY_MODE_ALLOCATOR) { #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 return malloc_func(allocator_user_data, size); #else @@ -166,15 +189,19 @@ wasm_runtime_malloc_internal(unsigned int size) static inline void * wasm_runtime_realloc_internal(void *ptr, unsigned int size) { - if (memory_mode == MEMORY_MODE_UNKNOWN) { + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_realloc failed: memory hasn't been initialize.\n"); return NULL; } - else if (memory_mode == MEMORY_MODE_POOL) { + else if (mem_mode == MEMORY_MODE_POOL) { return mem_allocator_realloc(pool_allocator, ptr, size); } - else if (memory_mode == MEMORY_MODE_ALLOCATOR) { + else if (mem_mode == MEMORY_MODE_ALLOCATOR) { if (realloc_func) #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 return realloc_func(allocator_user_data, ptr, size); @@ -200,14 +227,18 @@ wasm_runtime_free_internal(void *ptr) return; } - if (memory_mode == MEMORY_MODE_UNKNOWN) { + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING("warning: wasm_runtime_free failed: " "memory hasn't been initialize.\n"); } - else if (memory_mode == MEMORY_MODE_POOL) { + else if (mem_mode == MEMORY_MODE_POOL) { mem_allocator_free(pool_allocator, ptr); } - else if (memory_mode == MEMORY_MODE_ALLOCATOR) { + else if (mem_mode == MEMORY_MODE_ALLOCATOR) { #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 free_func(allocator_user_data, ptr); #else @@ -249,7 +280,11 @@ wasm_runtime_free(void *ptr) bool wasm_runtime_get_mem_alloc_info(mem_alloc_info_t *mem_alloc_info) { - if (memory_mode == MEMORY_MODE_POOL) { + os_mutex_lock(&mem_mode_lock); + Memory_Mode mem_mode = memory_mode; + os_mutex_unlock(&mem_mode_lock); + + if (mem_mode == MEMORY_MODE_POOL) { return mem_allocator_get_alloc_info(pool_allocator, mem_alloc_info); } return false; diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 3a9c1f5999..0e38ac583f 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -157,13 +157,13 @@ int32 shared_memory_inc_reference(WASMModuleCommon *module) { WASMSharedMemNode *node = search_module(module); + uint32 ref_count = -1; if (node) { os_mutex_lock(&node->lock); - node->ref_count++; + ref_count = node->ref_count++; os_mutex_unlock(&node->lock); - return node->ref_count; } - return -1; + return ref_count; } int32 @@ -417,8 +417,14 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, os_mutex_lock(&wait_info->wait_list_lock); - if ((!wait64 && *(uint32 *)address != (uint32)expect) - || (wait64 && *(uint64 *)address != expect)) { + WASMSharedMemNode *node = + search_module((WASMModuleCommon *)module_inst->module); + os_mutex_lock(&node->shared_mem_lock); + bool no_wait = (!wait64 && *(uint32 *)address != (uint32)expect) + || (wait64 && *(uint64 *)address != expect); + os_mutex_unlock(&node->shared_mem_lock); + + if (no_wait) { os_mutex_unlock(&wait_info->wait_list_lock); return 1; } @@ -476,7 +482,9 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, wasm_runtime_free(wait_node); os_mutex_unlock(&wait_info->wait_list_lock); + os_mutex_lock(&node->shared_mem_lock); release_wait_info(wait_map, wait_info, address); + os_mutex_unlock(&node->shared_mem_lock); (void)check_ret; return is_timeout ? 2 : 0; @@ -493,13 +501,22 @@ wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, bh_assert(module->module_type == Wasm_Module_Bytecode || module->module_type == Wasm_Module_AoT); - if ((uint8 *)address < module_inst->memories[0]->memory_data - || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end) { + WASMSharedMemNode *node = + search_module((WASMModuleCommon *)module_inst->module); + os_mutex_lock(&node->shared_mem_lock); + bool out_of_bounds = + ((uint8 *)address < module_inst->memories[0]->memory_data + || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end); + os_mutex_unlock(&node->shared_mem_lock); + + if (out_of_bounds) { wasm_runtime_set_exception(module, "out of bounds memory access"); return -1; } + os_mutex_lock(&node->shared_mem_lock); wait_info = acquire_wait_info(address, false); + os_mutex_unlock(&node->shared_mem_lock); /* Nobody wait on this address */ if (!wait_info) diff --git a/core/iwasm/interpreter/wasm_opcode.h b/core/iwasm/interpreter/wasm_opcode.h index cd7478a6b9..721b9d580a 100644 --- a/core/iwasm/interpreter/wasm_opcode.h +++ b/core/iwasm/interpreter/wasm_opcode.h @@ -686,230 +686,230 @@ typedef enum WASMAtomicEXTOpcode { */ #define WASM_INSTRUCTION_NUM 256 -#define DEFINE_GOTO_TABLE(type, _name) \ - static type _name[WASM_INSTRUCTION_NUM] = { \ - HANDLE_OPCODE(WASM_OP_UNREACHABLE), /* 0x00 */ \ - HANDLE_OPCODE(WASM_OP_NOP), /* 0x01 */ \ - HANDLE_OPCODE(WASM_OP_BLOCK), /* 0x02 */ \ - HANDLE_OPCODE(WASM_OP_LOOP), /* 0x03 */ \ - HANDLE_OPCODE(WASM_OP_IF), /* 0x04 */ \ - HANDLE_OPCODE(WASM_OP_ELSE), /* 0x05 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x06), /* 0x06 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x07), /* 0x07 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x08), /* 0x08 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x09), /* 0x09 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x0a), /* 0x0a */ \ - HANDLE_OPCODE(WASM_OP_END), /* 0x0b */ \ - HANDLE_OPCODE(WASM_OP_BR), /* 0x0c */ \ - HANDLE_OPCODE(WASM_OP_BR_IF), /* 0x0d */ \ - HANDLE_OPCODE(WASM_OP_BR_TABLE), /* 0x0e */ \ - HANDLE_OPCODE(WASM_OP_RETURN), /* 0x0f */ \ - HANDLE_OPCODE(WASM_OP_CALL), /* 0x10 */ \ - HANDLE_OPCODE(WASM_OP_CALL_INDIRECT), /* 0x11 */ \ - HANDLE_OPCODE(WASM_OP_RETURN_CALL), /* 0x12 */ \ - HANDLE_OPCODE(WASM_OP_RETURN_CALL_INDIRECT), /* 0x13 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x14), /* 0x14 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x15), /* 0x15 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x16), /* 0x16 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x17), /* 0x17 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x18), /* 0x18 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x19), /* 0x19 */ \ - HANDLE_OPCODE(WASM_OP_DROP), /* 0x1a */ \ - HANDLE_OPCODE(WASM_OP_SELECT), /* 0x1b */ \ - HANDLE_OPCODE(WASM_OP_SELECT_T), /* 0x1c */ \ - HANDLE_OPCODE(WASM_OP_GET_GLOBAL_64), /* 0x1d */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL_64), /* 0x1e */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL_AUX_STACK), /* 0x1f */ \ - HANDLE_OPCODE(WASM_OP_GET_LOCAL), /* 0x20 */ \ - HANDLE_OPCODE(WASM_OP_SET_LOCAL), /* 0x21 */ \ - HANDLE_OPCODE(WASM_OP_TEE_LOCAL), /* 0x22 */ \ - HANDLE_OPCODE(WASM_OP_GET_GLOBAL), /* 0x23 */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL), /* 0x24 */ \ - HANDLE_OPCODE(WASM_OP_TABLE_GET), /* 0x25 */ \ - HANDLE_OPCODE(WASM_OP_TABLE_SET), /* 0x26 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x27), /* 0x27 */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD), /* 0x28 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD), /* 0x29 */ \ - HANDLE_OPCODE(WASM_OP_F32_LOAD), /* 0x2a */ \ - HANDLE_OPCODE(WASM_OP_F64_LOAD), /* 0x2b */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD8_S), /* 0x2c */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD8_U), /* 0x2d */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD16_S), /* 0x2e */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD16_U), /* 0x2f */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD8_S), /* 0x30 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD8_U), /* 0x31 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD16_S), /* 0x32 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD16_U), /* 0x33 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD32_S), /* 0x34 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD32_U), /* 0x35 */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE), /* 0x36 */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE), /* 0x37 */ \ - HANDLE_OPCODE(WASM_OP_F32_STORE), /* 0x38 */ \ - HANDLE_OPCODE(WASM_OP_F64_STORE), /* 0x39 */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE8), /* 0x3a */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE16), /* 0x3b */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE8), /* 0x3c */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE16), /* 0x3d */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE32), /* 0x3e */ \ - HANDLE_OPCODE(WASM_OP_MEMORY_SIZE), /* 0x3f */ \ - HANDLE_OPCODE(WASM_OP_MEMORY_GROW), /* 0x40 */ \ - HANDLE_OPCODE(WASM_OP_I32_CONST), /* 0x41 */ \ - HANDLE_OPCODE(WASM_OP_I64_CONST), /* 0x42 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONST), /* 0x43 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONST), /* 0x44 */ \ - HANDLE_OPCODE(WASM_OP_I32_EQZ), /* 0x45 */ \ - HANDLE_OPCODE(WASM_OP_I32_EQ), /* 0x46 */ \ - HANDLE_OPCODE(WASM_OP_I32_NE), /* 0x47 */ \ - HANDLE_OPCODE(WASM_OP_I32_LT_S), /* 0x48 */ \ - HANDLE_OPCODE(WASM_OP_I32_LT_U), /* 0x49 */ \ - HANDLE_OPCODE(WASM_OP_I32_GT_S), /* 0x4a */ \ - HANDLE_OPCODE(WASM_OP_I32_GT_U), /* 0x4b */ \ - HANDLE_OPCODE(WASM_OP_I32_LE_S), /* 0x4c */ \ - HANDLE_OPCODE(WASM_OP_I32_LE_U), /* 0x4d */ \ - HANDLE_OPCODE(WASM_OP_I32_GE_S), /* 0x4e */ \ - HANDLE_OPCODE(WASM_OP_I32_GE_U), /* 0x4f */ \ - HANDLE_OPCODE(WASM_OP_I64_EQZ), /* 0x50 */ \ - HANDLE_OPCODE(WASM_OP_I64_EQ), /* 0x51 */ \ - HANDLE_OPCODE(WASM_OP_I64_NE), /* 0x52 */ \ - HANDLE_OPCODE(WASM_OP_I64_LT_S), /* 0x53 */ \ - HANDLE_OPCODE(WASM_OP_I64_LT_U), /* 0x54 */ \ - HANDLE_OPCODE(WASM_OP_I64_GT_S), /* 0x55 */ \ - HANDLE_OPCODE(WASM_OP_I64_GT_U), /* 0x56 */ \ - HANDLE_OPCODE(WASM_OP_I64_LE_S), /* 0x57 */ \ - HANDLE_OPCODE(WASM_OP_I64_LE_U), /* 0x58 */ \ - HANDLE_OPCODE(WASM_OP_I64_GE_S), /* 0x59 */ \ - HANDLE_OPCODE(WASM_OP_I64_GE_U), /* 0x5a */ \ - HANDLE_OPCODE(WASM_OP_F32_EQ), /* 0x5b */ \ - HANDLE_OPCODE(WASM_OP_F32_NE), /* 0x5c */ \ - HANDLE_OPCODE(WASM_OP_F32_LT), /* 0x5d */ \ - HANDLE_OPCODE(WASM_OP_F32_GT), /* 0x5e */ \ - HANDLE_OPCODE(WASM_OP_F32_LE), /* 0x5f */ \ - HANDLE_OPCODE(WASM_OP_F32_GE), /* 0x60 */ \ - HANDLE_OPCODE(WASM_OP_F64_EQ), /* 0x61 */ \ - HANDLE_OPCODE(WASM_OP_F64_NE), /* 0x62 */ \ - HANDLE_OPCODE(WASM_OP_F64_LT), /* 0x63 */ \ - HANDLE_OPCODE(WASM_OP_F64_GT), /* 0x64 */ \ - HANDLE_OPCODE(WASM_OP_F64_LE), /* 0x65 */ \ - HANDLE_OPCODE(WASM_OP_F64_GE), /* 0x66 */ \ - HANDLE_OPCODE(WASM_OP_I32_CLZ), /* 0x67 */ \ - HANDLE_OPCODE(WASM_OP_I32_CTZ), /* 0x68 */ \ - HANDLE_OPCODE(WASM_OP_I32_POPCNT), /* 0x69 */ \ - HANDLE_OPCODE(WASM_OP_I32_ADD), /* 0x6a */ \ - HANDLE_OPCODE(WASM_OP_I32_SUB), /* 0x6b */ \ - HANDLE_OPCODE(WASM_OP_I32_MUL), /* 0x6c */ \ - HANDLE_OPCODE(WASM_OP_I32_DIV_S), /* 0x6d */ \ - HANDLE_OPCODE(WASM_OP_I32_DIV_U), /* 0x6e */ \ - HANDLE_OPCODE(WASM_OP_I32_REM_S), /* 0x6f */ \ - HANDLE_OPCODE(WASM_OP_I32_REM_U), /* 0x70 */ \ - HANDLE_OPCODE(WASM_OP_I32_AND), /* 0x71 */ \ - HANDLE_OPCODE(WASM_OP_I32_OR), /* 0x72 */ \ - HANDLE_OPCODE(WASM_OP_I32_XOR), /* 0x73 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHL), /* 0x74 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHR_S), /* 0x75 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHR_U), /* 0x76 */ \ - HANDLE_OPCODE(WASM_OP_I32_ROTL), /* 0x77 */ \ - HANDLE_OPCODE(WASM_OP_I32_ROTR), /* 0x78 */ \ - HANDLE_OPCODE(WASM_OP_I64_CLZ), /* 0x79 */ \ - HANDLE_OPCODE(WASM_OP_I64_CTZ), /* 0x7a */ \ - HANDLE_OPCODE(WASM_OP_I64_POPCNT), /* 0x7b */ \ - HANDLE_OPCODE(WASM_OP_I64_ADD), /* 0x7c */ \ - HANDLE_OPCODE(WASM_OP_I64_SUB), /* 0x7d */ \ - HANDLE_OPCODE(WASM_OP_I64_MUL), /* 0x7e */ \ - HANDLE_OPCODE(WASM_OP_I64_DIV_S), /* 0x7f */ \ - HANDLE_OPCODE(WASM_OP_I64_DIV_U), /* 0x80 */ \ - HANDLE_OPCODE(WASM_OP_I64_REM_S), /* 0x81 */ \ - HANDLE_OPCODE(WASM_OP_I64_REM_U), /* 0x82 */ \ - HANDLE_OPCODE(WASM_OP_I64_AND), /* 0x83 */ \ - HANDLE_OPCODE(WASM_OP_I64_OR), /* 0x84 */ \ - HANDLE_OPCODE(WASM_OP_I64_XOR), /* 0x85 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHL), /* 0x86 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHR_S), /* 0x87 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHR_U), /* 0x88 */ \ - HANDLE_OPCODE(WASM_OP_I64_ROTL), /* 0x89 */ \ - HANDLE_OPCODE(WASM_OP_I64_ROTR), /* 0x8a */ \ - HANDLE_OPCODE(WASM_OP_F32_ABS), /* 0x8b */ \ - HANDLE_OPCODE(WASM_OP_F32_NEG), /* 0x8c */ \ - HANDLE_OPCODE(WASM_OP_F32_CEIL), /* 0x8d */ \ - HANDLE_OPCODE(WASM_OP_F32_FLOOR), /* 0x8e */ \ - HANDLE_OPCODE(WASM_OP_F32_TRUNC), /* 0x8f */ \ - HANDLE_OPCODE(WASM_OP_F32_NEAREST), /* 0x90 */ \ - HANDLE_OPCODE(WASM_OP_F32_SQRT), /* 0x91 */ \ - HANDLE_OPCODE(WASM_OP_F32_ADD), /* 0x92 */ \ - HANDLE_OPCODE(WASM_OP_F32_SUB), /* 0x93 */ \ - HANDLE_OPCODE(WASM_OP_F32_MUL), /* 0x94 */ \ - HANDLE_OPCODE(WASM_OP_F32_DIV), /* 0x95 */ \ - HANDLE_OPCODE(WASM_OP_F32_MIN), /* 0x96 */ \ - HANDLE_OPCODE(WASM_OP_F32_MAX), /* 0x97 */ \ - HANDLE_OPCODE(WASM_OP_F32_COPYSIGN), /* 0x98 */ \ - HANDLE_OPCODE(WASM_OP_F64_ABS), /* 0x99 */ \ - HANDLE_OPCODE(WASM_OP_F64_NEG), /* 0x9a */ \ - HANDLE_OPCODE(WASM_OP_F64_CEIL), /* 0x9b */ \ - HANDLE_OPCODE(WASM_OP_F64_FLOOR), /* 0x9c */ \ - HANDLE_OPCODE(WASM_OP_F64_TRUNC), /* 0x9d */ \ - HANDLE_OPCODE(WASM_OP_F64_NEAREST), /* 0x9e */ \ - HANDLE_OPCODE(WASM_OP_F64_SQRT), /* 0x9f */ \ - HANDLE_OPCODE(WASM_OP_F64_ADD), /* 0xa0 */ \ - HANDLE_OPCODE(WASM_OP_F64_SUB), /* 0xa1 */ \ - HANDLE_OPCODE(WASM_OP_F64_MUL), /* 0xa2 */ \ - HANDLE_OPCODE(WASM_OP_F64_DIV), /* 0xa3 */ \ - HANDLE_OPCODE(WASM_OP_F64_MIN), /* 0xa4 */ \ - HANDLE_OPCODE(WASM_OP_F64_MAX), /* 0xa5 */ \ - HANDLE_OPCODE(WASM_OP_F64_COPYSIGN), /* 0xa6 */ \ - HANDLE_OPCODE(WASM_OP_I32_WRAP_I64), /* 0xa7 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F32), /* 0xa8 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F32), /* 0xa9 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F64), /* 0xaa */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F64), /* 0xab */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND_S_I32), /* 0xac */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND_U_I32), /* 0xad */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F32), /* 0xae */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F32), /* 0xaf */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F64), /* 0xb0 */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F64), /* 0xb1 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I32), /* 0xb2 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I32), /* 0xb3 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I64), /* 0xb4 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I64), /* 0xb5 */ \ - HANDLE_OPCODE(WASM_OP_F32_DEMOTE_F64), /* 0xb6 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I32), /* 0xb7 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I32), /* 0xb8 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I64), /* 0xb9 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I64), /* 0xba */ \ - HANDLE_OPCODE(WASM_OP_F64_PROMOTE_F32), /* 0xbb */ \ - HANDLE_OPCODE(WASM_OP_I32_REINTERPRET_F32), /* 0xbc */ \ - HANDLE_OPCODE(WASM_OP_I64_REINTERPRET_F64), /* 0xbd */ \ - HANDLE_OPCODE(WASM_OP_F32_REINTERPRET_I32), /* 0xbe */ \ - HANDLE_OPCODE(WASM_OP_F64_REINTERPRET_I64), /* 0xbf */ \ - HANDLE_OPCODE(WASM_OP_I32_EXTEND8_S), /* 0xc0 */ \ - HANDLE_OPCODE(WASM_OP_I32_EXTEND16_S), /* 0xc1 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND8_S), /* 0xc2 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND16_S), /* 0xc3 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND32_S), /* 0xc4 */ \ - HANDLE_OPCODE(WASM_OP_DROP_64), /* 0xc5 */ \ - HANDLE_OPCODE(WASM_OP_SELECT_64), /* 0xc6 */ \ - HANDLE_OPCODE(EXT_OP_GET_LOCAL_FAST), /* 0xc7 */ \ - HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_I64), /* 0xc8 */ \ - HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST), /* 0xc9 */ \ - HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST), /* 0xca */ \ - HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_I64), /* 0xcb */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP), /* 0xcc */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_I64), /* 0xcd */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_VALUES), /* 0xce */ \ - HANDLE_OPCODE(WASM_OP_IMPDEP), /* 0xcf */ \ - HANDLE_OPCODE(WASM_OP_REF_NULL), /* 0xd0 */ \ - HANDLE_OPCODE(WASM_OP_REF_IS_NULL), /* 0xd1 */ \ - HANDLE_OPCODE(WASM_OP_REF_FUNC), /* 0xd2 */ \ - HANDLE_OPCODE(EXT_OP_BLOCK), /* 0xd3 */ \ - HANDLE_OPCODE(EXT_OP_LOOP), /* 0xd4 */ \ - HANDLE_OPCODE(EXT_OP_IF), /* 0xd5 */ \ - HANDLE_OPCODE(EXT_OP_BR_TABLE_CACHE), /* 0xd6 */ \ - }; \ - do { \ - _name[WASM_OP_MISC_PREFIX] = \ - HANDLE_OPCODE(WASM_OP_MISC_PREFIX); /* 0xfc */ \ - _name[WASM_OP_ATOMIC_PREFIX] = \ - HANDLE_OPCODE(WASM_OP_ATOMIC_PREFIX); /* 0xfe */ \ - DEF_DEBUG_BREAK_HANDLE(_name) \ +#define DEFINE_GOTO_TABLE(type, _name) \ + static os_thread_local_attribute type _name[WASM_INSTRUCTION_NUM] = { \ + HANDLE_OPCODE(WASM_OP_UNREACHABLE), /* 0x00 */ \ + HANDLE_OPCODE(WASM_OP_NOP), /* 0x01 */ \ + HANDLE_OPCODE(WASM_OP_BLOCK), /* 0x02 */ \ + HANDLE_OPCODE(WASM_OP_LOOP), /* 0x03 */ \ + HANDLE_OPCODE(WASM_OP_IF), /* 0x04 */ \ + HANDLE_OPCODE(WASM_OP_ELSE), /* 0x05 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x06), /* 0x06 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x07), /* 0x07 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x08), /* 0x08 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x09), /* 0x09 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x0a), /* 0x0a */ \ + HANDLE_OPCODE(WASM_OP_END), /* 0x0b */ \ + HANDLE_OPCODE(WASM_OP_BR), /* 0x0c */ \ + HANDLE_OPCODE(WASM_OP_BR_IF), /* 0x0d */ \ + HANDLE_OPCODE(WASM_OP_BR_TABLE), /* 0x0e */ \ + HANDLE_OPCODE(WASM_OP_RETURN), /* 0x0f */ \ + HANDLE_OPCODE(WASM_OP_CALL), /* 0x10 */ \ + HANDLE_OPCODE(WASM_OP_CALL_INDIRECT), /* 0x11 */ \ + HANDLE_OPCODE(WASM_OP_RETURN_CALL), /* 0x12 */ \ + HANDLE_OPCODE(WASM_OP_RETURN_CALL_INDIRECT), /* 0x13 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x14), /* 0x14 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x15), /* 0x15 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x16), /* 0x16 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x17), /* 0x17 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x18), /* 0x18 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x19), /* 0x19 */ \ + HANDLE_OPCODE(WASM_OP_DROP), /* 0x1a */ \ + HANDLE_OPCODE(WASM_OP_SELECT), /* 0x1b */ \ + HANDLE_OPCODE(WASM_OP_SELECT_T), /* 0x1c */ \ + HANDLE_OPCODE(WASM_OP_GET_GLOBAL_64), /* 0x1d */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL_64), /* 0x1e */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL_AUX_STACK), /* 0x1f */ \ + HANDLE_OPCODE(WASM_OP_GET_LOCAL), /* 0x20 */ \ + HANDLE_OPCODE(WASM_OP_SET_LOCAL), /* 0x21 */ \ + HANDLE_OPCODE(WASM_OP_TEE_LOCAL), /* 0x22 */ \ + HANDLE_OPCODE(WASM_OP_GET_GLOBAL), /* 0x23 */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL), /* 0x24 */ \ + HANDLE_OPCODE(WASM_OP_TABLE_GET), /* 0x25 */ \ + HANDLE_OPCODE(WASM_OP_TABLE_SET), /* 0x26 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x27), /* 0x27 */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD), /* 0x28 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD), /* 0x29 */ \ + HANDLE_OPCODE(WASM_OP_F32_LOAD), /* 0x2a */ \ + HANDLE_OPCODE(WASM_OP_F64_LOAD), /* 0x2b */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD8_S), /* 0x2c */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD8_U), /* 0x2d */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD16_S), /* 0x2e */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD16_U), /* 0x2f */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD8_S), /* 0x30 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD8_U), /* 0x31 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD16_S), /* 0x32 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD16_U), /* 0x33 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD32_S), /* 0x34 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD32_U), /* 0x35 */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE), /* 0x36 */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE), /* 0x37 */ \ + HANDLE_OPCODE(WASM_OP_F32_STORE), /* 0x38 */ \ + HANDLE_OPCODE(WASM_OP_F64_STORE), /* 0x39 */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE8), /* 0x3a */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE16), /* 0x3b */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE8), /* 0x3c */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE16), /* 0x3d */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE32), /* 0x3e */ \ + HANDLE_OPCODE(WASM_OP_MEMORY_SIZE), /* 0x3f */ \ + HANDLE_OPCODE(WASM_OP_MEMORY_GROW), /* 0x40 */ \ + HANDLE_OPCODE(WASM_OP_I32_CONST), /* 0x41 */ \ + HANDLE_OPCODE(WASM_OP_I64_CONST), /* 0x42 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONST), /* 0x43 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONST), /* 0x44 */ \ + HANDLE_OPCODE(WASM_OP_I32_EQZ), /* 0x45 */ \ + HANDLE_OPCODE(WASM_OP_I32_EQ), /* 0x46 */ \ + HANDLE_OPCODE(WASM_OP_I32_NE), /* 0x47 */ \ + HANDLE_OPCODE(WASM_OP_I32_LT_S), /* 0x48 */ \ + HANDLE_OPCODE(WASM_OP_I32_LT_U), /* 0x49 */ \ + HANDLE_OPCODE(WASM_OP_I32_GT_S), /* 0x4a */ \ + HANDLE_OPCODE(WASM_OP_I32_GT_U), /* 0x4b */ \ + HANDLE_OPCODE(WASM_OP_I32_LE_S), /* 0x4c */ \ + HANDLE_OPCODE(WASM_OP_I32_LE_U), /* 0x4d */ \ + HANDLE_OPCODE(WASM_OP_I32_GE_S), /* 0x4e */ \ + HANDLE_OPCODE(WASM_OP_I32_GE_U), /* 0x4f */ \ + HANDLE_OPCODE(WASM_OP_I64_EQZ), /* 0x50 */ \ + HANDLE_OPCODE(WASM_OP_I64_EQ), /* 0x51 */ \ + HANDLE_OPCODE(WASM_OP_I64_NE), /* 0x52 */ \ + HANDLE_OPCODE(WASM_OP_I64_LT_S), /* 0x53 */ \ + HANDLE_OPCODE(WASM_OP_I64_LT_U), /* 0x54 */ \ + HANDLE_OPCODE(WASM_OP_I64_GT_S), /* 0x55 */ \ + HANDLE_OPCODE(WASM_OP_I64_GT_U), /* 0x56 */ \ + HANDLE_OPCODE(WASM_OP_I64_LE_S), /* 0x57 */ \ + HANDLE_OPCODE(WASM_OP_I64_LE_U), /* 0x58 */ \ + HANDLE_OPCODE(WASM_OP_I64_GE_S), /* 0x59 */ \ + HANDLE_OPCODE(WASM_OP_I64_GE_U), /* 0x5a */ \ + HANDLE_OPCODE(WASM_OP_F32_EQ), /* 0x5b */ \ + HANDLE_OPCODE(WASM_OP_F32_NE), /* 0x5c */ \ + HANDLE_OPCODE(WASM_OP_F32_LT), /* 0x5d */ \ + HANDLE_OPCODE(WASM_OP_F32_GT), /* 0x5e */ \ + HANDLE_OPCODE(WASM_OP_F32_LE), /* 0x5f */ \ + HANDLE_OPCODE(WASM_OP_F32_GE), /* 0x60 */ \ + HANDLE_OPCODE(WASM_OP_F64_EQ), /* 0x61 */ \ + HANDLE_OPCODE(WASM_OP_F64_NE), /* 0x62 */ \ + HANDLE_OPCODE(WASM_OP_F64_LT), /* 0x63 */ \ + HANDLE_OPCODE(WASM_OP_F64_GT), /* 0x64 */ \ + HANDLE_OPCODE(WASM_OP_F64_LE), /* 0x65 */ \ + HANDLE_OPCODE(WASM_OP_F64_GE), /* 0x66 */ \ + HANDLE_OPCODE(WASM_OP_I32_CLZ), /* 0x67 */ \ + HANDLE_OPCODE(WASM_OP_I32_CTZ), /* 0x68 */ \ + HANDLE_OPCODE(WASM_OP_I32_POPCNT), /* 0x69 */ \ + HANDLE_OPCODE(WASM_OP_I32_ADD), /* 0x6a */ \ + HANDLE_OPCODE(WASM_OP_I32_SUB), /* 0x6b */ \ + HANDLE_OPCODE(WASM_OP_I32_MUL), /* 0x6c */ \ + HANDLE_OPCODE(WASM_OP_I32_DIV_S), /* 0x6d */ \ + HANDLE_OPCODE(WASM_OP_I32_DIV_U), /* 0x6e */ \ + HANDLE_OPCODE(WASM_OP_I32_REM_S), /* 0x6f */ \ + HANDLE_OPCODE(WASM_OP_I32_REM_U), /* 0x70 */ \ + HANDLE_OPCODE(WASM_OP_I32_AND), /* 0x71 */ \ + HANDLE_OPCODE(WASM_OP_I32_OR), /* 0x72 */ \ + HANDLE_OPCODE(WASM_OP_I32_XOR), /* 0x73 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHL), /* 0x74 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHR_S), /* 0x75 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHR_U), /* 0x76 */ \ + HANDLE_OPCODE(WASM_OP_I32_ROTL), /* 0x77 */ \ + HANDLE_OPCODE(WASM_OP_I32_ROTR), /* 0x78 */ \ + HANDLE_OPCODE(WASM_OP_I64_CLZ), /* 0x79 */ \ + HANDLE_OPCODE(WASM_OP_I64_CTZ), /* 0x7a */ \ + HANDLE_OPCODE(WASM_OP_I64_POPCNT), /* 0x7b */ \ + HANDLE_OPCODE(WASM_OP_I64_ADD), /* 0x7c */ \ + HANDLE_OPCODE(WASM_OP_I64_SUB), /* 0x7d */ \ + HANDLE_OPCODE(WASM_OP_I64_MUL), /* 0x7e */ \ + HANDLE_OPCODE(WASM_OP_I64_DIV_S), /* 0x7f */ \ + HANDLE_OPCODE(WASM_OP_I64_DIV_U), /* 0x80 */ \ + HANDLE_OPCODE(WASM_OP_I64_REM_S), /* 0x81 */ \ + HANDLE_OPCODE(WASM_OP_I64_REM_U), /* 0x82 */ \ + HANDLE_OPCODE(WASM_OP_I64_AND), /* 0x83 */ \ + HANDLE_OPCODE(WASM_OP_I64_OR), /* 0x84 */ \ + HANDLE_OPCODE(WASM_OP_I64_XOR), /* 0x85 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHL), /* 0x86 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHR_S), /* 0x87 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHR_U), /* 0x88 */ \ + HANDLE_OPCODE(WASM_OP_I64_ROTL), /* 0x89 */ \ + HANDLE_OPCODE(WASM_OP_I64_ROTR), /* 0x8a */ \ + HANDLE_OPCODE(WASM_OP_F32_ABS), /* 0x8b */ \ + HANDLE_OPCODE(WASM_OP_F32_NEG), /* 0x8c */ \ + HANDLE_OPCODE(WASM_OP_F32_CEIL), /* 0x8d */ \ + HANDLE_OPCODE(WASM_OP_F32_FLOOR), /* 0x8e */ \ + HANDLE_OPCODE(WASM_OP_F32_TRUNC), /* 0x8f */ \ + HANDLE_OPCODE(WASM_OP_F32_NEAREST), /* 0x90 */ \ + HANDLE_OPCODE(WASM_OP_F32_SQRT), /* 0x91 */ \ + HANDLE_OPCODE(WASM_OP_F32_ADD), /* 0x92 */ \ + HANDLE_OPCODE(WASM_OP_F32_SUB), /* 0x93 */ \ + HANDLE_OPCODE(WASM_OP_F32_MUL), /* 0x94 */ \ + HANDLE_OPCODE(WASM_OP_F32_DIV), /* 0x95 */ \ + HANDLE_OPCODE(WASM_OP_F32_MIN), /* 0x96 */ \ + HANDLE_OPCODE(WASM_OP_F32_MAX), /* 0x97 */ \ + HANDLE_OPCODE(WASM_OP_F32_COPYSIGN), /* 0x98 */ \ + HANDLE_OPCODE(WASM_OP_F64_ABS), /* 0x99 */ \ + HANDLE_OPCODE(WASM_OP_F64_NEG), /* 0x9a */ \ + HANDLE_OPCODE(WASM_OP_F64_CEIL), /* 0x9b */ \ + HANDLE_OPCODE(WASM_OP_F64_FLOOR), /* 0x9c */ \ + HANDLE_OPCODE(WASM_OP_F64_TRUNC), /* 0x9d */ \ + HANDLE_OPCODE(WASM_OP_F64_NEAREST), /* 0x9e */ \ + HANDLE_OPCODE(WASM_OP_F64_SQRT), /* 0x9f */ \ + HANDLE_OPCODE(WASM_OP_F64_ADD), /* 0xa0 */ \ + HANDLE_OPCODE(WASM_OP_F64_SUB), /* 0xa1 */ \ + HANDLE_OPCODE(WASM_OP_F64_MUL), /* 0xa2 */ \ + HANDLE_OPCODE(WASM_OP_F64_DIV), /* 0xa3 */ \ + HANDLE_OPCODE(WASM_OP_F64_MIN), /* 0xa4 */ \ + HANDLE_OPCODE(WASM_OP_F64_MAX), /* 0xa5 */ \ + HANDLE_OPCODE(WASM_OP_F64_COPYSIGN), /* 0xa6 */ \ + HANDLE_OPCODE(WASM_OP_I32_WRAP_I64), /* 0xa7 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F32), /* 0xa8 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F32), /* 0xa9 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F64), /* 0xaa */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F64), /* 0xab */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND_S_I32), /* 0xac */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND_U_I32), /* 0xad */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F32), /* 0xae */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F32), /* 0xaf */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F64), /* 0xb0 */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F64), /* 0xb1 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I32), /* 0xb2 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I32), /* 0xb3 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I64), /* 0xb4 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I64), /* 0xb5 */ \ + HANDLE_OPCODE(WASM_OP_F32_DEMOTE_F64), /* 0xb6 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I32), /* 0xb7 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I32), /* 0xb8 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I64), /* 0xb9 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I64), /* 0xba */ \ + HANDLE_OPCODE(WASM_OP_F64_PROMOTE_F32), /* 0xbb */ \ + HANDLE_OPCODE(WASM_OP_I32_REINTERPRET_F32), /* 0xbc */ \ + HANDLE_OPCODE(WASM_OP_I64_REINTERPRET_F64), /* 0xbd */ \ + HANDLE_OPCODE(WASM_OP_F32_REINTERPRET_I32), /* 0xbe */ \ + HANDLE_OPCODE(WASM_OP_F64_REINTERPRET_I64), /* 0xbf */ \ + HANDLE_OPCODE(WASM_OP_I32_EXTEND8_S), /* 0xc0 */ \ + HANDLE_OPCODE(WASM_OP_I32_EXTEND16_S), /* 0xc1 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND8_S), /* 0xc2 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND16_S), /* 0xc3 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND32_S), /* 0xc4 */ \ + HANDLE_OPCODE(WASM_OP_DROP_64), /* 0xc5 */ \ + HANDLE_OPCODE(WASM_OP_SELECT_64), /* 0xc6 */ \ + HANDLE_OPCODE(EXT_OP_GET_LOCAL_FAST), /* 0xc7 */ \ + HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_I64), /* 0xc8 */ \ + HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST), /* 0xc9 */ \ + HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST), /* 0xca */ \ + HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_I64), /* 0xcb */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP), /* 0xcc */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_I64), /* 0xcd */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_VALUES), /* 0xce */ \ + HANDLE_OPCODE(WASM_OP_IMPDEP), /* 0xcf */ \ + HANDLE_OPCODE(WASM_OP_REF_NULL), /* 0xd0 */ \ + HANDLE_OPCODE(WASM_OP_REF_IS_NULL), /* 0xd1 */ \ + HANDLE_OPCODE(WASM_OP_REF_FUNC), /* 0xd2 */ \ + HANDLE_OPCODE(EXT_OP_BLOCK), /* 0xd3 */ \ + HANDLE_OPCODE(EXT_OP_LOOP), /* 0xd4 */ \ + HANDLE_OPCODE(EXT_OP_IF), /* 0xd5 */ \ + HANDLE_OPCODE(EXT_OP_BR_TABLE_CACHE), /* 0xd6 */ \ + }; \ + do { \ + _name[WASM_OP_MISC_PREFIX] = \ + HANDLE_OPCODE(WASM_OP_MISC_PREFIX); /* 0xfc */ \ + _name[WASM_OP_ATOMIC_PREFIX] = \ + HANDLE_OPCODE(WASM_OP_ATOMIC_PREFIX); /* 0xfe */ \ + DEF_DEBUG_BREAK_HANDLE(_name) \ } while (0) #ifdef __cplusplus From 7e7e7e85dd93f4be6a7235b4124542e0d6ec0f4c Mon Sep 17 00:00:00 2001 From: eloparco Date: Sun, 19 Feb 2023 01:23:49 +0000 Subject: [PATCH 2/7] fix: use atomic instead of lock to protect "memory_mode" enum --- core/iwasm/common/wasm_memory.c | 52 ++++++++------------------------- 1 file changed, 12 insertions(+), 40 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index 7f0bc7f9f9..b3838360e4 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -16,7 +16,6 @@ typedef enum Memory_Mode { } Memory_Mode; static Memory_Mode memory_mode = MEMORY_MODE_UNKNOWN; -static korp_mutex mem_mode_lock; static mem_allocator_t pool_allocator = NULL; @@ -40,9 +39,7 @@ wasm_memory_init_with_pool(void *mem, unsigned int bytes) mem_allocator_t _allocator = mem_allocator_create(mem, bytes); if (_allocator) { - os_mutex_lock(&mem_mode_lock); - memory_mode = MEMORY_MODE_POOL; - os_mutex_unlock(&mem_mode_lock); + __atomic_store_n(&memory_mode, MEMORY_MODE_POOL, __ATOMIC_SEQ_CST); pool_allocator = _allocator; global_pool_size = bytes; return true; @@ -57,9 +54,7 @@ wasm_memory_init_with_allocator(void *_user_data, void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { - os_mutex_lock(&mem_mode_lock); - memory_mode = MEMORY_MODE_ALLOCATOR; - os_mutex_unlock(&mem_mode_lock); + __atomic_store_n(&memory_mode, MEMORY_MODE_ALLOCATOR, __ATOMIC_SEQ_CST); allocator_user_data = _user_data; malloc_func = _malloc_func; realloc_func = _realloc_func; @@ -76,9 +71,7 @@ wasm_memory_init_with_allocator(void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { - os_mutex_lock(&mem_mode_lock); - memory_mode = MEMORY_MODE_ALLOCATOR; - os_mutex_unlock(&mem_mode_lock); + __atomic_store_n(&memory_mode, MEMORY_MODE_ALLOCATOR, __ATOMIC_SEQ_CST); malloc_func = _malloc_func; realloc_func = _realloc_func; free_func = _free_func; @@ -113,9 +106,8 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, #endif } else if (mem_alloc_type == Alloc_With_System_Allocator) { - os_mutex_lock(&mem_mode_lock); - memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR; - os_mutex_unlock(&mem_mode_lock); + __atomic_store_n(&memory_mode, MEMORY_MODE_SYSTEM_ALLOCATOR, + __ATOMIC_SEQ_CST); return true; } else { @@ -126,10 +118,7 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, void wasm_runtime_memory_destroy() { - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_POOL) { #if BH_ENABLE_GC_VERIFY == 0 (void)mem_allocator_destroy(pool_allocator); @@ -141,18 +130,13 @@ wasm_runtime_memory_destroy() } #endif } - os_mutex_lock(&mem_mode_lock); - memory_mode = MEMORY_MODE_UNKNOWN; - os_mutex_unlock(&mem_mode_lock); + __atomic_store_n(&memory_mode, MEMORY_MODE_UNKNOWN, __ATOMIC_SEQ_CST); } unsigned wasm_runtime_memory_pool_size() { - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_POOL) return global_pool_size; else @@ -162,10 +146,7 @@ wasm_runtime_memory_pool_size() static inline void * wasm_runtime_malloc_internal(unsigned int size) { - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_malloc failed: memory hasn't been initialize.\n"); @@ -189,10 +170,7 @@ wasm_runtime_malloc_internal(unsigned int size) static inline void * wasm_runtime_realloc_internal(void *ptr, unsigned int size) { - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_realloc failed: memory hasn't been initialize.\n"); @@ -227,10 +205,7 @@ wasm_runtime_free_internal(void *ptr) return; } - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING("warning: wasm_runtime_free failed: " "memory hasn't been initialize.\n"); @@ -280,10 +255,7 @@ wasm_runtime_free(void *ptr) bool wasm_runtime_get_mem_alloc_info(mem_alloc_info_t *mem_alloc_info) { - os_mutex_lock(&mem_mode_lock); - Memory_Mode mem_mode = memory_mode; - os_mutex_unlock(&mem_mode_lock); - + Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); if (mem_mode == MEMORY_MODE_POOL) { return mem_allocator_get_alloc_info(pool_allocator, mem_alloc_info); } From 2b20df176479e184aab7cd50334243a759690756 Mon Sep 17 00:00:00 2001 From: eloparco Date: Sun, 19 Feb 2023 12:32:16 +0000 Subject: [PATCH 3/7] fix: fix pre-increment --- core/iwasm/common/wasm_shared_memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 0e38ac583f..8c17a8b53d 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -160,7 +160,7 @@ shared_memory_inc_reference(WASMModuleCommon *module) uint32 ref_count = -1; if (node) { os_mutex_lock(&node->lock); - ref_count = node->ref_count++; + ref_count = ++node->ref_count; os_mutex_unlock(&node->lock); } return ref_count; From b5aed9cf7097753f126cf142a7594643c7c4e8d4 Mon Sep 17 00:00:00 2001 From: eloparco Date: Sun, 19 Feb 2023 14:30:36 +0000 Subject: [PATCH 4/7] fix: avoid assignments after initialization of the goto table --- core/iwasm/interpreter/wasm_opcode.h | 454 +++++++++++++-------------- 1 file changed, 226 insertions(+), 228 deletions(-) diff --git a/core/iwasm/interpreter/wasm_opcode.h b/core/iwasm/interpreter/wasm_opcode.h index 721b9d580a..ce5e358a2d 100644 --- a/core/iwasm/interpreter/wasm_opcode.h +++ b/core/iwasm/interpreter/wasm_opcode.h @@ -675,242 +675,240 @@ typedef enum WASMAtomicEXTOpcode { } WASMAtomicEXTOpcode; #if WASM_ENABLE_DEBUG_INTERP != 0 -#define DEF_DEBUG_BREAK_HANDLE(_name) \ - _name[DEBUG_OP_BREAK] = HANDLE_OPCODE(DEBUG_OP_BREAK); /* 0xd7 */ +#define DEF_DEBUG_BREAK_HANDLE() \ + [DEBUG_OP_BREAK] = HANDLE_OPCODE(DEBUG_OP_BREAK), /* 0xd7 */ #else -#define DEF_DEBUG_BREAK_HANDLE(_name) +#define DEF_DEBUG_BREAK_HANDLE() #endif +#define SET_GOTO_TABLE_ELEM(opcode) [opcode] = HANDLE_OPCODE(opcode) + /* * Macro used to generate computed goto tables for the C interpreter. */ #define WASM_INSTRUCTION_NUM 256 -#define DEFINE_GOTO_TABLE(type, _name) \ - static os_thread_local_attribute type _name[WASM_INSTRUCTION_NUM] = { \ - HANDLE_OPCODE(WASM_OP_UNREACHABLE), /* 0x00 */ \ - HANDLE_OPCODE(WASM_OP_NOP), /* 0x01 */ \ - HANDLE_OPCODE(WASM_OP_BLOCK), /* 0x02 */ \ - HANDLE_OPCODE(WASM_OP_LOOP), /* 0x03 */ \ - HANDLE_OPCODE(WASM_OP_IF), /* 0x04 */ \ - HANDLE_OPCODE(WASM_OP_ELSE), /* 0x05 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x06), /* 0x06 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x07), /* 0x07 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x08), /* 0x08 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x09), /* 0x09 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x0a), /* 0x0a */ \ - HANDLE_OPCODE(WASM_OP_END), /* 0x0b */ \ - HANDLE_OPCODE(WASM_OP_BR), /* 0x0c */ \ - HANDLE_OPCODE(WASM_OP_BR_IF), /* 0x0d */ \ - HANDLE_OPCODE(WASM_OP_BR_TABLE), /* 0x0e */ \ - HANDLE_OPCODE(WASM_OP_RETURN), /* 0x0f */ \ - HANDLE_OPCODE(WASM_OP_CALL), /* 0x10 */ \ - HANDLE_OPCODE(WASM_OP_CALL_INDIRECT), /* 0x11 */ \ - HANDLE_OPCODE(WASM_OP_RETURN_CALL), /* 0x12 */ \ - HANDLE_OPCODE(WASM_OP_RETURN_CALL_INDIRECT), /* 0x13 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x14), /* 0x14 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x15), /* 0x15 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x16), /* 0x16 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x17), /* 0x17 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x18), /* 0x18 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x19), /* 0x19 */ \ - HANDLE_OPCODE(WASM_OP_DROP), /* 0x1a */ \ - HANDLE_OPCODE(WASM_OP_SELECT), /* 0x1b */ \ - HANDLE_OPCODE(WASM_OP_SELECT_T), /* 0x1c */ \ - HANDLE_OPCODE(WASM_OP_GET_GLOBAL_64), /* 0x1d */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL_64), /* 0x1e */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL_AUX_STACK), /* 0x1f */ \ - HANDLE_OPCODE(WASM_OP_GET_LOCAL), /* 0x20 */ \ - HANDLE_OPCODE(WASM_OP_SET_LOCAL), /* 0x21 */ \ - HANDLE_OPCODE(WASM_OP_TEE_LOCAL), /* 0x22 */ \ - HANDLE_OPCODE(WASM_OP_GET_GLOBAL), /* 0x23 */ \ - HANDLE_OPCODE(WASM_OP_SET_GLOBAL), /* 0x24 */ \ - HANDLE_OPCODE(WASM_OP_TABLE_GET), /* 0x25 */ \ - HANDLE_OPCODE(WASM_OP_TABLE_SET), /* 0x26 */ \ - HANDLE_OPCODE(WASM_OP_UNUSED_0x27), /* 0x27 */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD), /* 0x28 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD), /* 0x29 */ \ - HANDLE_OPCODE(WASM_OP_F32_LOAD), /* 0x2a */ \ - HANDLE_OPCODE(WASM_OP_F64_LOAD), /* 0x2b */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD8_S), /* 0x2c */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD8_U), /* 0x2d */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD16_S), /* 0x2e */ \ - HANDLE_OPCODE(WASM_OP_I32_LOAD16_U), /* 0x2f */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD8_S), /* 0x30 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD8_U), /* 0x31 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD16_S), /* 0x32 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD16_U), /* 0x33 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD32_S), /* 0x34 */ \ - HANDLE_OPCODE(WASM_OP_I64_LOAD32_U), /* 0x35 */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE), /* 0x36 */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE), /* 0x37 */ \ - HANDLE_OPCODE(WASM_OP_F32_STORE), /* 0x38 */ \ - HANDLE_OPCODE(WASM_OP_F64_STORE), /* 0x39 */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE8), /* 0x3a */ \ - HANDLE_OPCODE(WASM_OP_I32_STORE16), /* 0x3b */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE8), /* 0x3c */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE16), /* 0x3d */ \ - HANDLE_OPCODE(WASM_OP_I64_STORE32), /* 0x3e */ \ - HANDLE_OPCODE(WASM_OP_MEMORY_SIZE), /* 0x3f */ \ - HANDLE_OPCODE(WASM_OP_MEMORY_GROW), /* 0x40 */ \ - HANDLE_OPCODE(WASM_OP_I32_CONST), /* 0x41 */ \ - HANDLE_OPCODE(WASM_OP_I64_CONST), /* 0x42 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONST), /* 0x43 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONST), /* 0x44 */ \ - HANDLE_OPCODE(WASM_OP_I32_EQZ), /* 0x45 */ \ - HANDLE_OPCODE(WASM_OP_I32_EQ), /* 0x46 */ \ - HANDLE_OPCODE(WASM_OP_I32_NE), /* 0x47 */ \ - HANDLE_OPCODE(WASM_OP_I32_LT_S), /* 0x48 */ \ - HANDLE_OPCODE(WASM_OP_I32_LT_U), /* 0x49 */ \ - HANDLE_OPCODE(WASM_OP_I32_GT_S), /* 0x4a */ \ - HANDLE_OPCODE(WASM_OP_I32_GT_U), /* 0x4b */ \ - HANDLE_OPCODE(WASM_OP_I32_LE_S), /* 0x4c */ \ - HANDLE_OPCODE(WASM_OP_I32_LE_U), /* 0x4d */ \ - HANDLE_OPCODE(WASM_OP_I32_GE_S), /* 0x4e */ \ - HANDLE_OPCODE(WASM_OP_I32_GE_U), /* 0x4f */ \ - HANDLE_OPCODE(WASM_OP_I64_EQZ), /* 0x50 */ \ - HANDLE_OPCODE(WASM_OP_I64_EQ), /* 0x51 */ \ - HANDLE_OPCODE(WASM_OP_I64_NE), /* 0x52 */ \ - HANDLE_OPCODE(WASM_OP_I64_LT_S), /* 0x53 */ \ - HANDLE_OPCODE(WASM_OP_I64_LT_U), /* 0x54 */ \ - HANDLE_OPCODE(WASM_OP_I64_GT_S), /* 0x55 */ \ - HANDLE_OPCODE(WASM_OP_I64_GT_U), /* 0x56 */ \ - HANDLE_OPCODE(WASM_OP_I64_LE_S), /* 0x57 */ \ - HANDLE_OPCODE(WASM_OP_I64_LE_U), /* 0x58 */ \ - HANDLE_OPCODE(WASM_OP_I64_GE_S), /* 0x59 */ \ - HANDLE_OPCODE(WASM_OP_I64_GE_U), /* 0x5a */ \ - HANDLE_OPCODE(WASM_OP_F32_EQ), /* 0x5b */ \ - HANDLE_OPCODE(WASM_OP_F32_NE), /* 0x5c */ \ - HANDLE_OPCODE(WASM_OP_F32_LT), /* 0x5d */ \ - HANDLE_OPCODE(WASM_OP_F32_GT), /* 0x5e */ \ - HANDLE_OPCODE(WASM_OP_F32_LE), /* 0x5f */ \ - HANDLE_OPCODE(WASM_OP_F32_GE), /* 0x60 */ \ - HANDLE_OPCODE(WASM_OP_F64_EQ), /* 0x61 */ \ - HANDLE_OPCODE(WASM_OP_F64_NE), /* 0x62 */ \ - HANDLE_OPCODE(WASM_OP_F64_LT), /* 0x63 */ \ - HANDLE_OPCODE(WASM_OP_F64_GT), /* 0x64 */ \ - HANDLE_OPCODE(WASM_OP_F64_LE), /* 0x65 */ \ - HANDLE_OPCODE(WASM_OP_F64_GE), /* 0x66 */ \ - HANDLE_OPCODE(WASM_OP_I32_CLZ), /* 0x67 */ \ - HANDLE_OPCODE(WASM_OP_I32_CTZ), /* 0x68 */ \ - HANDLE_OPCODE(WASM_OP_I32_POPCNT), /* 0x69 */ \ - HANDLE_OPCODE(WASM_OP_I32_ADD), /* 0x6a */ \ - HANDLE_OPCODE(WASM_OP_I32_SUB), /* 0x6b */ \ - HANDLE_OPCODE(WASM_OP_I32_MUL), /* 0x6c */ \ - HANDLE_OPCODE(WASM_OP_I32_DIV_S), /* 0x6d */ \ - HANDLE_OPCODE(WASM_OP_I32_DIV_U), /* 0x6e */ \ - HANDLE_OPCODE(WASM_OP_I32_REM_S), /* 0x6f */ \ - HANDLE_OPCODE(WASM_OP_I32_REM_U), /* 0x70 */ \ - HANDLE_OPCODE(WASM_OP_I32_AND), /* 0x71 */ \ - HANDLE_OPCODE(WASM_OP_I32_OR), /* 0x72 */ \ - HANDLE_OPCODE(WASM_OP_I32_XOR), /* 0x73 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHL), /* 0x74 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHR_S), /* 0x75 */ \ - HANDLE_OPCODE(WASM_OP_I32_SHR_U), /* 0x76 */ \ - HANDLE_OPCODE(WASM_OP_I32_ROTL), /* 0x77 */ \ - HANDLE_OPCODE(WASM_OP_I32_ROTR), /* 0x78 */ \ - HANDLE_OPCODE(WASM_OP_I64_CLZ), /* 0x79 */ \ - HANDLE_OPCODE(WASM_OP_I64_CTZ), /* 0x7a */ \ - HANDLE_OPCODE(WASM_OP_I64_POPCNT), /* 0x7b */ \ - HANDLE_OPCODE(WASM_OP_I64_ADD), /* 0x7c */ \ - HANDLE_OPCODE(WASM_OP_I64_SUB), /* 0x7d */ \ - HANDLE_OPCODE(WASM_OP_I64_MUL), /* 0x7e */ \ - HANDLE_OPCODE(WASM_OP_I64_DIV_S), /* 0x7f */ \ - HANDLE_OPCODE(WASM_OP_I64_DIV_U), /* 0x80 */ \ - HANDLE_OPCODE(WASM_OP_I64_REM_S), /* 0x81 */ \ - HANDLE_OPCODE(WASM_OP_I64_REM_U), /* 0x82 */ \ - HANDLE_OPCODE(WASM_OP_I64_AND), /* 0x83 */ \ - HANDLE_OPCODE(WASM_OP_I64_OR), /* 0x84 */ \ - HANDLE_OPCODE(WASM_OP_I64_XOR), /* 0x85 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHL), /* 0x86 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHR_S), /* 0x87 */ \ - HANDLE_OPCODE(WASM_OP_I64_SHR_U), /* 0x88 */ \ - HANDLE_OPCODE(WASM_OP_I64_ROTL), /* 0x89 */ \ - HANDLE_OPCODE(WASM_OP_I64_ROTR), /* 0x8a */ \ - HANDLE_OPCODE(WASM_OP_F32_ABS), /* 0x8b */ \ - HANDLE_OPCODE(WASM_OP_F32_NEG), /* 0x8c */ \ - HANDLE_OPCODE(WASM_OP_F32_CEIL), /* 0x8d */ \ - HANDLE_OPCODE(WASM_OP_F32_FLOOR), /* 0x8e */ \ - HANDLE_OPCODE(WASM_OP_F32_TRUNC), /* 0x8f */ \ - HANDLE_OPCODE(WASM_OP_F32_NEAREST), /* 0x90 */ \ - HANDLE_OPCODE(WASM_OP_F32_SQRT), /* 0x91 */ \ - HANDLE_OPCODE(WASM_OP_F32_ADD), /* 0x92 */ \ - HANDLE_OPCODE(WASM_OP_F32_SUB), /* 0x93 */ \ - HANDLE_OPCODE(WASM_OP_F32_MUL), /* 0x94 */ \ - HANDLE_OPCODE(WASM_OP_F32_DIV), /* 0x95 */ \ - HANDLE_OPCODE(WASM_OP_F32_MIN), /* 0x96 */ \ - HANDLE_OPCODE(WASM_OP_F32_MAX), /* 0x97 */ \ - HANDLE_OPCODE(WASM_OP_F32_COPYSIGN), /* 0x98 */ \ - HANDLE_OPCODE(WASM_OP_F64_ABS), /* 0x99 */ \ - HANDLE_OPCODE(WASM_OP_F64_NEG), /* 0x9a */ \ - HANDLE_OPCODE(WASM_OP_F64_CEIL), /* 0x9b */ \ - HANDLE_OPCODE(WASM_OP_F64_FLOOR), /* 0x9c */ \ - HANDLE_OPCODE(WASM_OP_F64_TRUNC), /* 0x9d */ \ - HANDLE_OPCODE(WASM_OP_F64_NEAREST), /* 0x9e */ \ - HANDLE_OPCODE(WASM_OP_F64_SQRT), /* 0x9f */ \ - HANDLE_OPCODE(WASM_OP_F64_ADD), /* 0xa0 */ \ - HANDLE_OPCODE(WASM_OP_F64_SUB), /* 0xa1 */ \ - HANDLE_OPCODE(WASM_OP_F64_MUL), /* 0xa2 */ \ - HANDLE_OPCODE(WASM_OP_F64_DIV), /* 0xa3 */ \ - HANDLE_OPCODE(WASM_OP_F64_MIN), /* 0xa4 */ \ - HANDLE_OPCODE(WASM_OP_F64_MAX), /* 0xa5 */ \ - HANDLE_OPCODE(WASM_OP_F64_COPYSIGN), /* 0xa6 */ \ - HANDLE_OPCODE(WASM_OP_I32_WRAP_I64), /* 0xa7 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F32), /* 0xa8 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F32), /* 0xa9 */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F64), /* 0xaa */ \ - HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F64), /* 0xab */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND_S_I32), /* 0xac */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND_U_I32), /* 0xad */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F32), /* 0xae */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F32), /* 0xaf */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F64), /* 0xb0 */ \ - HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F64), /* 0xb1 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I32), /* 0xb2 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I32), /* 0xb3 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I64), /* 0xb4 */ \ - HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I64), /* 0xb5 */ \ - HANDLE_OPCODE(WASM_OP_F32_DEMOTE_F64), /* 0xb6 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I32), /* 0xb7 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I32), /* 0xb8 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I64), /* 0xb9 */ \ - HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I64), /* 0xba */ \ - HANDLE_OPCODE(WASM_OP_F64_PROMOTE_F32), /* 0xbb */ \ - HANDLE_OPCODE(WASM_OP_I32_REINTERPRET_F32), /* 0xbc */ \ - HANDLE_OPCODE(WASM_OP_I64_REINTERPRET_F64), /* 0xbd */ \ - HANDLE_OPCODE(WASM_OP_F32_REINTERPRET_I32), /* 0xbe */ \ - HANDLE_OPCODE(WASM_OP_F64_REINTERPRET_I64), /* 0xbf */ \ - HANDLE_OPCODE(WASM_OP_I32_EXTEND8_S), /* 0xc0 */ \ - HANDLE_OPCODE(WASM_OP_I32_EXTEND16_S), /* 0xc1 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND8_S), /* 0xc2 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND16_S), /* 0xc3 */ \ - HANDLE_OPCODE(WASM_OP_I64_EXTEND32_S), /* 0xc4 */ \ - HANDLE_OPCODE(WASM_OP_DROP_64), /* 0xc5 */ \ - HANDLE_OPCODE(WASM_OP_SELECT_64), /* 0xc6 */ \ - HANDLE_OPCODE(EXT_OP_GET_LOCAL_FAST), /* 0xc7 */ \ - HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_I64), /* 0xc8 */ \ - HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST), /* 0xc9 */ \ - HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST), /* 0xca */ \ - HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_I64), /* 0xcb */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP), /* 0xcc */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_I64), /* 0xcd */ \ - HANDLE_OPCODE(EXT_OP_COPY_STACK_VALUES), /* 0xce */ \ - HANDLE_OPCODE(WASM_OP_IMPDEP), /* 0xcf */ \ - HANDLE_OPCODE(WASM_OP_REF_NULL), /* 0xd0 */ \ - HANDLE_OPCODE(WASM_OP_REF_IS_NULL), /* 0xd1 */ \ - HANDLE_OPCODE(WASM_OP_REF_FUNC), /* 0xd2 */ \ - HANDLE_OPCODE(EXT_OP_BLOCK), /* 0xd3 */ \ - HANDLE_OPCODE(EXT_OP_LOOP), /* 0xd4 */ \ - HANDLE_OPCODE(EXT_OP_IF), /* 0xd5 */ \ - HANDLE_OPCODE(EXT_OP_BR_TABLE_CACHE), /* 0xd6 */ \ - }; \ - do { \ - _name[WASM_OP_MISC_PREFIX] = \ - HANDLE_OPCODE(WASM_OP_MISC_PREFIX); /* 0xfc */ \ - _name[WASM_OP_ATOMIC_PREFIX] = \ - HANDLE_OPCODE(WASM_OP_ATOMIC_PREFIX); /* 0xfe */ \ - DEF_DEBUG_BREAK_HANDLE(_name) \ - } while (0) +#define DEFINE_GOTO_TABLE(type, _name) \ + static type _name[WASM_INSTRUCTION_NUM] = { \ + HANDLE_OPCODE(WASM_OP_UNREACHABLE), /* 0x00 */ \ + HANDLE_OPCODE(WASM_OP_NOP), /* 0x01 */ \ + HANDLE_OPCODE(WASM_OP_BLOCK), /* 0x02 */ \ + HANDLE_OPCODE(WASM_OP_LOOP), /* 0x03 */ \ + HANDLE_OPCODE(WASM_OP_IF), /* 0x04 */ \ + HANDLE_OPCODE(WASM_OP_ELSE), /* 0x05 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x06), /* 0x06 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x07), /* 0x07 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x08), /* 0x08 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x09), /* 0x09 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x0a), /* 0x0a */ \ + HANDLE_OPCODE(WASM_OP_END), /* 0x0b */ \ + HANDLE_OPCODE(WASM_OP_BR), /* 0x0c */ \ + HANDLE_OPCODE(WASM_OP_BR_IF), /* 0x0d */ \ + HANDLE_OPCODE(WASM_OP_BR_TABLE), /* 0x0e */ \ + HANDLE_OPCODE(WASM_OP_RETURN), /* 0x0f */ \ + HANDLE_OPCODE(WASM_OP_CALL), /* 0x10 */ \ + HANDLE_OPCODE(WASM_OP_CALL_INDIRECT), /* 0x11 */ \ + HANDLE_OPCODE(WASM_OP_RETURN_CALL), /* 0x12 */ \ + HANDLE_OPCODE(WASM_OP_RETURN_CALL_INDIRECT), /* 0x13 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x14), /* 0x14 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x15), /* 0x15 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x16), /* 0x16 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x17), /* 0x17 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x18), /* 0x18 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x19), /* 0x19 */ \ + HANDLE_OPCODE(WASM_OP_DROP), /* 0x1a */ \ + HANDLE_OPCODE(WASM_OP_SELECT), /* 0x1b */ \ + HANDLE_OPCODE(WASM_OP_SELECT_T), /* 0x1c */ \ + HANDLE_OPCODE(WASM_OP_GET_GLOBAL_64), /* 0x1d */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL_64), /* 0x1e */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL_AUX_STACK), /* 0x1f */ \ + HANDLE_OPCODE(WASM_OP_GET_LOCAL), /* 0x20 */ \ + HANDLE_OPCODE(WASM_OP_SET_LOCAL), /* 0x21 */ \ + HANDLE_OPCODE(WASM_OP_TEE_LOCAL), /* 0x22 */ \ + HANDLE_OPCODE(WASM_OP_GET_GLOBAL), /* 0x23 */ \ + HANDLE_OPCODE(WASM_OP_SET_GLOBAL), /* 0x24 */ \ + HANDLE_OPCODE(WASM_OP_TABLE_GET), /* 0x25 */ \ + HANDLE_OPCODE(WASM_OP_TABLE_SET), /* 0x26 */ \ + HANDLE_OPCODE(WASM_OP_UNUSED_0x27), /* 0x27 */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD), /* 0x28 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD), /* 0x29 */ \ + HANDLE_OPCODE(WASM_OP_F32_LOAD), /* 0x2a */ \ + HANDLE_OPCODE(WASM_OP_F64_LOAD), /* 0x2b */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD8_S), /* 0x2c */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD8_U), /* 0x2d */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD16_S), /* 0x2e */ \ + HANDLE_OPCODE(WASM_OP_I32_LOAD16_U), /* 0x2f */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD8_S), /* 0x30 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD8_U), /* 0x31 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD16_S), /* 0x32 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD16_U), /* 0x33 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD32_S), /* 0x34 */ \ + HANDLE_OPCODE(WASM_OP_I64_LOAD32_U), /* 0x35 */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE), /* 0x36 */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE), /* 0x37 */ \ + HANDLE_OPCODE(WASM_OP_F32_STORE), /* 0x38 */ \ + HANDLE_OPCODE(WASM_OP_F64_STORE), /* 0x39 */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE8), /* 0x3a */ \ + HANDLE_OPCODE(WASM_OP_I32_STORE16), /* 0x3b */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE8), /* 0x3c */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE16), /* 0x3d */ \ + HANDLE_OPCODE(WASM_OP_I64_STORE32), /* 0x3e */ \ + HANDLE_OPCODE(WASM_OP_MEMORY_SIZE), /* 0x3f */ \ + HANDLE_OPCODE(WASM_OP_MEMORY_GROW), /* 0x40 */ \ + HANDLE_OPCODE(WASM_OP_I32_CONST), /* 0x41 */ \ + HANDLE_OPCODE(WASM_OP_I64_CONST), /* 0x42 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONST), /* 0x43 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONST), /* 0x44 */ \ + HANDLE_OPCODE(WASM_OP_I32_EQZ), /* 0x45 */ \ + HANDLE_OPCODE(WASM_OP_I32_EQ), /* 0x46 */ \ + HANDLE_OPCODE(WASM_OP_I32_NE), /* 0x47 */ \ + HANDLE_OPCODE(WASM_OP_I32_LT_S), /* 0x48 */ \ + HANDLE_OPCODE(WASM_OP_I32_LT_U), /* 0x49 */ \ + HANDLE_OPCODE(WASM_OP_I32_GT_S), /* 0x4a */ \ + HANDLE_OPCODE(WASM_OP_I32_GT_U), /* 0x4b */ \ + HANDLE_OPCODE(WASM_OP_I32_LE_S), /* 0x4c */ \ + HANDLE_OPCODE(WASM_OP_I32_LE_U), /* 0x4d */ \ + HANDLE_OPCODE(WASM_OP_I32_GE_S), /* 0x4e */ \ + HANDLE_OPCODE(WASM_OP_I32_GE_U), /* 0x4f */ \ + HANDLE_OPCODE(WASM_OP_I64_EQZ), /* 0x50 */ \ + HANDLE_OPCODE(WASM_OP_I64_EQ), /* 0x51 */ \ + HANDLE_OPCODE(WASM_OP_I64_NE), /* 0x52 */ \ + HANDLE_OPCODE(WASM_OP_I64_LT_S), /* 0x53 */ \ + HANDLE_OPCODE(WASM_OP_I64_LT_U), /* 0x54 */ \ + HANDLE_OPCODE(WASM_OP_I64_GT_S), /* 0x55 */ \ + HANDLE_OPCODE(WASM_OP_I64_GT_U), /* 0x56 */ \ + HANDLE_OPCODE(WASM_OP_I64_LE_S), /* 0x57 */ \ + HANDLE_OPCODE(WASM_OP_I64_LE_U), /* 0x58 */ \ + HANDLE_OPCODE(WASM_OP_I64_GE_S), /* 0x59 */ \ + HANDLE_OPCODE(WASM_OP_I64_GE_U), /* 0x5a */ \ + HANDLE_OPCODE(WASM_OP_F32_EQ), /* 0x5b */ \ + HANDLE_OPCODE(WASM_OP_F32_NE), /* 0x5c */ \ + HANDLE_OPCODE(WASM_OP_F32_LT), /* 0x5d */ \ + HANDLE_OPCODE(WASM_OP_F32_GT), /* 0x5e */ \ + HANDLE_OPCODE(WASM_OP_F32_LE), /* 0x5f */ \ + HANDLE_OPCODE(WASM_OP_F32_GE), /* 0x60 */ \ + HANDLE_OPCODE(WASM_OP_F64_EQ), /* 0x61 */ \ + HANDLE_OPCODE(WASM_OP_F64_NE), /* 0x62 */ \ + HANDLE_OPCODE(WASM_OP_F64_LT), /* 0x63 */ \ + HANDLE_OPCODE(WASM_OP_F64_GT), /* 0x64 */ \ + HANDLE_OPCODE(WASM_OP_F64_LE), /* 0x65 */ \ + HANDLE_OPCODE(WASM_OP_F64_GE), /* 0x66 */ \ + HANDLE_OPCODE(WASM_OP_I32_CLZ), /* 0x67 */ \ + HANDLE_OPCODE(WASM_OP_I32_CTZ), /* 0x68 */ \ + HANDLE_OPCODE(WASM_OP_I32_POPCNT), /* 0x69 */ \ + HANDLE_OPCODE(WASM_OP_I32_ADD), /* 0x6a */ \ + HANDLE_OPCODE(WASM_OP_I32_SUB), /* 0x6b */ \ + HANDLE_OPCODE(WASM_OP_I32_MUL), /* 0x6c */ \ + HANDLE_OPCODE(WASM_OP_I32_DIV_S), /* 0x6d */ \ + HANDLE_OPCODE(WASM_OP_I32_DIV_U), /* 0x6e */ \ + HANDLE_OPCODE(WASM_OP_I32_REM_S), /* 0x6f */ \ + HANDLE_OPCODE(WASM_OP_I32_REM_U), /* 0x70 */ \ + HANDLE_OPCODE(WASM_OP_I32_AND), /* 0x71 */ \ + HANDLE_OPCODE(WASM_OP_I32_OR), /* 0x72 */ \ + HANDLE_OPCODE(WASM_OP_I32_XOR), /* 0x73 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHL), /* 0x74 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHR_S), /* 0x75 */ \ + HANDLE_OPCODE(WASM_OP_I32_SHR_U), /* 0x76 */ \ + HANDLE_OPCODE(WASM_OP_I32_ROTL), /* 0x77 */ \ + HANDLE_OPCODE(WASM_OP_I32_ROTR), /* 0x78 */ \ + HANDLE_OPCODE(WASM_OP_I64_CLZ), /* 0x79 */ \ + HANDLE_OPCODE(WASM_OP_I64_CTZ), /* 0x7a */ \ + HANDLE_OPCODE(WASM_OP_I64_POPCNT), /* 0x7b */ \ + HANDLE_OPCODE(WASM_OP_I64_ADD), /* 0x7c */ \ + HANDLE_OPCODE(WASM_OP_I64_SUB), /* 0x7d */ \ + HANDLE_OPCODE(WASM_OP_I64_MUL), /* 0x7e */ \ + HANDLE_OPCODE(WASM_OP_I64_DIV_S), /* 0x7f */ \ + HANDLE_OPCODE(WASM_OP_I64_DIV_U), /* 0x80 */ \ + HANDLE_OPCODE(WASM_OP_I64_REM_S), /* 0x81 */ \ + HANDLE_OPCODE(WASM_OP_I64_REM_U), /* 0x82 */ \ + HANDLE_OPCODE(WASM_OP_I64_AND), /* 0x83 */ \ + HANDLE_OPCODE(WASM_OP_I64_OR), /* 0x84 */ \ + HANDLE_OPCODE(WASM_OP_I64_XOR), /* 0x85 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHL), /* 0x86 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHR_S), /* 0x87 */ \ + HANDLE_OPCODE(WASM_OP_I64_SHR_U), /* 0x88 */ \ + HANDLE_OPCODE(WASM_OP_I64_ROTL), /* 0x89 */ \ + HANDLE_OPCODE(WASM_OP_I64_ROTR), /* 0x8a */ \ + HANDLE_OPCODE(WASM_OP_F32_ABS), /* 0x8b */ \ + HANDLE_OPCODE(WASM_OP_F32_NEG), /* 0x8c */ \ + HANDLE_OPCODE(WASM_OP_F32_CEIL), /* 0x8d */ \ + HANDLE_OPCODE(WASM_OP_F32_FLOOR), /* 0x8e */ \ + HANDLE_OPCODE(WASM_OP_F32_TRUNC), /* 0x8f */ \ + HANDLE_OPCODE(WASM_OP_F32_NEAREST), /* 0x90 */ \ + HANDLE_OPCODE(WASM_OP_F32_SQRT), /* 0x91 */ \ + HANDLE_OPCODE(WASM_OP_F32_ADD), /* 0x92 */ \ + HANDLE_OPCODE(WASM_OP_F32_SUB), /* 0x93 */ \ + HANDLE_OPCODE(WASM_OP_F32_MUL), /* 0x94 */ \ + HANDLE_OPCODE(WASM_OP_F32_DIV), /* 0x95 */ \ + HANDLE_OPCODE(WASM_OP_F32_MIN), /* 0x96 */ \ + HANDLE_OPCODE(WASM_OP_F32_MAX), /* 0x97 */ \ + HANDLE_OPCODE(WASM_OP_F32_COPYSIGN), /* 0x98 */ \ + HANDLE_OPCODE(WASM_OP_F64_ABS), /* 0x99 */ \ + HANDLE_OPCODE(WASM_OP_F64_NEG), /* 0x9a */ \ + HANDLE_OPCODE(WASM_OP_F64_CEIL), /* 0x9b */ \ + HANDLE_OPCODE(WASM_OP_F64_FLOOR), /* 0x9c */ \ + HANDLE_OPCODE(WASM_OP_F64_TRUNC), /* 0x9d */ \ + HANDLE_OPCODE(WASM_OP_F64_NEAREST), /* 0x9e */ \ + HANDLE_OPCODE(WASM_OP_F64_SQRT), /* 0x9f */ \ + HANDLE_OPCODE(WASM_OP_F64_ADD), /* 0xa0 */ \ + HANDLE_OPCODE(WASM_OP_F64_SUB), /* 0xa1 */ \ + HANDLE_OPCODE(WASM_OP_F64_MUL), /* 0xa2 */ \ + HANDLE_OPCODE(WASM_OP_F64_DIV), /* 0xa3 */ \ + HANDLE_OPCODE(WASM_OP_F64_MIN), /* 0xa4 */ \ + HANDLE_OPCODE(WASM_OP_F64_MAX), /* 0xa5 */ \ + HANDLE_OPCODE(WASM_OP_F64_COPYSIGN), /* 0xa6 */ \ + HANDLE_OPCODE(WASM_OP_I32_WRAP_I64), /* 0xa7 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F32), /* 0xa8 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F32), /* 0xa9 */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_S_F64), /* 0xaa */ \ + HANDLE_OPCODE(WASM_OP_I32_TRUNC_U_F64), /* 0xab */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND_S_I32), /* 0xac */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND_U_I32), /* 0xad */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F32), /* 0xae */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F32), /* 0xaf */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_S_F64), /* 0xb0 */ \ + HANDLE_OPCODE(WASM_OP_I64_TRUNC_U_F64), /* 0xb1 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I32), /* 0xb2 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I32), /* 0xb3 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_S_I64), /* 0xb4 */ \ + HANDLE_OPCODE(WASM_OP_F32_CONVERT_U_I64), /* 0xb5 */ \ + HANDLE_OPCODE(WASM_OP_F32_DEMOTE_F64), /* 0xb6 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I32), /* 0xb7 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I32), /* 0xb8 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_S_I64), /* 0xb9 */ \ + HANDLE_OPCODE(WASM_OP_F64_CONVERT_U_I64), /* 0xba */ \ + HANDLE_OPCODE(WASM_OP_F64_PROMOTE_F32), /* 0xbb */ \ + HANDLE_OPCODE(WASM_OP_I32_REINTERPRET_F32), /* 0xbc */ \ + HANDLE_OPCODE(WASM_OP_I64_REINTERPRET_F64), /* 0xbd */ \ + HANDLE_OPCODE(WASM_OP_F32_REINTERPRET_I32), /* 0xbe */ \ + HANDLE_OPCODE(WASM_OP_F64_REINTERPRET_I64), /* 0xbf */ \ + HANDLE_OPCODE(WASM_OP_I32_EXTEND8_S), /* 0xc0 */ \ + HANDLE_OPCODE(WASM_OP_I32_EXTEND16_S), /* 0xc1 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND8_S), /* 0xc2 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND16_S), /* 0xc3 */ \ + HANDLE_OPCODE(WASM_OP_I64_EXTEND32_S), /* 0xc4 */ \ + HANDLE_OPCODE(WASM_OP_DROP_64), /* 0xc5 */ \ + HANDLE_OPCODE(WASM_OP_SELECT_64), /* 0xc6 */ \ + HANDLE_OPCODE(EXT_OP_GET_LOCAL_FAST), /* 0xc7 */ \ + HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_I64), /* 0xc8 */ \ + HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST), /* 0xc9 */ \ + HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST), /* 0xca */ \ + HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_I64), /* 0xcb */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP), /* 0xcc */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_I64), /* 0xcd */ \ + HANDLE_OPCODE(EXT_OP_COPY_STACK_VALUES), /* 0xce */ \ + HANDLE_OPCODE(WASM_OP_IMPDEP), /* 0xcf */ \ + HANDLE_OPCODE(WASM_OP_REF_NULL), /* 0xd0 */ \ + HANDLE_OPCODE(WASM_OP_REF_IS_NULL), /* 0xd1 */ \ + HANDLE_OPCODE(WASM_OP_REF_FUNC), /* 0xd2 */ \ + HANDLE_OPCODE(EXT_OP_BLOCK), /* 0xd3 */ \ + HANDLE_OPCODE(EXT_OP_LOOP), /* 0xd4 */ \ + HANDLE_OPCODE(EXT_OP_IF), /* 0xd5 */ \ + HANDLE_OPCODE(EXT_OP_BR_TABLE_CACHE), /* 0xd6 */ \ + SET_GOTO_TABLE_ELEM(WASM_OP_MISC_PREFIX), /* 0xfc */ \ + SET_GOTO_TABLE_ELEM(WASM_OP_ATOMIC_PREFIX), /* 0xfe */ \ + DEF_DEBUG_BREAK_HANDLE() \ + }; #ifdef __cplusplus } From babbc42ee39d8b7a37e8f31d67da87a84dafd10a Mon Sep 17 00:00:00 2001 From: eloparco Date: Mon, 20 Feb 2023 08:48:50 +0000 Subject: [PATCH 5/7] fix: move variables' declarations to the beginning of function --- core/iwasm/common/wasm_shared_memory.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 8c17a8b53d..29529fced9 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -385,7 +385,8 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, WASMModuleInstance *module_inst = (WASMModuleInstance *)module; AtomicWaitInfo *wait_info; AtomicWaitNode *wait_node; - bool check_ret, is_timeout; + WASMSharedMemNode *node; + bool check_ret, is_timeout, no_wait; bh_assert(module->module_type == Wasm_Module_Bytecode || module->module_type == Wasm_Module_AoT); @@ -417,11 +418,10 @@ wasm_runtime_atomic_wait(WASMModuleInstanceCommon *module, void *address, os_mutex_lock(&wait_info->wait_list_lock); - WASMSharedMemNode *node = - search_module((WASMModuleCommon *)module_inst->module); + node = search_module((WASMModuleCommon *)module_inst->module); os_mutex_lock(&node->shared_mem_lock); - bool no_wait = (!wait64 && *(uint32 *)address != (uint32)expect) - || (wait64 && *(uint64 *)address != expect); + no_wait = (!wait64 && *(uint32 *)address != (uint32)expect) + || (wait64 && *(uint64 *)address != expect); os_mutex_unlock(&node->shared_mem_lock); if (no_wait) { @@ -497,14 +497,15 @@ wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, WASMModuleInstance *module_inst = (WASMModuleInstance *)module; uint32 notify_result; AtomicWaitInfo *wait_info; + WASMSharedMemNode *node; + bool out_of_bounds; bh_assert(module->module_type == Wasm_Module_Bytecode || module->module_type == Wasm_Module_AoT); - WASMSharedMemNode *node = - search_module((WASMModuleCommon *)module_inst->module); + node = search_module((WASMModuleCommon *)module_inst->module); os_mutex_lock(&node->shared_mem_lock); - bool out_of_bounds = + out_of_bounds = ((uint8 *)address < module_inst->memories[0]->memory_data || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end); os_mutex_unlock(&node->shared_mem_lock); From 71fdf4f87ae14e182a4fbe448490399d1b9991bf Mon Sep 17 00:00:00 2001 From: eloparco Date: Mon, 20 Feb 2023 08:56:07 +0000 Subject: [PATCH 6/7] fix: revert changes in wasm_memory.c after fix in #1973 --- core/iwasm/common/wasm_memory.c | 41 ++++++++++++++------------------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/core/iwasm/common/wasm_memory.c b/core/iwasm/common/wasm_memory.c index b3838360e4..0aa2d6415c 100644 --- a/core/iwasm/common/wasm_memory.c +++ b/core/iwasm/common/wasm_memory.c @@ -39,7 +39,7 @@ wasm_memory_init_with_pool(void *mem, unsigned int bytes) mem_allocator_t _allocator = mem_allocator_create(mem, bytes); if (_allocator) { - __atomic_store_n(&memory_mode, MEMORY_MODE_POOL, __ATOMIC_SEQ_CST); + memory_mode = MEMORY_MODE_POOL; pool_allocator = _allocator; global_pool_size = bytes; return true; @@ -54,7 +54,7 @@ wasm_memory_init_with_allocator(void *_user_data, void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { - __atomic_store_n(&memory_mode, MEMORY_MODE_ALLOCATOR, __ATOMIC_SEQ_CST); + memory_mode = MEMORY_MODE_ALLOCATOR; allocator_user_data = _user_data; malloc_func = _malloc_func; realloc_func = _realloc_func; @@ -71,7 +71,7 @@ wasm_memory_init_with_allocator(void *_malloc_func, void *_realloc_func, void *_free_func) { if (_malloc_func && _free_func && _malloc_func != _free_func) { - __atomic_store_n(&memory_mode, MEMORY_MODE_ALLOCATOR, __ATOMIC_SEQ_CST); + memory_mode = MEMORY_MODE_ALLOCATOR; malloc_func = _malloc_func; realloc_func = _realloc_func; free_func = _free_func; @@ -106,8 +106,7 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, #endif } else if (mem_alloc_type == Alloc_With_System_Allocator) { - __atomic_store_n(&memory_mode, MEMORY_MODE_SYSTEM_ALLOCATOR, - __ATOMIC_SEQ_CST); + memory_mode = MEMORY_MODE_SYSTEM_ALLOCATOR; return true; } else { @@ -118,8 +117,7 @@ wasm_runtime_memory_init(mem_alloc_type_t mem_alloc_type, void wasm_runtime_memory_destroy() { - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_POOL) { + if (memory_mode == MEMORY_MODE_POOL) { #if BH_ENABLE_GC_VERIFY == 0 (void)mem_allocator_destroy(pool_allocator); #else @@ -130,14 +128,13 @@ wasm_runtime_memory_destroy() } #endif } - __atomic_store_n(&memory_mode, MEMORY_MODE_UNKNOWN, __ATOMIC_SEQ_CST); + memory_mode = MEMORY_MODE_UNKNOWN; } unsigned wasm_runtime_memory_pool_size() { - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_POOL) + if (memory_mode == MEMORY_MODE_POOL) return global_pool_size; else return UINT32_MAX; @@ -146,16 +143,15 @@ wasm_runtime_memory_pool_size() static inline void * wasm_runtime_malloc_internal(unsigned int size) { - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_UNKNOWN) { + if (memory_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_malloc failed: memory hasn't been initialize.\n"); return NULL; } - else if (mem_mode == MEMORY_MODE_POOL) { + else if (memory_mode == MEMORY_MODE_POOL) { return mem_allocator_malloc(pool_allocator, size); } - else if (mem_mode == MEMORY_MODE_ALLOCATOR) { + else if (memory_mode == MEMORY_MODE_ALLOCATOR) { #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 return malloc_func(allocator_user_data, size); #else @@ -170,16 +166,15 @@ wasm_runtime_malloc_internal(unsigned int size) static inline void * wasm_runtime_realloc_internal(void *ptr, unsigned int size) { - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_UNKNOWN) { + if (memory_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING( "wasm_runtime_realloc failed: memory hasn't been initialize.\n"); return NULL; } - else if (mem_mode == MEMORY_MODE_POOL) { + else if (memory_mode == MEMORY_MODE_POOL) { return mem_allocator_realloc(pool_allocator, ptr, size); } - else if (mem_mode == MEMORY_MODE_ALLOCATOR) { + else if (memory_mode == MEMORY_MODE_ALLOCATOR) { if (realloc_func) #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 return realloc_func(allocator_user_data, ptr, size); @@ -205,15 +200,14 @@ wasm_runtime_free_internal(void *ptr) return; } - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_UNKNOWN) { + if (memory_mode == MEMORY_MODE_UNKNOWN) { LOG_WARNING("warning: wasm_runtime_free failed: " "memory hasn't been initialize.\n"); } - else if (mem_mode == MEMORY_MODE_POOL) { + else if (memory_mode == MEMORY_MODE_POOL) { mem_allocator_free(pool_allocator, ptr); } - else if (mem_mode == MEMORY_MODE_ALLOCATOR) { + else if (memory_mode == MEMORY_MODE_ALLOCATOR) { #if WASM_MEM_ALLOC_WITH_USER_DATA != 0 free_func(allocator_user_data, ptr); #else @@ -255,8 +249,7 @@ wasm_runtime_free(void *ptr) bool wasm_runtime_get_mem_alloc_info(mem_alloc_info_t *mem_alloc_info) { - Memory_Mode mem_mode = __atomic_load_n(&memory_mode, __ATOMIC_SEQ_CST); - if (mem_mode == MEMORY_MODE_POOL) { + if (memory_mode == MEMORY_MODE_POOL) { return mem_allocator_get_alloc_info(pool_allocator, mem_alloc_info); } return false; From c714a9a827f5f923d3f421da236d536d56ea97f6 Mon Sep 17 00:00:00 2001 From: eloparco Date: Tue, 21 Feb 2023 01:14:20 +0000 Subject: [PATCH 7/7] fix: fix failing spec test for atomics --- core/iwasm/common/wasm_shared_memory.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/iwasm/common/wasm_shared_memory.c b/core/iwasm/common/wasm_shared_memory.c index 29529fced9..6295de0132 100644 --- a/core/iwasm/common/wasm_shared_memory.c +++ b/core/iwasm/common/wasm_shared_memory.c @@ -504,20 +504,22 @@ wasm_runtime_atomic_notify(WASMModuleInstanceCommon *module, void *address, || module->module_type == Wasm_Module_AoT); node = search_module((WASMModuleCommon *)module_inst->module); - os_mutex_lock(&node->shared_mem_lock); + if (node) + os_mutex_lock(&node->shared_mem_lock); out_of_bounds = ((uint8 *)address < module_inst->memories[0]->memory_data || (uint8 *)address + 4 > module_inst->memories[0]->memory_data_end); - os_mutex_unlock(&node->shared_mem_lock); if (out_of_bounds) { + if (node) + os_mutex_unlock(&node->shared_mem_lock); wasm_runtime_set_exception(module, "out of bounds memory access"); return -1; } - os_mutex_lock(&node->shared_mem_lock); wait_info = acquire_wait_info(address, false); - os_mutex_unlock(&node->shared_mem_lock); + if (node) + os_mutex_unlock(&node->shared_mem_lock); /* Nobody wait on this address */ if (!wait_info)