Skip to content

Commit 48eaa22

Browse files
authored
Refine wasm/aot function instance lookup (#3865)
Sort the module instance's export functions with the function name, and use binary search to lookup the wasm/aot function.
1 parent 74d2427 commit 48eaa22

File tree

4 files changed

+57
-37
lines changed

4 files changed

+57
-37
lines changed

core/iwasm/aot/aot_runtime.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,6 +1379,15 @@ init_func_type_indexes(AOTModuleInstance *module_inst, AOTModule *module,
13791379
return true;
13801380
}
13811381

1382+
static int
1383+
cmp_func_inst(const void *a, const void *b)
1384+
{
1385+
const AOTFunctionInstance *func_inst1 = (const AOTFunctionInstance *)a;
1386+
const AOTFunctionInstance *func_inst2 = (const AOTFunctionInstance *)b;
1387+
1388+
return strcmp(func_inst1->func_name, func_inst2->func_name);
1389+
}
1390+
13821391
static bool
13831392
create_export_funcs(AOTModuleInstance *module_inst, AOTModule *module,
13841393
char *error_buf, uint32 error_buf_size)
@@ -1419,6 +1428,9 @@ create_export_funcs(AOTModuleInstance *module_inst, AOTModule *module,
14191428
export_func++;
14201429
}
14211430
}
1431+
1432+
qsort(module_inst->export_functions, module_inst->export_func_count,
1433+
sizeof(AOTFunctionInstance), cmp_func_inst);
14221434
}
14231435

14241436
return true;
@@ -2206,14 +2218,12 @@ aot_deinstantiate(AOTModuleInstance *module_inst, bool is_sub_inst)
22062218
AOTFunctionInstance *
22072219
aot_lookup_function(const AOTModuleInstance *module_inst, const char *name)
22082220
{
2209-
uint32 i;
22102221
AOTFunctionInstance *export_funcs =
22112222
(AOTFunctionInstance *)module_inst->export_functions;
2223+
AOTFunctionInstance key = { .func_name = (char *)name };
22122224

2213-
for (i = 0; i < module_inst->export_func_count; i++)
2214-
if (!strcmp(export_funcs[i].func_name, name))
2215-
return &export_funcs[i];
2216-
return NULL;
2225+
return bsearch(&key, export_funcs, module_inst->export_func_count,
2226+
sizeof(AOTFunctionInstance), cmp_func_inst);
22172227
}
22182228

22192229
#ifdef OS_ENABLE_HW_BOUND_CHECK

