mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-08 20:56:13 +00:00
Fix fast-jit accessing shared memory's fields issue (#2841)
For shared memory, runtime should get the memories pointer from module_inst first, then get memory instance from memories array, and then get the fields of the memory instance.
This commit is contained in:
parent
162a977006
commit
3d0342fbc8
|
@ -137,6 +137,7 @@ check_and_seek(JitCompContext *cc, JitReg addr, uint32 offset, uint32 bytes)
|
||||||
{
|
{
|
||||||
JitReg memory_boundary = 0, offset1;
|
JitReg memory_boundary = 0, offset1;
|
||||||
#ifndef OS_ENABLE_HW_BOUND_CHECK
|
#ifndef OS_ENABLE_HW_BOUND_CHECK
|
||||||
|
JitReg cur_page_count;
|
||||||
/* the default memory */
|
/* the default memory */
|
||||||
uint32 mem_idx = 0;
|
uint32 mem_idx = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -146,16 +147,10 @@ check_and_seek(JitCompContext *cc, JitReg addr, uint32 offset, uint32 bytes)
|
||||||
/* 1. shortcut if the memory size is 0 */
|
/* 1. shortcut if the memory size is 0 */
|
||||||
if (cc->cur_wasm_module->memories != NULL
|
if (cc->cur_wasm_module->memories != NULL
|
||||||
&& 0 == cc->cur_wasm_module->memories[mem_idx].init_page_count) {
|
&& 0 == cc->cur_wasm_module->memories[mem_idx].init_page_count) {
|
||||||
JitReg module_inst, cur_page_count;
|
|
||||||
uint32 cur_page_count_offset =
|
cur_page_count = get_cur_page_count_reg(cc->jit_frame, mem_idx);
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, cur_page_count);
|
|
||||||
|
|
||||||
/* if (cur_mem_page_count == 0) goto EXCEPTION */
|
/* if (cur_mem_page_count == 0) goto EXCEPTION */
|
||||||
module_inst = get_module_inst_reg(cc->jit_frame);
|
|
||||||
cur_page_count = jit_cc_new_reg_I32(cc);
|
|
||||||
GEN_INSN(LDI32, cur_page_count, module_inst,
|
|
||||||
NEW_CONST(I32, cur_page_count_offset));
|
|
||||||
GEN_INSN(CMP, cc->cmp_reg, cur_page_count, NEW_CONST(I32, 0));
|
GEN_INSN(CMP, cc->cmp_reg, cur_page_count, NEW_CONST(I32, 0));
|
||||||
if (!jit_emit_exception(cc, EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS,
|
if (!jit_emit_exception(cc, EXCE_OUT_OF_BOUNDS_MEMORY_ACCESS,
|
||||||
JIT_OP_BEQ, cc->cmp_reg, NULL)) {
|
JIT_OP_BEQ, cc->cmp_reg, NULL)) {
|
||||||
|
@ -580,15 +575,9 @@ fail:
|
||||||
bool
|
bool
|
||||||
jit_compile_op_memory_size(JitCompContext *cc, uint32 mem_idx)
|
jit_compile_op_memory_size(JitCompContext *cc, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitReg module_inst, cur_page_count;
|
JitReg cur_page_count;
|
||||||
uint32 cur_page_count_offset =
|
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, cur_page_count);
|
|
||||||
|
|
||||||
module_inst = get_module_inst_reg(cc->jit_frame);
|
cur_page_count = get_cur_page_count_reg(cc->jit_frame, mem_idx);
|
||||||
cur_page_count = jit_cc_new_reg_I32(cc);
|
|
||||||
GEN_INSN(LDI32, cur_page_count, module_inst,
|
|
||||||
NEW_CONST(I32, cur_page_count_offset));
|
|
||||||
|
|
||||||
PUSH_I32(cur_page_count);
|
PUSH_I32(cur_page_count);
|
||||||
|
|
||||||
|
@ -600,18 +589,11 @@ fail:
|
||||||
bool
|
bool
|
||||||
jit_compile_op_memory_grow(JitCompContext *cc, uint32 mem_idx)
|
jit_compile_op_memory_grow(JitCompContext *cc, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitReg module_inst, grow_res, res;
|
JitReg grow_res, res;
|
||||||
JitReg prev_page_count, inc_page_count, args[2];
|
JitReg prev_page_count, inc_page_count, args[2];
|
||||||
|
|
||||||
/* Get current page count */
|
/* Get current page count as prev_page_count */
|
||||||
uint32 cur_page_count_offset =
|
prev_page_count = get_cur_page_count_reg(cc->jit_frame, mem_idx);
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, cur_page_count);
|
|
||||||
|
|
||||||
module_inst = get_module_inst_reg(cc->jit_frame);
|
|
||||||
prev_page_count = jit_cc_new_reg_I32(cc);
|
|
||||||
GEN_INSN(LDI32, prev_page_count, module_inst,
|
|
||||||
NEW_CONST(I32, cur_page_count_offset));
|
|
||||||
|
|
||||||
/* Call wasm_enlarge_memory */
|
/* Call wasm_enlarge_memory */
|
||||||
POP_I32(inc_page_count);
|
POP_I32(inc_page_count);
|
||||||
|
|
|
@ -218,42 +218,149 @@ get_aux_stack_bottom_reg(JitFrame *frame)
|
||||||
return frame->aux_stack_bottom_reg;
|
return frame->aux_stack_bottom_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
static bool
|
||||||
|
is_shared_memory(WASMModule *module, uint32 mem_idx)
|
||||||
|
{
|
||||||
|
WASMMemory *memory;
|
||||||
|
WASMMemoryImport *memory_import;
|
||||||
|
bool is_shared;
|
||||||
|
|
||||||
|
if (mem_idx < module->import_memory_count) {
|
||||||
|
memory_import = &(module->import_memories[mem_idx].u.memory);
|
||||||
|
is_shared = memory_import->flags & 0x02 ? true : false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
memory = &module->memories[mem_idx - module->import_memory_count];
|
||||||
|
is_shared = memory->flags & 0x02 ? true : false;
|
||||||
|
}
|
||||||
|
return is_shared;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
JitReg
|
||||||
|
get_memory_inst_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
|
{
|
||||||
|
JitCompContext *cc = frame->cc;
|
||||||
|
JitReg module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
uint32 memory_inst_offset;
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
JitReg memories_addr;
|
||||||
|
uint32 memories_offset;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].memory_inst)
|
||||||
|
return frame->memory_regs[mem_idx].memory_inst;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].memory_inst =
|
||||||
|
cc->memory_regs[mem_idx].memory_inst;
|
||||||
|
|
||||||
|
bh_assert(mem_idx == 0);
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
|
if (is_shared) {
|
||||||
|
memories_addr = jit_cc_new_reg_ptr(cc);
|
||||||
|
memories_offset = (uint32)offsetof(WASMModuleInstance, memories);
|
||||||
|
/* module_inst->memories */
|
||||||
|
GEN_INSN(LDPTR, memories_addr, module_inst_reg,
|
||||||
|
NEW_CONST(I32, memories_offset));
|
||||||
|
/* module_inst->memories[mem_idx], mem_idx can only be 0 now */
|
||||||
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_inst, memories_addr,
|
||||||
|
NEW_CONST(I32, mem_idx));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
memory_inst_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes);
|
||||||
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_inst,
|
||||||
|
module_inst_reg, NEW_CONST(I32, memory_inst_offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
return frame->memory_regs[mem_idx].memory_inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
JitReg
|
||||||
|
get_cur_page_count_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
|
{
|
||||||
|
JitCompContext *cc = frame->cc;
|
||||||
|
JitReg module_inst_reg;
|
||||||
|
uint32 cur_page_count_offset;
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].cur_page_count)
|
||||||
|
return frame->memory_regs[mem_idx].cur_page_count;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].cur_page_count =
|
||||||
|
cc->memory_regs[mem_idx].cur_page_count;
|
||||||
|
|
||||||
|
/* Get current page count */
|
||||||
|
bh_assert(mem_idx == 0);
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
cur_page_count_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, cur_page_count);
|
||||||
|
/* memories[mem_idx]->cur_page_count_offset */
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].cur_page_count,
|
||||||
|
memory_inst_reg, NEW_CONST(I32, cur_page_count_offset));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
cur_page_count_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, cur_page_count);
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].cur_page_count,
|
||||||
|
module_inst_reg, NEW_CONST(I32, cur_page_count_offset));
|
||||||
|
}
|
||||||
|
|
||||||
|
return frame->memory_regs[mem_idx].cur_page_count;
|
||||||
|
}
|
||||||
|
|
||||||
JitReg
|
JitReg
|
||||||
get_memory_data_reg(JitFrame *frame, uint32 mem_idx)
|
get_memory_data_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 memory_data_offset;
|
uint32 memory_data_offset;
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].memory_data)
|
||||||
|
return frame->memory_regs[mem_idx].memory_data;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].memory_data =
|
||||||
|
cc->memory_regs[mem_idx].memory_data;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
#if WASM_ENABLE_SHARED_MEMORY != 0
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
uint32 memories_offset = (uint32)offsetof(WASMModuleInstance, memories);
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
JitReg memories_addr = jit_cc_new_reg_ptr(cc);
|
if (is_shared) {
|
||||||
JitReg memories_0_addr = jit_cc_new_reg_ptr(cc);
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
memory_data_offset = (uint32)offsetof(WASMMemoryInstance, memory_data);
|
memory_data_offset = (uint32)offsetof(WASMMemoryInstance, memory_data);
|
||||||
if (!frame->memory_regs[mem_idx].memory_data) {
|
/* memories[mem_idx]->memory_data */
|
||||||
frame->memory_regs[mem_idx].memory_data =
|
|
||||||
cc->memory_regs[mem_idx].memory_data;
|
|
||||||
/* module_inst->memories */
|
|
||||||
GEN_INSN(LDPTR, memories_addr, module_inst_reg,
|
|
||||||
NEW_CONST(I32, memories_offset));
|
|
||||||
/* module_inst->memories[0] */
|
|
||||||
GEN_INSN(LDPTR, memories_0_addr, memories_addr, NEW_CONST(I32, 0));
|
|
||||||
/* memories[0]->memory_data */
|
|
||||||
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data,
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data,
|
||||||
memories_0_addr, NEW_CONST(I32, memory_data_offset));
|
memory_inst_reg, NEW_CONST(I32, memory_data_offset));
|
||||||
}
|
}
|
||||||
#else
|
else
|
||||||
memory_data_offset =
|
#endif
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
{
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, memory_data);
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
if (!frame->memory_regs[mem_idx].memory_data) {
|
memory_data_offset =
|
||||||
frame->memory_regs[mem_idx].memory_data =
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
cc->memory_regs[mem_idx].memory_data;
|
+ (uint32)offsetof(WASMMemoryInstance, memory_data);
|
||||||
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data,
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data,
|
||||||
module_inst_reg, NEW_CONST(I32, memory_data_offset));
|
module_inst_reg, NEW_CONST(I32, memory_data_offset));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return frame->memory_regs[mem_idx].memory_data;
|
return frame->memory_regs[mem_idx].memory_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,16 +368,37 @@ JitReg
|
||||||
get_memory_data_end_reg(JitFrame *frame, uint32 mem_idx)
|
get_memory_data_end_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 memory_data_end_offset =
|
uint32 memory_data_end_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, memory_data_end);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].memory_data_end)
|
||||||
|
return frame->memory_regs[mem_idx].memory_data_end;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].memory_data_end =
|
||||||
|
cc->memory_regs[mem_idx].memory_data_end;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
if (!frame->memory_regs[mem_idx].memory_data_end) {
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
frame->memory_regs[mem_idx].memory_data_end =
|
if (is_shared) {
|
||||||
cc->memory_regs[mem_idx].memory_data_end;
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
memory_data_end_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, memory_data_end);
|
||||||
|
/* memories[mem_idx]->memory_data_end */
|
||||||
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data_end,
|
||||||
|
memory_inst_reg, NEW_CONST(I32, memory_data_end_offset));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
memory_data_end_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, memory_data_end);
|
||||||
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data_end,
|
GEN_INSN(LDPTR, frame->memory_regs[mem_idx].memory_data_end,
|
||||||
module_inst_reg, NEW_CONST(I32, memory_data_end_offset));
|
module_inst_reg, NEW_CONST(I32, memory_data_end_offset));
|
||||||
}
|
}
|
||||||
|
@ -281,16 +409,43 @@ JitReg
|
||||||
get_mem_bound_check_1byte_reg(JitFrame *frame, uint32 mem_idx)
|
get_mem_bound_check_1byte_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 mem_bound_check_1byte_offset =
|
uint32 mem_bound_check_1byte_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_1byte);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].mem_bound_check_1byte)
|
||||||
|
return frame->memory_regs[mem_idx].mem_bound_check_1byte;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].mem_bound_check_1byte =
|
||||||
|
cc->memory_regs[mem_idx].mem_bound_check_1byte;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
|
||||||
if (!frame->memory_regs[mem_idx].mem_bound_check_1byte) {
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
frame->memory_regs[mem_idx].mem_bound_check_1byte =
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
cc->memory_regs[mem_idx].mem_bound_check_1byte;
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
mem_bound_check_1byte_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, mem_bound_check_1byte);
|
||||||
|
/* memories[mem_idx]->mem_bound_check_1byte */
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_1byte,
|
||||||
|
memory_inst_reg, NEW_CONST(I32, mem_bound_check_1byte_offset));
|
||||||
|
#else
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].mem_bound_check_1byte,
|
||||||
|
memory_inst_reg, NEW_CONST(I32, mem_bound_check_1byte_offset));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
mem_bound_check_1byte_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_1byte);
|
||||||
#if UINTPTR_MAX == UINT64_MAX
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_1byte,
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_1byte,
|
||||||
module_inst_reg, NEW_CONST(I32, mem_bound_check_1byte_offset));
|
module_inst_reg, NEW_CONST(I32, mem_bound_check_1byte_offset));
|
||||||
|
@ -306,16 +461,45 @@ JitReg
|
||||||
get_mem_bound_check_2bytes_reg(JitFrame *frame, uint32 mem_idx)
|
get_mem_bound_check_2bytes_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 mem_bound_check_2bytes_offset =
|
uint32 mem_bound_check_2bytes_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_2bytes);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].mem_bound_check_2bytes)
|
||||||
|
return frame->memory_regs[mem_idx].mem_bound_check_2bytes;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].mem_bound_check_2bytes =
|
||||||
|
cc->memory_regs[mem_idx].mem_bound_check_2bytes;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
|
||||||
if (!frame->memory_regs[mem_idx].mem_bound_check_2bytes) {
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
frame->memory_regs[mem_idx].mem_bound_check_2bytes =
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
cc->memory_regs[mem_idx].mem_bound_check_2bytes;
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
mem_bound_check_2bytes_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, mem_bound_check_2bytes);
|
||||||
|
/* memories[mem_idx]->mem_bound_check_2bytes */
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_2bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_2bytes_offset));
|
||||||
|
#else
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].mem_bound_check_2bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_2bytes_offset));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
mem_bound_check_2bytes_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_2bytes);
|
||||||
#if UINTPTR_MAX == UINT64_MAX
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_2bytes,
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_2bytes,
|
||||||
module_inst_reg,
|
module_inst_reg,
|
||||||
|
@ -333,16 +517,45 @@ JitReg
|
||||||
get_mem_bound_check_4bytes_reg(JitFrame *frame, uint32 mem_idx)
|
get_mem_bound_check_4bytes_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 mem_bound_check_4bytes_offset =
|
uint32 mem_bound_check_4bytes_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_4bytes);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].mem_bound_check_4bytes)
|
||||||
|
return frame->memory_regs[mem_idx].mem_bound_check_4bytes;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].mem_bound_check_4bytes =
|
||||||
|
cc->memory_regs[mem_idx].mem_bound_check_4bytes;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
|
||||||
if (!frame->memory_regs[mem_idx].mem_bound_check_4bytes) {
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
frame->memory_regs[mem_idx].mem_bound_check_4bytes =
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
cc->memory_regs[mem_idx].mem_bound_check_4bytes;
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
mem_bound_check_4bytes_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, mem_bound_check_4bytes);
|
||||||
|
/* memories[mem_idx]->mem_bound_check_4bytes */
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_4bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_4bytes_offset));
|
||||||
|
#else
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].mem_bound_check_4bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_4bytes_offset));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
mem_bound_check_4bytes_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_4bytes);
|
||||||
#if UINTPTR_MAX == UINT64_MAX
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_4bytes,
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_4bytes,
|
||||||
module_inst_reg,
|
module_inst_reg,
|
||||||
|
@ -360,16 +573,45 @@ JitReg
|
||||||
get_mem_bound_check_8bytes_reg(JitFrame *frame, uint32 mem_idx)
|
get_mem_bound_check_8bytes_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 mem_bound_check_8bytes_offset =
|
uint32 mem_bound_check_8bytes_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_8bytes);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].mem_bound_check_8bytes)
|
||||||
|
return frame->memory_regs[mem_idx].mem_bound_check_8bytes;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].mem_bound_check_8bytes =
|
||||||
|
cc->memory_regs[mem_idx].mem_bound_check_8bytes;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
|
||||||
if (!frame->memory_regs[mem_idx].mem_bound_check_8bytes) {
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
frame->memory_regs[mem_idx].mem_bound_check_8bytes =
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
cc->memory_regs[mem_idx].mem_bound_check_8bytes;
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
mem_bound_check_8bytes_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, mem_bound_check_8bytes);
|
||||||
|
/* memories[mem_idx]->mem_bound_check_8bytes */
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_8bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_8bytes_offset));
|
||||||
|
#else
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].mem_bound_check_8bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_8bytes_offset));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
mem_bound_check_8bytes_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_8bytes);
|
||||||
#if UINTPTR_MAX == UINT64_MAX
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_8bytes,
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_8bytes,
|
||||||
module_inst_reg,
|
module_inst_reg,
|
||||||
|
@ -387,16 +629,45 @@ JitReg
|
||||||
get_mem_bound_check_16bytes_reg(JitFrame *frame, uint32 mem_idx)
|
get_mem_bound_check_16bytes_reg(JitFrame *frame, uint32 mem_idx)
|
||||||
{
|
{
|
||||||
JitCompContext *cc = frame->cc;
|
JitCompContext *cc = frame->cc;
|
||||||
JitReg module_inst_reg = get_module_inst_reg(frame);
|
JitReg module_inst_reg;
|
||||||
uint32 mem_bound_check_16bytes_offset =
|
uint32 mem_bound_check_16bytes_offset;
|
||||||
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_16bytes);
|
JitReg memory_inst_reg;
|
||||||
|
bool is_shared;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (frame->memory_regs[mem_idx].mem_bound_check_16bytes)
|
||||||
|
return frame->memory_regs[mem_idx].mem_bound_check_16bytes;
|
||||||
|
|
||||||
|
frame->memory_regs[mem_idx].mem_bound_check_16bytes =
|
||||||
|
cc->memory_regs[mem_idx].mem_bound_check_16bytes;
|
||||||
|
|
||||||
bh_assert(mem_idx == 0);
|
bh_assert(mem_idx == 0);
|
||||||
|
|
||||||
if (!frame->memory_regs[mem_idx].mem_bound_check_16bytes) {
|
#if WASM_ENABLE_SHARED_MEMORY != 0
|
||||||
frame->memory_regs[mem_idx].mem_bound_check_16bytes =
|
is_shared = is_shared_memory(cc->cur_wasm_module, mem_idx);
|
||||||
cc->memory_regs[mem_idx].mem_bound_check_16bytes;
|
if (is_shared) {
|
||||||
|
memory_inst_reg = get_memory_inst_reg(frame, mem_idx);
|
||||||
|
mem_bound_check_16bytes_offset =
|
||||||
|
(uint32)offsetof(WASMMemoryInstance, mem_bound_check_16bytes);
|
||||||
|
/* memories[mem_idx]->mem_bound_check_16bytes */
|
||||||
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_16bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_16bytes_offset));
|
||||||
|
#else
|
||||||
|
GEN_INSN(LDI32, frame->memory_regs[mem_idx].mem_bound_check_16bytes,
|
||||||
|
memory_inst_reg,
|
||||||
|
NEW_CONST(I32, mem_bound_check_16bytes_offset));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
module_inst_reg = get_module_inst_reg(frame);
|
||||||
|
mem_bound_check_16bytes_offset =
|
||||||
|
(uint32)offsetof(WASMModuleInstance, global_table_data.bytes)
|
||||||
|
+ (uint32)offsetof(WASMMemoryInstance, mem_bound_check_16bytes);
|
||||||
#if UINTPTR_MAX == UINT64_MAX
|
#if UINTPTR_MAX == UINT64_MAX
|
||||||
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_16bytes,
|
GEN_INSN(LDI64, frame->memory_regs[mem_idx].mem_bound_check_16bytes,
|
||||||
module_inst_reg,
|
module_inst_reg,
|
||||||
|
@ -462,6 +733,8 @@ clear_fixed_virtual_regs(JitFrame *frame)
|
||||||
|
|
||||||
count = module->import_memory_count + module->memory_count;
|
count = module->import_memory_count + module->memory_count;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
|
frame->memory_regs[i].memory_inst = 0;
|
||||||
|
frame->memory_regs[i].cur_page_count = 0;
|
||||||
frame->memory_regs[i].memory_data = 0;
|
frame->memory_regs[i].memory_data = 0;
|
||||||
frame->memory_regs[i].memory_data_end = 0;
|
frame->memory_regs[i].memory_data_end = 0;
|
||||||
frame->memory_regs[i].mem_bound_check_1byte = 0;
|
frame->memory_regs[i].mem_bound_check_1byte = 0;
|
||||||
|
@ -486,6 +759,7 @@ clear_memory_regs(JitFrame *frame)
|
||||||
|
|
||||||
count = module->import_memory_count + module->memory_count;
|
count = module->import_memory_count + module->memory_count;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
|
frame->memory_regs[i].cur_page_count = 0;
|
||||||
frame->memory_regs[i].memory_data = 0;
|
frame->memory_regs[i].memory_data = 0;
|
||||||
frame->memory_regs[i].memory_data_end = 0;
|
frame->memory_regs[i].memory_data_end = 0;
|
||||||
frame->memory_regs[i].mem_bound_check_1byte = 0;
|
frame->memory_regs[i].mem_bound_check_1byte = 0;
|
||||||
|
@ -654,6 +928,8 @@ create_fixed_virtual_regs(JitCompContext *cc)
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
|
cc->memory_regs[i].memory_inst = jit_cc_new_reg_ptr(cc);
|
||||||
|
cc->memory_regs[i].cur_page_count = jit_cc_new_reg_I32(cc);
|
||||||
cc->memory_regs[i].memory_data = jit_cc_new_reg_ptr(cc);
|
cc->memory_regs[i].memory_data = jit_cc_new_reg_ptr(cc);
|
||||||
cc->memory_regs[i].memory_data_end = jit_cc_new_reg_ptr(cc);
|
cc->memory_regs[i].memory_data_end = jit_cc_new_reg_ptr(cc);
|
||||||
cc->memory_regs[i].mem_bound_check_1byte = jit_cc_new_reg_ptr(cc);
|
cc->memory_regs[i].mem_bound_check_1byte = jit_cc_new_reg_ptr(cc);
|
||||||
|
|
|
@ -192,6 +192,12 @@ get_aux_stack_bound_reg(JitFrame *frame);
|
||||||
JitReg
|
JitReg
|
||||||
get_aux_stack_bottom_reg(JitFrame *frame);
|
get_aux_stack_bottom_reg(JitFrame *frame);
|
||||||
|
|
||||||
|
JitReg
|
||||||
|
get_memory_inst_reg(JitFrame *frame, uint32 mem_idx);
|
||||||
|
|
||||||
|
JitReg
|
||||||
|
get_cur_page_count_reg(JitFrame *frame, uint32 mem_idx);
|
||||||
|
|
||||||
JitReg
|
JitReg
|
||||||
get_memory_data_reg(JitFrame *frame, uint32 mem_idx);
|
get_memory_data_reg(JitFrame *frame, uint32 mem_idx);
|
||||||
|
|
||||||
|
|
|
@ -866,6 +866,8 @@ typedef struct JitValueSlot {
|
||||||
typedef struct JitMemRegs {
|
typedef struct JitMemRegs {
|
||||||
/* The following registers should be re-loaded after
|
/* The following registers should be re-loaded after
|
||||||
memory.grow, callbc and callnative */
|
memory.grow, callbc and callnative */
|
||||||
|
JitReg memory_inst;
|
||||||
|
JitReg cur_page_count;
|
||||||
JitReg memory_data;
|
JitReg memory_data;
|
||||||
JitReg memory_data_end;
|
JitReg memory_data_end;
|
||||||
JitReg mem_bound_check_1byte;
|
JitReg mem_bound_check_1byte;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user