Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add functions to expose module import/export info #3330

Merged
merged 3 commits into from
Apr 20, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 215 additions & 0 deletions core/iwasm/common/wasm_runtime_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -3597,6 +3597,221 @@ static union {

#define is_little_endian() (__ue.b == 1) /* NOLINT */

int32_t
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
wasm_runtime_get_import_count(const wasm_module_t module)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
{
if (!module) {
bh_assert(0);
return -1;
}

#if WASM_ENABLE_AOT != 0
if (module->module_type == Wasm_Module_AoT) {
const AOTModule *aot_module = (const AOTModule *)module;
return (int32_t)(aot_module->import_func_count
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
+ aot_module->import_global_count
+ aot_module->import_table_count
+ aot_module->import_memory_count);
}
#endif
#if WASM_ENABLE_INTERP != 0
if (module->module_type == Wasm_Module_Bytecode) {
const WASMModule *wasm_module = (const WASMModule *)module;
return (int32_t)wasm_module->import_count;
}
#endif

return -1;
}

void
wasm_runtime_get_import_type(const wasm_module_t module, int32_t import_index,
wasm_import_type *import_type)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
{
if (!import_type) {
bh_assert(0);
return;
}

memset(import_type, 0, sizeof(wasm_import_type));

if (!module) {
bh_assert(0);
return;
}

#if WASM_ENABLE_AOT != 0
if (module->module_type == Wasm_Module_AoT) {
const AOTModule *aot_module = (const AOTModule *)module;

if (import_index < 0) {
bh_assert(0);
return;
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
}

uint32_t func_index = (uint32_t)import_index;
if (func_index < aot_module->import_func_count) {
const AOTImportFunc *aot_import_func =
&aot_module->import_funcs[func_index];
import_type->module_name = aot_import_func->module_name;
import_type->name = aot_import_func->func_name;
import_type->kind = WASM_IMPORT_EXPORT_KIND_FUNC;
import_type->linked =
aot_import_func->func_ptr_linked ? true : false;
return;
}

uint32_t global_index = func_index - aot_module->import_func_count;
if (global_index < aot_module->import_global_count) {
const AOTImportGlobal *aot_import_global =
&aot_module->import_globals[global_index];
import_type->module_name = aot_import_global->module_name;
import_type->name = aot_import_global->global_name;
import_type->kind = WASM_IMPORT_EXPORT_KIND_GLOBAL;
import_type->linked = aot_import_global->is_linked;
return;
}

uint32_t table_index = global_index - aot_module->import_global_count;
if (table_index < aot_module->import_table_count) {
const AOTImportTable *aot_import_table =
&aot_module->import_tables[table_index];
import_type->module_name = aot_import_table->module_name;
import_type->name = aot_import_table->table_name;
import_type->kind = WASM_IMPORT_EXPORT_KIND_TABLE;
import_type->linked = false;
return;
}

uint32_t memory_index = table_index - aot_module->import_table_count;
if (memory_index < aot_module->import_memory_count) {
const AOTImportMemory *aot_import_memory =
&aot_module->import_memories[memory_index];
import_type->module_name = aot_import_memory->module_name;
import_type->name = aot_import_memory->memory_name;
import_type->kind = WASM_IMPORT_EXPORT_KIND_MEMORY;
import_type->linked = false;
return;
}

bh_assert(0);
return;
}
#endif
#if WASM_ENABLE_INTERP != 0
if (module->module_type == Wasm_Module_Bytecode) {
const WASMModule *wasm_module = (const WASMModule *)module;

if ((import_index < 0)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
|| ((uint32_t)import_index >= wasm_module->import_count)) {
bh_assert(0);
return;
}

const WASMImport *wasm_import = &wasm_module->imports[import_index];

import_type->module_name = wasm_import->u.names.module_name;
import_type->name = wasm_import->u.names.field_name;
import_type->kind = wasm_import->kind;
switch (import_type->kind) {
case WASM_IMPORT_EXPORT_KIND_FUNC:
import_type->linked = wasm_import->u.function.func_ptr_linked;
break;
case WASM_IMPORT_EXPORT_KIND_GLOBAL:
import_type->linked = wasm_import->u.global.is_linked;
break;
case WASM_IMPORT_EXPORT_KIND_TABLE:
/* not supported */
import_type->linked = false;
break;
case WASM_IMPORT_EXPORT_KIND_MEMORY:
/* not supported */
import_type->linked = false;
break;
default:
bh_assert(0);
break;
}

return;
}
#endif
}

int32_t
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
wasm_runtime_get_export_count(const wasm_module_t module)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
{
if (!module) {
bh_assert(0);
return -1;
}

#if WASM_ENABLE_AOT != 0
if (module->module_type == Wasm_Module_AoT) {
const AOTModule *aot_module = (const AOTModule *)module;
return (int32_t)aot_module->export_count;
}
#endif
#if WASM_ENABLE_INTERP != 0
if (module->module_type == Wasm_Module_Bytecode) {
const WASMModule *wasm_module = (const WASMModule *)module;
return (int32_t)wasm_module->export_count;
}
#endif

return -1;
}

void
wasm_runtime_get_export_type(const wasm_module_t module, int32_t export_index,
wasm_export_type *export_type)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
{
if (!export_type) {
bh_assert(0);
return;
}

memset(export_type, 0, sizeof(wasm_export_type));

if (!module) {
bh_assert(0);
return;
}

#if WASM_ENABLE_AOT != 0
if (module->module_type == Wasm_Module_AoT) {
const AOTModule *aot_module = (const AOTModule *)module;

if ((export_index < 0)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
|| ((uint32_t)export_index >= aot_module->export_count)) {
bh_assert(0);
return;
}

const AOTExport *aot_export = &aot_module->exports[export_index];
export_type->name = aot_export->name;
export_type->kind = aot_export->kind;
return;
}
#endif
#if WASM_ENABLE_INTERP != 0
if (module->module_type == Wasm_Module_Bytecode) {
const WASMModule *wasm_module = (const WASMModule *)module;

if ((export_index < 0)
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
|| ((uint32_t)export_index >= wasm_module->export_count)) {
bh_assert(0);
return;
}

const WASMExport *wasm_export = &wasm_module->exports[export_index];
export_type->name = wasm_export->name;
export_type->kind = wasm_export->kind;
return;
}
#endif
}

bool
wasm_runtime_register_natives(const char *module_name,
NativeSymbol *native_symbols,
Expand Down
37 changes: 37 additions & 0 deletions core/iwasm/include/wasm_export.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,28 @@ struct WASMModuleCommon;
typedef struct WASMModuleCommon *wasm_module_t;
#endif

typedef enum
{
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
WASM_IMPORT_EXPORT_KIND_FUNC,
WASM_IMPORT_EXPORT_KIND_TABLE,
WASM_IMPORT_EXPORT_KIND_MEMORY,
WASM_IMPORT_EXPORT_KIND_GLOBAL
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
} wasm_import_export_kind_t;

typedef struct wasm_import_type
{
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
const char * module_name;
const char * name;
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
wasm_import_export_kind_t kind;
bool linked;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May I ask why linked is required here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's useful for informational purposes, it allows me to tell when I've properly provided all of the necessary imports by checking that they show up as linked.

} wasm_import_type;

typedef struct wasm_export_type
{
const char * name;
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved
wasm_import_export_kind_t kind;
} wasm_export_type;

/* Instantiated WASM module */
struct WASMModuleInstanceCommon;
typedef struct WASMModuleInstanceCommon *wasm_module_inst_t;
Expand Down Expand Up @@ -1157,6 +1179,21 @@ wasm_runtime_get_native_addr_range(wasm_module_inst_t module_inst,
uint8_t **p_native_start_addr,
uint8_t **p_native_end_addr);


WASM_RUNTIME_API_EXTERN int32_t wasm_runtime_get_import_count(const wasm_module_t module);
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved

WASM_RUNTIME_API_EXTERN void
wasm_runtime_get_import_type(const wasm_module_t module,
int32_t import_index,
wasm_import_type * import_type);
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved

WASM_RUNTIME_API_EXTERN int32_t wasm_runtime_get_export_count(const wasm_module_t module);
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved

WASM_RUNTIME_API_EXTERN void
wasm_runtime_get_export_type(const wasm_module_t module,
int32_t export_index,
wasm_export_type * export_type);
bnason-nf marked this conversation as resolved.
Show resolved Hide resolved

/**
* Register native functions with same module name
*
Expand Down
Loading