Implement memory access bound check with hardware trap for 64-bit platforms (#293)
Also implement native stack overflow check with hardware trap for 64-bit platforms Refine classic interpreter and fast interpreter to improve performance Update document
This commit is contained in:
@ -224,11 +224,9 @@ LOAD_I16(void *addr)
|
||||
#endif /* WASM_CPU_SUPPORTS_UNALIGNED_64BIT_ACCESS != 0 */
|
||||
|
||||
#define CHECK_MEMORY_OVERFLOW(bytes) do { \
|
||||
int32 offset1 = (int32)(offset + addr); \
|
||||
uint64 offset2 = (uint64)(uint32)(offset1 - heap_base_offset); \
|
||||
/* if (flags != 2) \
|
||||
LOG_VERBOSE("unaligned load/store, flag: %d.\n", flags); */ \
|
||||
if (offset2 + LOAD_SIZE[opcode - WASM_OP_I32_LOAD] <= total_mem_size) \
|
||||
int64 offset1 = (int64)(uint32)offset + (int64)(int32)addr; \
|
||||
if (heap_base_offset <= offset1 \
|
||||
&& offset1 <= (int64)linear_mem_size - bytes) \
|
||||
/* If offset1 is in valid range, maddr must also be in valid range, \
|
||||
no need to check it again. */ \
|
||||
maddr = memory->memory_data + offset1; \
|
||||
@ -973,12 +971,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
WASMMemoryInstance *memory = module->default_memory;
|
||||
int32 heap_base_offset = memory ? memory->heap_base_offset : 0;
|
||||
uint32 num_bytes_per_page = memory ? memory->num_bytes_per_page : 0;
|
||||
uint32 total_mem_size = memory ? num_bytes_per_page * memory->cur_page_count
|
||||
- heap_base_offset : 0;
|
||||
uint8 *global_data = module->global_data;
|
||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||
uint32 linear_mem_size = memory ? num_bytes_per_page * memory->cur_page_count : 0;
|
||||
#endif
|
||||
WASMTableInstance *table = module->default_table;
|
||||
WASMGlobalInstance *globals = module->globals;
|
||||
uint8 opcode_IMPDEP = WASM_OP_IMPDEP;
|
||||
@ -1015,12 +1009,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
#undef HANDLE_OPCODE
|
||||
#endif
|
||||
|
||||
/* Size of memory load.
|
||||
This starts with the first memory load operator at opcode 0x28 */
|
||||
uint32 LOAD_SIZE[] = {
|
||||
4, 8, 4, 8, 1, 1, 2, 2, 1, 1, 2, 2, 4, 4, /* loads */
|
||||
4, 8, 4, 8, 1, 2, 1, 2, 4 }; /* stores */
|
||||
|
||||
#if WASM_ENABLE_LABELS_AS_VALUES == 0
|
||||
while (frame_ip < frame_ip_end) {
|
||||
opcode = *frame_ip++;
|
||||
@ -1445,6 +1433,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
if ((global_idx == (uint32)aux_stack_top_global_idx)
|
||||
&& (*(uint32*)(frame_sp - 1) < exec_env->aux_stack_boundary))
|
||||
goto out_of_bounds;
|
||||
*(int32*)global_addr = POP_I32();
|
||||
break;
|
||||
case VALUE_TYPE_F32:
|
||||
*(int32*)global_addr = POP_I32();
|
||||
break;
|
||||
@ -1462,180 +1452,261 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
/* memory load instructions */
|
||||
HANDLE_OP (WASM_OP_I32_LOAD):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD):
|
||||
HANDLE_OP (WASM_OP_F32_LOAD):
|
||||
HANDLE_OP (WASM_OP_F64_LOAD):
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_S):
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_U):
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_S):
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_U):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_S):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_U):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_S):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_U):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_S):
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_U):
|
||||
{
|
||||
uint32 offset, flags, addr;
|
||||
GET_OPCODE();
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = (uint32)POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW();
|
||||
#if WASM_ENABLE_LABELS_AS_VALUES != 0
|
||||
static const void *handle_load_table[] = {
|
||||
&&HANDLE_LOAD_WASM_OP_I32_LOAD,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD,
|
||||
&&HANDLE_LOAD_WASM_OP_F32_LOAD,
|
||||
&&HANDLE_LOAD_WASM_OP_F64_LOAD,
|
||||
&&HANDLE_LOAD_WASM_OP_I32_LOAD8_S,
|
||||
&&HANDLE_LOAD_WASM_OP_I32_LOAD8_U,
|
||||
&&HANDLE_LOAD_WASM_OP_I32_LOAD16_S,
|
||||
&&HANDLE_LOAD_WASM_OP_I32_LOAD16_U,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD8_S,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD8_U,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD16_S,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD16_U,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD32_S,
|
||||
&&HANDLE_LOAD_WASM_OP_I64_LOAD32_U
|
||||
};
|
||||
#define HANDLE_OP_LOAD(opcode) HANDLE_LOAD_##opcode
|
||||
goto *handle_load_table[opcode - WASM_OP_I32_LOAD];
|
||||
#else
|
||||
#define HANDLE_OP_LOAD(opcode) case opcode
|
||||
switch (opcode)
|
||||
#endif
|
||||
{
|
||||
HANDLE_OP_LOAD(WASM_OP_I32_LOAD):
|
||||
PUSH_I32(LOAD_I32(maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD):
|
||||
PUSH_I64(LOAD_I64(maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_F32_LOAD):
|
||||
PUSH_I32(LOAD_I32(maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_F64_LOAD):
|
||||
PUSH_F64(LOAD_F64(maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I32_LOAD8_S):
|
||||
PUSH_I32(sign_ext_8_32(*(int8*)maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I32_LOAD8_U):
|
||||
PUSH_I32((uint32)(*(uint8*)maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I32_LOAD16_S):
|
||||
PUSH_I32(sign_ext_16_32(LOAD_I16(maddr)));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I32_LOAD16_U):
|
||||
PUSH_I32((uint32)(LOAD_U16(maddr)));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD8_S):
|
||||
PUSH_I64(sign_ext_8_64(*(int8*)maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD8_U):
|
||||
PUSH_I64((uint64)(*(uint8*)maddr));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD16_S):
|
||||
PUSH_I64(sign_ext_16_64(LOAD_I16(maddr)));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD16_U):
|
||||
PUSH_I64((uint64)(LOAD_U16(maddr)));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD32_S):
|
||||
PUSH_I64(sign_ext_32_64(LOAD_I32(maddr)));
|
||||
HANDLE_OP_END();
|
||||
HANDLE_OP_LOAD(WASM_OP_I64_LOAD32_U):
|
||||
PUSH_I64((uint64)(LOAD_U32(maddr)));
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
PUSH_I32(LOAD_I32(maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END ();
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD):
|
||||
HANDLE_OP (WASM_OP_F64_LOAD):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(8);
|
||||
PUSH_I64(LOAD_I64(maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_S):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
PUSH_I32(sign_ext_8_32(*(int8*)maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_U):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
PUSH_I32((uint32)(*(uint8*)maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_S):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
PUSH_I32(sign_ext_16_32(LOAD_I16(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_U):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
PUSH_I32((uint32)(LOAD_U16(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_S):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
PUSH_I64(sign_ext_8_64(*(int8*)maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_U):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
PUSH_I64((uint64)(*(uint8*)maddr));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_S):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
PUSH_I64(sign_ext_16_64(LOAD_I16(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_U):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
PUSH_I64((uint64)(LOAD_U16(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_S):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
opcode = *(frame_ip - 1);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
PUSH_I64(sign_ext_32_64(LOAD_I32(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_U):
|
||||
{
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
PUSH_I64((uint64)(LOAD_U32(maddr)));
|
||||
(void)flags;
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
/* memory store instructions */
|
||||
HANDLE_OP (WASM_OP_I32_STORE):
|
||||
HANDLE_OP (WASM_OP_F32_STORE):
|
||||
{
|
||||
uint32 offset, flags, addr;
|
||||
GET_OPCODE();
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
frame_sp--;
|
||||
addr = (uint32)POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW();
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
STORE_U32(maddr, frame_sp[1]);
|
||||
(void)flags;
|
||||
HANDLE_OP_END ();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_STORE):
|
||||
HANDLE_OP (WASM_OP_F64_STORE):
|
||||
{
|
||||
uint32 offset, flags, addr;
|
||||
GET_OPCODE();
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
frame_sp -= 2;
|
||||
addr = (uint32)POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW();
|
||||
addr = POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW(8);
|
||||
STORE_U32(maddr, frame_sp[1]);
|
||||
STORE_U32(maddr + 4, frame_sp[2]);
|
||||
(void)flags;
|
||||
HANDLE_OP_END ();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I32_STORE):
|
||||
HANDLE_OP (WASM_OP_I32_STORE8):
|
||||
HANDLE_OP (WASM_OP_I32_STORE16):
|
||||
{
|
||||
uint32 offset, flags, addr;
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
uint32 sval;
|
||||
GET_OPCODE();
|
||||
|
||||
opcode = *(frame_ip - 1);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
sval = (uint32)POP_I32();
|
||||
addr = (uint32)POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW();
|
||||
switch (opcode) {
|
||||
case WASM_OP_I32_STORE:
|
||||
STORE_U32(maddr, sval);
|
||||
break;
|
||||
case WASM_OP_I32_STORE8:
|
||||
addr = POP_I32();
|
||||
|
||||
if (opcode == WASM_OP_I32_STORE8) {
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(uint8*)maddr = (uint8)sval;
|
||||
break;
|
||||
case WASM_OP_I32_STORE16:
|
||||
STORE_U16(maddr, (uint16)sval);
|
||||
break;
|
||||
}
|
||||
else {
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
STORE_U16(maddr, (uint16)sval);
|
||||
}
|
||||
|
||||
(void)flags;
|
||||
HANDLE_OP_END ();
|
||||
}
|
||||
|
||||
HANDLE_OP (WASM_OP_I64_STORE):
|
||||
HANDLE_OP (WASM_OP_I64_STORE8):
|
||||
HANDLE_OP (WASM_OP_I64_STORE16):
|
||||
HANDLE_OP (WASM_OP_I64_STORE32):
|
||||
{
|
||||
uint32 offset, flags, addr;
|
||||
uint32 offset, flags;
|
||||
int32 addr;
|
||||
uint64 sval;
|
||||
GET_OPCODE();
|
||||
|
||||
opcode = *(frame_ip - 1);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, flags);
|
||||
read_leb_uint32(frame_ip, frame_ip_end, offset);
|
||||
sval = (uint64)POP_I64();
|
||||
addr = (uint32)POP_I32();
|
||||
CHECK_MEMORY_OVERFLOW();
|
||||
switch (opcode) {
|
||||
case WASM_OP_I64_STORE:
|
||||
STORE_I64(maddr, sval);
|
||||
break;
|
||||
case WASM_OP_I64_STORE8:
|
||||
addr = POP_I32();
|
||||
|
||||
if (opcode == WASM_OP_I64_STORE8) {
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(uint8*)maddr = (uint8)sval;
|
||||
break;
|
||||
case WASM_OP_I64_STORE16:
|
||||
}
|
||||
else if(opcode == WASM_OP_I64_STORE16) {
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
STORE_U16(maddr, (uint16)sval);
|
||||
break;
|
||||
case WASM_OP_I64_STORE32:
|
||||
}
|
||||
else {
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
STORE_U32(maddr, (uint32)sval);
|
||||
break;
|
||||
}
|
||||
(void)flags;
|
||||
HANDLE_OP_END ();
|
||||
@ -1671,11 +1742,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
PUSH_I32(prev_page_count);
|
||||
/* update the memory instance ptr */
|
||||
memory = module->default_memory;
|
||||
total_mem_size = num_bytes_per_page * memory->cur_page_count
|
||||
- heap_base_offset;
|
||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||
linear_mem_size = num_bytes_per_page * memory->cur_page_count;
|
||||
#endif
|
||||
}
|
||||
|
||||
(void)reserved;
|
||||
|
||||
@ -226,11 +226,9 @@ LOAD_I16(void *addr)
|
||||
#endif /* WASM_CPU_SUPPORTS_UNALIGNED_64BIT_ACCESS != 0 */
|
||||
|
||||
#define CHECK_MEMORY_OVERFLOW(bytes) do { \
|
||||
int32 offset1 = (int32)(offset + addr); \
|
||||
uint64 offset2 = (uint64)(uint32)(offset1 - heap_base_offset); \
|
||||
/* if (flags != 2) \
|
||||
LOG_VERBOSE("unaligned load/store, flag: %d.\n", flags); */ \
|
||||
if (offset2 + bytes <= total_mem_size) \
|
||||
int64 offset1 = (int64)(uint32)offset + (int64)(int32)addr; \
|
||||
if (heap_base_offset <= offset1 \
|
||||
&& offset1 <= (int64)linear_mem_size - bytes) \
|
||||
/* If offset1 is in valid range, maddr must also be in valid range,\
|
||||
no need to check it again. */ \
|
||||
maddr = memory->memory_data + offset1; \
|
||||
@ -412,6 +410,8 @@ read_leb(const uint8 *buf, uint32 *p_offset, uint32 maxbits, bool sign)
|
||||
p += _off; \
|
||||
} while (0)
|
||||
|
||||
#define read_uint32(p) (p += sizeof(uint32), *(uint32 *)(p - sizeof(uint32)))
|
||||
|
||||
#define GET_LOCAL_INDEX_TYPE_AND_OFFSET() do { \
|
||||
uint32 param_count = cur_func->param_count; \
|
||||
read_leb_uint32(frame_ip, frame_ip_end, local_idx); \
|
||||
@ -965,12 +965,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
WASMMemoryInstance *memory = module->default_memory;
|
||||
int32 heap_base_offset = memory ? memory->heap_base_offset : 0;
|
||||
uint32 num_bytes_per_page = memory ? memory->num_bytes_per_page : 0;
|
||||
uint32 total_mem_size = memory ? num_bytes_per_page * memory->cur_page_count
|
||||
- heap_base_offset : 0;
|
||||
uint8 *global_data = module->global_data;
|
||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||
uint32 linear_mem_size = memory ? num_bytes_per_page * memory->cur_page_count : 0;
|
||||
#endif
|
||||
WASMTableInstance *table = module->default_table;
|
||||
WASMGlobalInstance *globals = module->globals;
|
||||
uint8 opcode_IMPDEP = WASM_OP_IMPDEP;
|
||||
@ -1067,9 +1063,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
CHECK_SUSPEND_FLAGS();
|
||||
#endif
|
||||
count = GET_OPERAND(uint32, 0);
|
||||
didx = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
count = read_uint32(frame_ip);
|
||||
didx = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
|
||||
if (!(didx >= 0 && (uint32)didx < count))
|
||||
didx = count;
|
||||
@ -1096,9 +1092,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
CHECK_SUSPEND_FLAGS();
|
||||
#endif
|
||||
|
||||
tidx = GET_OPERAND(int32, 0);
|
||||
val = GET_OPERAND(int32, 2);
|
||||
frame_ip += 4;
|
||||
tidx = read_uint32(frame_ip);
|
||||
val = GET_OPERAND(int32, 0);
|
||||
frame_ip += 2;
|
||||
|
||||
if (tidx >= module->module->type_count) {
|
||||
wasm_set_exception(module, "type index is overflow");
|
||||
@ -1228,7 +1224,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
HANDLE_OP (WASM_OP_GET_GLOBAL):
|
||||
{
|
||||
global_idx = frame_lp[GET_OFFSET()];
|
||||
global_idx = read_uint32(frame_ip);
|
||||
addr_ret = GET_OFFSET();
|
||||
|
||||
bh_assert(global_idx < module->global_count);
|
||||
@ -1261,7 +1257,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
HANDLE_OP (WASM_OP_SET_GLOBAL):
|
||||
{
|
||||
global_idx = frame_lp[GET_OFFSET()];
|
||||
global_idx = read_uint32(frame_ip);
|
||||
addr1 = GET_OFFSET();
|
||||
|
||||
bh_assert(global_idx < module->global_count);
|
||||
@ -1281,6 +1277,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
if ((global_idx == (uint32)aux_stack_top_global_idx)
|
||||
&& (frame_lp[addr1] < exec_env->aux_stack_boundary))
|
||||
goto out_of_bounds;
|
||||
*(int32*)global_addr = frame_lp[addr1];
|
||||
break;
|
||||
case VALUE_TYPE_F32:
|
||||
*(int32*)global_addr = frame_lp[addr1];
|
||||
break;
|
||||
@ -1300,9 +1298,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I32_LOAD):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
frame_lp[addr_ret] = LOAD_I32(maddr);
|
||||
@ -1312,9 +1310,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(8);
|
||||
PUT_I64_TO_ADDR(frame_lp + addr_ret, LOAD_I64(maddr));
|
||||
@ -1324,9 +1322,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_S):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
frame_lp[addr_ret] = sign_ext_8_32(*(int8*)maddr);
|
||||
@ -1336,9 +1334,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I32_LOAD8_U):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
frame_lp[addr_ret] = (uint32)(*(uint8*)maddr);
|
||||
@ -1348,9 +1346,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_S):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
frame_lp[addr_ret] = sign_ext_16_32(LOAD_I16(maddr));
|
||||
@ -1360,9 +1358,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I32_LOAD16_U):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
frame_lp[addr_ret] = (uint32)(LOAD_U16(maddr));
|
||||
@ -1372,9 +1370,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_S):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(int64 *)(frame_lp + addr_ret) = sign_ext_8_64(*(int8*)maddr);
|
||||
@ -1384,9 +1382,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD8_U):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(int64 *)(frame_lp + addr_ret) = (uint64)(*(uint8*)maddr);
|
||||
@ -1396,9 +1394,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_S):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
*(int64 *)(frame_lp + addr_ret) = sign_ext_16_64(LOAD_I16(maddr));
|
||||
@ -1408,9 +1406,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD16_U):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
*(int64 *)(frame_lp + addr_ret) = (uint64)(LOAD_U16(maddr));
|
||||
@ -1420,9 +1418,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_S):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
*(int64 *)(frame_lp + addr_ret) = sign_ext_32_64(LOAD_I32(maddr));
|
||||
@ -1432,9 +1430,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (WASM_OP_I64_LOAD32_U):
|
||||
{
|
||||
uint32 offset, addr;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
offset = read_uint32(frame_ip);
|
||||
addr = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
addr_ret = GET_OFFSET();
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
*(int64 *)(frame_lp + addr_ret) = (uint64)(LOAD_U32(maddr));
|
||||
@ -1445,10 +1443,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint32 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint32, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
STORE_U32(maddr, sval);
|
||||
HANDLE_OP_END ();
|
||||
@ -1458,10 +1456,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint32 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint32, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(uint8*)maddr = (uint8)sval;
|
||||
HANDLE_OP_END ();
|
||||
@ -1471,10 +1469,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint32 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint32, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint32, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
STORE_U16(maddr, (uint16)sval);
|
||||
HANDLE_OP_END ();
|
||||
@ -1484,10 +1482,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint64 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint64, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint64, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(8);
|
||||
STORE_I64(maddr, sval);
|
||||
HANDLE_OP_END ();
|
||||
@ -1497,10 +1495,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint64 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint64, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint64, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(1);
|
||||
*(uint8*)maddr = (uint8)sval;
|
||||
HANDLE_OP_END ();
|
||||
@ -1510,10 +1508,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint64 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint64, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint64, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(2);
|
||||
STORE_U16(maddr, (uint16)sval);
|
||||
HANDLE_OP_END ();
|
||||
@ -1523,10 +1521,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 offset, addr;
|
||||
uint64 sval;
|
||||
offset = GET_OPERAND(uint32, 0);
|
||||
sval = GET_OPERAND(uint64, 2);
|
||||
addr = GET_OPERAND(uint32, 4);
|
||||
frame_ip += 6;
|
||||
offset = read_uint32(frame_ip);
|
||||
sval = GET_OPERAND(uint64, 0);
|
||||
addr = GET_OPERAND(uint32, 2);
|
||||
frame_ip += 4;
|
||||
CHECK_MEMORY_OVERFLOW(4);
|
||||
STORE_U32(maddr, (uint32)sval);
|
||||
HANDLE_OP_END ();
|
||||
@ -1563,11 +1561,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
frame_lp[addr_ret] = prev_page_count;
|
||||
/* update the memory instance ptr */
|
||||
memory = module->default_memory;
|
||||
total_mem_size = num_bytes_per_page * memory->cur_page_count
|
||||
- heap_base_offset;
|
||||
#if WASM_ENABLE_BULK_MEMORY != 0
|
||||
linear_mem_size = num_bytes_per_page * memory->cur_page_count;
|
||||
#endif
|
||||
}
|
||||
|
||||
(void)reserved;
|
||||
@ -2335,23 +2329,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
HANDLE_OP (EXT_OP_COPY_STACK_TOP):
|
||||
addr1 = GET_OFFSET();
|
||||
addr2 = GET_OFFSET();
|
||||
#if defined(BUILD_TARGET_X86_32)
|
||||
bh_memcpy_s(frame_lp + addr2, sizeof(int32),
|
||||
frame_lp + addr1, sizeof(int32));
|
||||
#else
|
||||
frame_lp[addr2] = frame_lp[addr1];
|
||||
#endif
|
||||
HANDLE_OP_END ();
|
||||
|
||||
HANDLE_OP (EXT_OP_COPY_STACK_TOP_I64):
|
||||
addr1 = GET_OFFSET();
|
||||
addr2 = GET_OFFSET();
|
||||
#if defined(BUILD_TARGET_X86_32)
|
||||
bh_memcpy_s(frame_lp + addr2, sizeof(int64),
|
||||
frame_lp + addr1, sizeof(int64));
|
||||
#else
|
||||
*(float64*)(frame_lp + addr2) = *(float64*)(frame_lp + addr1);
|
||||
#endif
|
||||
*(uint64*)(frame_lp + addr2) = *(uint64*)(frame_lp + addr1);
|
||||
HANDLE_OP_END ();
|
||||
|
||||
HANDLE_OP (WASM_OP_SET_LOCAL):
|
||||
@ -2441,8 +2425,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
uint64 bytes, offset, seg_len;
|
||||
uint8* data;
|
||||
|
||||
segment = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
segment = read_uint32(frame_ip);
|
||||
|
||||
bytes = (uint64)POP_I32();
|
||||
offset = (uint64)POP_I32();
|
||||
@ -2463,8 +2446,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
{
|
||||
uint32 segment;
|
||||
|
||||
segment = GET_OPERAND(uint32, 0);
|
||||
frame_ip += 2;
|
||||
segment = read_uint32(frame_ip);
|
||||
|
||||
module->module->data_segments[segment]->data_length = 0;
|
||||
|
||||
@ -2521,7 +2503,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
CHECK_SUSPEND_FLAGS();
|
||||
#endif
|
||||
fidx = frame_lp[GET_OFFSET()];
|
||||
fidx = read_uint32(frame_ip);
|
||||
#if WASM_ENABLE_MULTI_MODULE != 0
|
||||
if (fidx >= module->function_count) {
|
||||
wasm_set_exception(module, "unknown function");
|
||||
|
||||
@ -3889,13 +3889,13 @@ wasm_loader_check_br(WASMLoaderContext *ctx, uint32 depth,
|
||||
LOG_OP("%d\t", byte); \
|
||||
} while (0)
|
||||
|
||||
#define emit_leb() do { \
|
||||
wasm_loader_emit_leb(loader_ctx, p_org, p); \
|
||||
#define emit_uint32(ctx, value) do { \
|
||||
wasm_loader_emit_uint32(ctx, value); \
|
||||
LOG_OP("%d\t", value); \
|
||||
} while (0)
|
||||
|
||||
#define emit_const(value) do { \
|
||||
GET_CONST_OFFSET(VALUE_TYPE_I32, value); \
|
||||
emit_operand(loader_ctx, operand_offset); \
|
||||
#define emit_leb() do { \
|
||||
wasm_loader_emit_leb(loader_ctx, p_org, p); \
|
||||
} while (0)
|
||||
|
||||
static bool
|
||||
@ -3930,6 +3930,17 @@ wasm_loader_ctx_reinit(WASMLoaderContext *ctx)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
wasm_loader_emit_uint32(WASMLoaderContext *ctx, uint32 value)
|
||||
{
|
||||
if (ctx->p_code_compiled) {
|
||||
*(uint32*)(ctx->p_code_compiled) = value;
|
||||
ctx->p_code_compiled += sizeof(uint32);
|
||||
}
|
||||
else
|
||||
ctx->code_compiled_size += sizeof(uint32);
|
||||
}
|
||||
|
||||
static void
|
||||
wasm_loader_emit_int16(WASMLoaderContext *ctx, int16 value)
|
||||
{
|
||||
@ -5036,7 +5047,7 @@ re_scan:
|
||||
|
||||
read_leb_uint32(p, p_end, count);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(count);
|
||||
emit_uint32(loader_ctx, count);
|
||||
#endif
|
||||
POP_I32();
|
||||
|
||||
@ -5097,7 +5108,7 @@ re_scan:
|
||||
read_leb_uint32(p, p_end, func_idx);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
// we need to emit func_idx before arguments
|
||||
emit_const(func_idx);
|
||||
emit_uint32(loader_ctx, func_idx);
|
||||
#endif
|
||||
|
||||
if (func_idx >= module->import_function_count + module->function_count) {
|
||||
@ -5150,7 +5161,7 @@ re_scan:
|
||||
read_leb_uint32(p, p_end, type_idx);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
// we need to emit func_idx before arguments
|
||||
emit_const(type_idx);
|
||||
emit_uint32(loader_ctx, type_idx);
|
||||
#endif
|
||||
|
||||
/* reserved byte 0x00 */
|
||||
@ -5476,7 +5487,7 @@ re_scan:
|
||||
|
||||
PUSH_TYPE(global_type);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(global_idx);
|
||||
emit_uint32(loader_ctx, global_idx);
|
||||
PUSH_OFFSET_TYPE(global_type);
|
||||
#endif
|
||||
break;
|
||||
@ -5513,7 +5524,7 @@ re_scan:
|
||||
|
||||
POP_TYPE(global_type);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(global_idx);
|
||||
emit_uint32(loader_ctx, global_idx);
|
||||
POP_OFFSET_TYPE(global_type);
|
||||
#endif
|
||||
break;
|
||||
@ -5572,7 +5583,7 @@ re_scan:
|
||||
goto fail;
|
||||
}
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(mem_offset);
|
||||
emit_uint32(loader_ctx, mem_offset);
|
||||
#endif
|
||||
switch (opcode)
|
||||
{
|
||||
@ -5951,7 +5962,7 @@ re_scan:
|
||||
case WASM_OP_MEMORY_INIT:
|
||||
read_leb_uint32(p, p_end, segment_index);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(segment_index);
|
||||
emit_uint32(loader_ctx, segment_index);
|
||||
#endif
|
||||
if (module->import_memory_count == 0 && module->memory_count == 0)
|
||||
goto fail_unknown_memory;
|
||||
@ -5977,7 +5988,7 @@ re_scan:
|
||||
case WASM_OP_DATA_DROP:
|
||||
read_leb_uint32(p, p_end, segment_index);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(segment_index);
|
||||
emit_uint32(loader_ctx, segment_index);
|
||||
#endif
|
||||
if (segment_index >= module->data_seg_count) {
|
||||
set_error_buf(error_buf, error_buf_size,
|
||||
|
||||
@ -2881,13 +2881,13 @@ wasm_loader_check_br(WASMLoaderContext *ctx, uint32 depth,
|
||||
LOG_OP("%d\t", byte); \
|
||||
} while (0)
|
||||
|
||||
#define emit_leb() do { \
|
||||
wasm_loader_emit_leb(loader_ctx, p_org, p); \
|
||||
#define emit_uint32(ctx, value) do { \
|
||||
wasm_loader_emit_uint32(ctx, value); \
|
||||
LOG_OP("%d\t", value); \
|
||||
} while (0)
|
||||
|
||||
#define emit_const(value) do { \
|
||||
GET_CONST_OFFSET(VALUE_TYPE_I32, value); \
|
||||
emit_operand(loader_ctx, operand_offset); \
|
||||
#define emit_leb() do { \
|
||||
wasm_loader_emit_leb(loader_ctx, p_org, p); \
|
||||
} while (0)
|
||||
|
||||
static bool
|
||||
@ -2922,6 +2922,17 @@ wasm_loader_ctx_reinit(WASMLoaderContext *ctx)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
wasm_loader_emit_uint32(WASMLoaderContext *ctx, uint32 value)
|
||||
{
|
||||
if (ctx->p_code_compiled) {
|
||||
*(uint32*)(ctx->p_code_compiled) = value;
|
||||
ctx->p_code_compiled += sizeof(uint32);
|
||||
}
|
||||
else
|
||||
ctx->code_compiled_size += sizeof(uint32);
|
||||
}
|
||||
|
||||
static void
|
||||
wasm_loader_emit_int16(WASMLoaderContext *ctx, int16 value)
|
||||
{
|
||||
@ -3968,7 +3979,7 @@ re_scan:
|
||||
|
||||
read_leb_uint32(p, p_end, count);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(count);
|
||||
emit_uint32(loader_ctx, count);
|
||||
#endif
|
||||
POP_I32();
|
||||
|
||||
@ -4025,7 +4036,7 @@ re_scan:
|
||||
read_leb_uint32(p, p_end, func_idx);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
// we need to emit func_idx before arguments
|
||||
emit_const(func_idx);
|
||||
emit_uint32(loader_ctx, func_idx);
|
||||
#endif
|
||||
|
||||
bh_assert(func_idx < module->import_function_count
|
||||
@ -4069,7 +4080,7 @@ re_scan:
|
||||
read_leb_uint32(p, p_end, type_idx);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
// we need to emit func_idx before arguments
|
||||
emit_const(type_idx);
|
||||
emit_uint32(loader_ctx, type_idx);
|
||||
#endif
|
||||
|
||||
/* reserved byte 0x00 */
|
||||
@ -4369,7 +4380,7 @@ re_scan:
|
||||
|
||||
PUSH_TYPE(global_type);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(global_idx);
|
||||
emit_uint32(loader_ctx, global_idx);
|
||||
PUSH_OFFSET_TYPE(global_type);
|
||||
#endif
|
||||
break;
|
||||
@ -4396,7 +4407,7 @@ re_scan:
|
||||
|
||||
POP_TYPE(global_type);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(global_idx);
|
||||
emit_uint32(loader_ctx, global_idx);
|
||||
POP_OFFSET_TYPE(global_type);
|
||||
#endif
|
||||
(void)is_mutable;
|
||||
@ -4452,7 +4463,7 @@ re_scan:
|
||||
read_leb_uint32(p, p_end, align); /* align */
|
||||
read_leb_uint32(p, p_end, mem_offset); /* offset */
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(mem_offset);
|
||||
emit_uint32(loader_ctx, mem_offset);
|
||||
#endif
|
||||
switch (opcode)
|
||||
{
|
||||
@ -4823,7 +4834,7 @@ re_scan:
|
||||
case WASM_OP_MEMORY_INIT:
|
||||
read_leb_uint32(p, p_end, segment_index);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(segment_index);
|
||||
emit_uint32(loader_ctx, segment_index);
|
||||
#endif
|
||||
bh_assert(module->import_memory_count
|
||||
+ module->memory_count > 0);
|
||||
@ -4841,7 +4852,7 @@ re_scan:
|
||||
case WASM_OP_DATA_DROP:
|
||||
read_leb_uint32(p, p_end, segment_index);
|
||||
#if WASM_ENABLE_FAST_INTERP != 0
|
||||
emit_const(segment_index);
|
||||
emit_uint32(loader_ctx, segment_index);
|
||||
#endif
|
||||
bh_assert(segment_index < module->data_seg_count);
|
||||
bh_assert(module->data_seg_count1 > 0);
|
||||
|
||||
Reference in New Issue
Block a user