first draft of shared heap enhancement in interpreter and runtime: update interpreter

This commit is contained in:
TL 2025-01-26 11:11:40 +08:00
parent 5c22e611cd
commit 1566ff1606
4 changed files with 48 additions and 22 deletions

View File

@ -504,7 +504,7 @@ is_app_addr_in_shared_heap(WASMModuleInstanceCommon *module_inst,
for (cur = heap; cur; cur = cur->chain_next) { for (cur = heap; cur; cur = cur->chain_next) {
shared_heap_start = shared_heap_start =
cur->start_off_mem64 ? is_memory64 : cur->start_off_mem32; is_memory64 ? cur->start_off_mem64 : cur->start_off_mem32;
shared_heap_end = shared_heap_start + cur->size; shared_heap_end = shared_heap_start + cur->size;
if (app_offset >= shared_heap_start && app_offset <= shared_heap_end) { if (app_offset >= shared_heap_start && app_offset <= shared_heap_end) {
if (target_heap) if (target_heap)

View File

@ -53,15 +53,18 @@ typedef float64 CellType_F64;
#else #else
#define is_default_memory true #define is_default_memory true
#endif #endif
#if WASM_ENABLE_MEMORY64 #if WASM_ENABLE_MEMORY64 != 0
#define get_shared_heap_start_off(shared_heap) \ #define get_shared_heap_start_off(shared_heap) \
(is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32) (is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32)
#else #else
#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32) #define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32)
#endif #endif
/* Check whether the app addr in the last visited shared heap, if not, check the
* shared heap chain to find which(if any) shared heap the app addr in, and
* update the last visited shared heap info if found. */
#define app_addr_in_shared_heap(app_addr, bytes) \ #define app_addr_in_shared_heap(app_addr, bytes) \
(shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \ (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \
&& (app_addr) <= shared_heap_end_off - bytes + 0) \ && (app_addr) <= shared_heap_end_off - bytes + 1) \
|| ({ \ || ({ \
bool in_chain = false; \ bool in_chain = false; \
WASMSharedHeap *cur; \ WASMSharedHeap *cur; \
@ -71,7 +74,7 @@ typedef float64 CellType_F64;
cur_shared_heap_end_off = \ cur_shared_heap_end_off = \
cur_shared_heap_start_off + cur->size - 1; \ cur_shared_heap_start_off + cur->size - 1; \
if ((app_addr) >= cur_shared_heap_start_off \ if ((app_addr) >= cur_shared_heap_start_off \
&& (app_addr) <= cur_shared_heap_end_off - bytes + 0) { \ && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
shared_heap_start_off = cur_shared_heap_start_off; \ shared_heap_start_off = cur_shared_heap_start_off; \
shared_heap_end_off = cur_shared_heap_end_off; \ shared_heap_end_off = cur_shared_heap_end_off; \
shared_heap_base_addr = cur->base_addr; \ shared_heap_base_addr = cur->base_addr; \
@ -1716,10 +1719,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
goto got_exception; goto got_exception;
} }
HANDLE_OP(WASM_OP_NOP) HANDLE_OP(WASM_OP_NOP) { HANDLE_OP_END(); }
{
HANDLE_OP_END();
}
#if WASM_ENABLE_EXCE_HANDLING != 0 #if WASM_ENABLE_EXCE_HANDLING != 0
HANDLE_OP(WASM_OP_RETHROW) HANDLE_OP(WASM_OP_RETHROW)

View File

@ -38,9 +38,33 @@ typedef float64 CellType_F64;
#endif #endif
#if WASM_ENABLE_SHARED_HEAP != 0 #if WASM_ENABLE_SHARED_HEAP != 0
/* TODO: add code for 64 bit version when memory64 is enabled for fast-interp */
#define get_shared_heap_start_off(shared_heap) (shared_heap->start_off_mem32)
/* Check whether the app addr in the last visited shared heap, if not, check the
* shared heap chain to find which(if any) shared heap the app addr in, and
* update the last visited shared heap info if found. */
#define app_addr_in_shared_heap(app_addr, bytes) \ #define app_addr_in_shared_heap(app_addr, bytes) \
(shared_heap && (app_addr) >= shared_heap_start_off \ (shared_heap && (app_addr) >= shared_heap_start_off \
&& (app_addr) <= shared_heap_end_off - bytes + 1) && (app_addr) <= shared_heap_end_off - bytes + 1) \
|| ({ \
bool in_chain = false; \
WASMSharedHeap *cur; \
uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \
for (cur = shared_heap; cur; cur = cur->chain_next) { \
cur_shared_heap_start_off = get_shared_heap_start_off(cur); \
cur_shared_heap_end_off = \
cur_shared_heap_start_off + cur->size - 1; \
if ((app_addr) >= cur_shared_heap_start_off \
&& (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
shared_heap_start_off = cur_shared_heap_start_off; \
shared_heap_end_off = cur_shared_heap_end_off; \
shared_heap_base_addr = cur->base_addr; \
in_chain = true; \
break; \
} \
} \
in_chain; \
})
#define shared_heap_addr_app_to_native(app_addr, native_addr) \ #define shared_heap_addr_app_to_native(app_addr, native_addr) \
native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off) native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off)
@ -1540,19 +1564,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
#if WASM_ENABLE_SHARED_HEAP != 0 #if WASM_ENABLE_SHARED_HEAP != 0
WASMSharedHeap *shared_heap = module->e ? module->e->shared_heap : NULL; WASMSharedHeap *shared_heap = module->e ? module->e->shared_heap : NULL;
uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL; uint8 *shared_heap_base_addr = shared_heap ? shared_heap->base_addr : NULL;
/*
#if WASM_ENABLE_MEMORY64 != 0
uint64 shared_heap_start_off = uint64 shared_heap_start_off =
shared_heap ? (is_memory64 ? shared_heap->start_off_mem64 shared_heap ? get_shared_heap_start_off(shared_heap) : 0;
: shared_heap->start_off_mem32)
: 0;
uint64 shared_heap_end_off = uint64 shared_heap_end_off =
shared_heap ? (is_memory64 ? UINT64_MAX : UINT32_MAX) : 0; shared_heap
#else ? (get_shared_heap_start_off(shared_heap) + shared_heap->size - 1)
*/ /* TODO: uncomment the code when memory64 is enabled for fast-interp */ : 0;
uint64 shared_heap_start_off =
shared_heap ? shared_heap->start_off_mem32 : 0;
uint64 shared_heap_end_off = shared_heap ? UINT32_MAX : 0;
/* #endif */ /* #endif */
#endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */ #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */

View File

@ -93,12 +93,21 @@ typedef union {
} MemBound; } MemBound;
typedef struct WASMSharedHeap { typedef struct WASMSharedHeap {
/* The global shared heap list maintained in runtime, used for runtime
* destroy */
struct WASMSharedHeap *next; struct WASMSharedHeap *next;
/* The logical shared heap chain the shared heap in */
struct WASMSharedHeap *chain_next;
/* Will be null if shared heap is created from pre allocated memory chunk
* and don't need to dynamic malloc and free */
void *heap_handle; void *heap_handle;
uint8 *base_addr; uint8 *base_addr;
uint64 size; uint64 size;
uint64 start_off_mem64; uint64 start_off_mem64;
uint64 start_off_mem32; uint64 start_off_mem32;
/* The number of wasm apps it attached to, for a shared heap chain, only the
* list head need to maintain the valid attached_count */
uint8 attached_count;
} WASMSharedHeap; } WASMSharedHeap;
struct WASMMemoryInstance { struct WASMMemoryInstance {