core/iwasm/common/wasm_c_api.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3391,8 +3391,7 @@ wasm_func_call(const wasm_func_t *func, const wasm_val_vec_t *params,
33913391
if (export->kind == EXPORT_KIND_FUNC) {
33923392
if (export->index == func->func_idx_rt) {
33933393
func_comm_rt =
3394-
(AOTFunctionInstance *)inst_aot->export_functions
3395-
+ export_func_j;
3394+
aot_lookup_function(inst_aot, export->name);
33963395
((wasm_func_t *)func)->func_comm_rt = func_comm_rt;
33973396
break;
33983397
}

core/iwasm/common/wasm_runtime_common.c

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3908,23 +3908,18 @@ wasm_runtime_is_wasi_mode(WASMModuleInstanceCommon *module_inst)
39083908
WASMFunctionInstanceCommon *
39093909
wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst)
39103910
{
3911-
uint32 i;
3912-
39133911
#if WASM_ENABLE_INTERP != 0
39143912
if (module_inst->module_type == Wasm_Module_Bytecode) {
39153913
WASMModuleInstance *wasm_inst = (WASMModuleInstance *)module_inst;
3916-
WASMFunctionInstance *func;
3917-
for (i = 0; i < wasm_inst->export_func_count; i++) {
3918-
if (!strcmp(wasm_inst->export_functions[i].name, "_start")) {
3919-
func = wasm_inst->export_functions[i].function;
3920-
if (func->u.func->func_type->param_count != 0
3921-
|| func->u.func->func_type->result_count != 0) {
3922-
LOG_ERROR("Lookup wasi _start function failed: "
3923-
"invalid function type.\n");
3924-
return NULL;
3925-
}
3926-
return (WASMFunctionInstanceCommon *)func;
3914+
WASMFunctionInstance *func = wasm_lookup_function(wasm_inst, "_start");
3915+
if (func) {
3916+
if (func->u.func->func_type->param_count != 0
3917+
|| func->u.func->func_type->result_count != 0) {
3918+
LOG_ERROR("Lookup wasi _start function failed: "
3919+
"invalid function type.\n");
3920+
return NULL;
39273921
}
3922+
return (WASMFunctionInstanceCommon *)func;
39283923
}
39293924
return NULL;
39303925
}
@@ -3933,19 +3928,15 @@ wasm_runtime_lookup_wasi_start_function(WASMModuleInstanceCommon *module_inst)
39333928
#if WASM_ENABLE_AOT != 0
39343929
if (module_inst->module_type == Wasm_Module_AoT) {
39353930
AOTModuleInstance *aot_inst = (AOTModuleInstance *)module_inst;
3936-
AOTFunctionInstance *export_funcs =
3937-
(AOTFunctionInstance *)aot_inst->export_functions;
3938-
for (i = 0; i < aot_inst->export_func_count; i++) {
3939-
if (!strcmp(export_funcs[i].func_name, "_start")) {
3940-
AOTFuncType *func_type = export_funcs[i].u.func.func_type;
3941-
if (func_type->param_count != 0
3942-
|| func_type->result_count != 0) {
3943-
LOG_ERROR("Lookup wasi _start function failed: "
3944-
"invalid function type.\n");
3945-
return NULL;
3946-
}
3947-
return (WASMFunctionInstanceCommon *)&export_funcs[i];
3931+
AOTFunctionInstance *func = aot_lookup_function(aot_inst, "_start");
3932+
if (func) {
3933+
AOTFuncType *func_type = func->u.func.func_type;
3934+
if (func_type->param_count != 0 || func_type->result_count != 0) {
3935+
LOG_ERROR("Lookup wasi _start function failed: "
3936+
"invalid function type.\n");
3937+
return NULL;
39483938
}
3939+
return func;
39493940
}
39503941
return NULL;
39513942
}

core/iwasm/interpreter/wasm_runtime.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,17 @@ export_functions_deinstantiate(WASMExportFuncInstance *functions)
13671367
wasm_runtime_free(functions);
13681368
}
13691369

1370+
static int
1371+
cmp_export_func_inst(const void *a, const void *b)
1372+
{
1373+
const WASMExportFuncInstance *export_func1 =
1374+
(const WASMExportFuncInstance *)a;
1375+
const WASMExportFuncInstance *export_func2 =
1376+
(const WASMExportFuncInstance *)b;
1377+
1378+
return strcmp(export_func1->name, export_func2->name);
1379+
}
1380+
13701381
/**
13711382
* Instantiate export functions in a module.
13721383
*/
@@ -1395,6 +1406,9 @@ export_functions_instantiate(const WASMModule *module,
13951406
}
13961407

13971408
bh_assert((uint32)(export_func - export_funcs) == export_func_count);
1409+
1410+
qsort(export_funcs, export_func_count, sizeof(WASMExportFuncInstance),
1411+
cmp_export_func_inst);
13981412
return export_funcs;
13991413
}
14001414

@@ -3420,11 +3434,17 @@ wasm_deinstantiate(WASMModuleInstance *module_inst, bool is_sub_inst)
34203434
WASMFunctionInstance *
34213435
wasm_lookup_function(const WASMModuleInstance *module_inst, const char *name)
34223436
{
3423-
uint32 i;
3424-
for (i = 0; i < module_inst->export_func_count; i++)
3425-
if (!strcmp(module_inst->export_functions[i].name, name))
3426-
return module_inst->export_functions[i].function;
3427-
return NULL;
3437+
WASMExportFuncInstance key = { .name = (char *)name };
3438+
WASMExportFuncInstance *export_func_inst;
3439+
3440+
export_func_inst = bsearch(
3441+
&key, module_inst->export_functions, module_inst->export_func_count,
3442+
sizeof(WASMExportFuncInstance), cmp_export_func_inst);
3443+
3444+
if (!export_func_inst)
3445+
return NULL;
3446+
3447+
return export_func_inst->function;
34283448
}
34293449

34303450
WASMMemoryInstance *

0 commit comments

Comments
 (0)