Store import function pointer in module instance (#1130)

Fix the issue reported by #1118 , use this approach since it avoids copying
unnecessary static information into instance and reduces the footprint.
This commit is contained in:
Xu Jun 2022-04-27 20:21:51 +08:00 committed by GitHub
parent f8b4ca2a70
commit 98431225f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 14 deletions

View File

@ -771,7 +771,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
WASMFunctionImport *func_import = cur_func->u.func_import; WASMFunctionImport *func_import = cur_func->u.func_import;
unsigned local_cell_num = 2; unsigned local_cell_num = 2;
WASMInterpFrame *frame; WASMInterpFrame *frame;
uint32 argv_ret[2]; uint32 argv_ret[2], cur_func_index;
void *native_func_pointer = NULL;
char buf[128]; char buf[128];
bool ret; bool ret;
@ -786,7 +787,11 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
wasm_exec_env_set_cur_frame(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, frame);
if (!func_import->func_ptr_linked) { cur_func_index = cur_func - module_inst->functions;
bh_assert(cur_func_index < module_inst->module->import_function_count);
native_func_pointer = module_inst->import_func_ptrs[cur_func_index];
if (!native_func_pointer) {
snprintf(buf, sizeof(buf), snprintf(buf, sizeof(buf),
"failed to call unlinked import function (%s, %s)", "failed to call unlinked import function (%s, %s)",
func_import->module_name, func_import->field_name); func_import->module_name, func_import->field_name);
@ -796,9 +801,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
if (func_import->call_conv_wasm_c_api) { if (func_import->call_conv_wasm_c_api) {
ret = wasm_runtime_invoke_c_api_native( ret = wasm_runtime_invoke_c_api_native(
(WASMModuleInstanceCommon *)module_inst, (WASMModuleInstanceCommon *)module_inst, native_func_pointer,
func_import->func_ptr_linked, func_import->func_type, func_import->func_type, cur_func->param_cell_num, frame->lp,
cur_func->param_cell_num, frame->lp,
func_import->wasm_c_api_with_env, func_import->attachment); func_import->wasm_c_api_with_env, func_import->attachment);
if (ret) { if (ret) {
argv_ret[0] = frame->lp[0]; argv_ret[0] = frame->lp[0];
@ -807,13 +811,13 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
} }
else if (!func_import->call_conv_raw) { else if (!func_import->call_conv_raw) {
ret = wasm_runtime_invoke_native( ret = wasm_runtime_invoke_native(
exec_env, func_import->func_ptr_linked, func_import->func_type, exec_env, native_func_pointer, func_import->func_type,
func_import->signature, func_import->attachment, frame->lp, func_import->signature, func_import->attachment, frame->lp,
cur_func->param_cell_num, argv_ret); cur_func->param_cell_num, argv_ret);
} }
else { else {
ret = wasm_runtime_invoke_native_raw( ret = wasm_runtime_invoke_native_raw(
exec_env, func_import->func_ptr_linked, func_import->func_type, exec_env, native_func_pointer, func_import->func_type,
func_import->signature, func_import->attachment, frame->lp, func_import->signature, func_import->attachment, frame->lp,
cur_func->param_cell_num, argv_ret); cur_func->param_cell_num, argv_ret);
} }

View File

@ -839,7 +839,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
WASMFunctionImport *func_import = cur_func->u.func_import; WASMFunctionImport *func_import = cur_func->u.func_import;
unsigned local_cell_num = 2; unsigned local_cell_num = 2;
WASMInterpFrame *frame; WASMInterpFrame *frame;
uint32 argv_ret[2]; uint32 argv_ret[2], cur_func_index;
void *native_func_pointer = NULL;
bool ret; bool ret;
if (!(frame = ALLOC_FRAME(exec_env, if (!(frame = ALLOC_FRAME(exec_env,
@ -853,7 +854,11 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
wasm_exec_env_set_cur_frame(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, frame);
if (!func_import->func_ptr_linked) { cur_func_index = cur_func - module_inst->functions;
bh_assert(cur_func_index < module_inst->module->import_function_count);
native_func_pointer = module_inst->import_func_ptrs[cur_func_index];
if (!native_func_pointer) {
char buf[128]; char buf[128];
snprintf(buf, sizeof(buf), snprintf(buf, sizeof(buf),
"failed to call unlinked import function (%s, %s)", "failed to call unlinked import function (%s, %s)",
@ -864,9 +869,8 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
if (func_import->call_conv_wasm_c_api) { if (func_import->call_conv_wasm_c_api) {
ret = wasm_runtime_invoke_c_api_native( ret = wasm_runtime_invoke_c_api_native(
(WASMModuleInstanceCommon *)module_inst, (WASMModuleInstanceCommon *)module_inst, native_func_pointer,
func_import->func_ptr_linked, func_import->func_type, func_import->func_type, cur_func->param_cell_num, frame->lp,
cur_func->param_cell_num, frame->lp,
func_import->wasm_c_api_with_env, func_import->attachment); func_import->wasm_c_api_with_env, func_import->attachment);
if (ret) { if (ret) {
argv_ret[0] = frame->lp[0]; argv_ret[0] = frame->lp[0];
@ -875,13 +879,13 @@ wasm_interp_call_func_native(WASMModuleInstance *module_inst,
} }
else if (!func_import->call_conv_raw) { else if (!func_import->call_conv_raw) {
ret = wasm_runtime_invoke_native( ret = wasm_runtime_invoke_native(
exec_env, func_import->func_ptr_linked, func_import->func_type, exec_env, native_func_pointer, func_import->func_type,
func_import->signature, func_import->attachment, frame->lp, func_import->signature, func_import->attachment, frame->lp,
cur_func->param_cell_num, argv_ret); cur_func->param_cell_num, argv_ret);
} }
else { else {
ret = wasm_runtime_invoke_native_raw( ret = wasm_runtime_invoke_native_raw(
exec_env, func_import->func_ptr_linked, func_import->func_type, exec_env, native_func_pointer, func_import->func_type,
func_import->signature, func_import->attachment, frame->lp, func_import->signature, func_import->attachment, frame->lp,
cur_func->param_cell_num, argv_ret); cur_func->param_cell_num, argv_ret);
} }

View File

@ -580,6 +580,13 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst,
return NULL; return NULL;
} }
total_size = sizeof(void *) * (uint64)module->import_function_count;
if (!(module_inst->import_func_ptrs =
runtime_malloc(total_size, error_buf, error_buf_size))) {
wasm_runtime_free(functions);
return NULL;
}
/* instantiate functions from import section */ /* instantiate functions from import section */
function = functions; function = functions;
import = module->import_functions; import = module->import_functions;
@ -608,6 +615,10 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst,
function->local_count = 0; function->local_count = 0;
function->local_types = NULL; function->local_types = NULL;
/* Copy the function pointer to current instance */
module_inst->import_func_ptrs[i] =
function->u.func_import->func_ptr_linked;
function++; function++;
} }
@ -1597,6 +1608,10 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
memories_deinstantiate(module_inst, module_inst->memories, memories_deinstantiate(module_inst, module_inst->memories,
module_inst->memory_count); module_inst->memory_count);
if (module_inst->import_func_ptrs) {
wasm_runtime_free(module_inst->import_func_ptrs);
}
tables_deinstantiate(module_inst->tables, module_inst->table_count); tables_deinstantiate(module_inst->tables, module_inst->table_count);
functions_deinstantiate(module_inst->functions, functions_deinstantiate(module_inst->functions,
module_inst->function_count); module_inst->function_count);

View File

@ -165,6 +165,9 @@ struct WASMModuleInstance {
uint32 export_tab_count; uint32 export_tab_count;
#endif #endif
/* Array of function pointers to import functions */
void **import_func_ptrs;
WASMMemoryInstance **memories; WASMMemoryInstance **memories;
WASMTableInstance **tables; WASMTableInstance **tables;
WASMGlobalInstance *globals; WASMGlobalInstance *globals;