@@ -73,6 +73,56 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
7373 uint8 block_type , uint8 * * p_else_addr ,
7474 uint8 * * p_end_addr );
7575
76+ #if WASM_ENABLE_SHARED_HEAP != 0
77+ #if WASM_ENABLE_MULTI_MEMORY != 0
78+ /* Only enable shared heap for the default memory */
79+ #define is_default_memory (memidx == 0)
80+ #else
81+ #define is_default_memory true
82+ #endif
83+ #if WASM_ENABLE_MEMORY64 != 0
84+ #define get_shared_heap_start_off (shared_heap ) \
85+ (is_memory64 ? shared_heap->start_off_mem64 : shared_heap->start_off_mem32)
86+ #else
87+ #define get_shared_heap_start_off (shared_heap ) (shared_heap->start_off_mem32)
88+ #endif
89+ /* Check whether the app addr in the last visited shared heap, if not, check the
90+ * shared heap chain to find which(if any) shared heap the app addr in, and
91+ * update the last visited shared heap info if found. */
92+ #define app_addr_in_shared_heap (app_addr , bytes ) \
93+ (shared_heap && is_default_memory && (app_addr) >= shared_heap_start_off \
94+ && (app_addr) <= shared_heap_end_off - bytes + 1) \
95+ || ({ \
96+ bool in_chain = false; \
97+ WASMSharedHeap *cur; \
98+ uint64 cur_shared_heap_start_off, cur_shared_heap_end_off; \
99+ for (cur = shared_heap; cur; cur = cur->chain_next) { \
100+ cur_shared_heap_start_off = get_shared_heap_start_off(cur); \
101+ cur_shared_heap_end_off = \
102+ cur_shared_heap_start_off - 1 + cur->size; \
103+ if ((app_addr) >= cur_shared_heap_start_off \
104+ && (app_addr) <= cur_shared_heap_end_off - bytes + 1) { \
105+ shared_heap_start_off = cur_shared_heap_start_off; \
106+ shared_heap_end_off = cur_shared_heap_end_off; \
107+ shared_heap_base_addr = cur->base_addr; \
108+ in_chain = true; \
109+ break; \
110+ } \
111+ } \
112+ in_chain; \
113+ })
114+
115+ #define shared_heap_addr_app_to_native (app_addr , native_addr ) \
116+ native_addr = shared_heap_base_addr + ((app_addr)-shared_heap_start_off)
117+
118+ #define CHECK_SHARED_HEAP_OVERFLOW (app_addr , bytes , native_addr ) \
119+ if (app_addr_in_shared_heap(app_addr, bytes)) \
120+ shared_heap_addr_app_to_native(app_addr, native_addr); \
121+ else
122+ #else
123+ #define CHECK_SHARED_HEAP_OVERFLOW (app_addr , bytes , native_addr )
124+ #endif /* end of WASM_ENABLE_SHARED_HEAP != 0 */
125+
76126#ifdef __cplusplus
77127}
78128#endif
0 commit comments