From: Brendan Hansen Date: Sun, 5 Dec 2021 14:31:54 +0000 (-0600) Subject: getting more of the linking to work X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=460048573aa34c7b4ddc473bfb50b019ee8de603;p=onyx.git getting more of the linking to work --- diff --git a/build.sh b/build.sh index 88388a8e..6fb93aa9 100755 --- a/build.sh +++ b/build.sh @@ -44,7 +44,7 @@ else fi C_FILES="$C_FILES wasm_runtime" -FLAGS="$FLAGS -DENABLE_RUN_WITH_WASMER" +FLAGS="$FLAGS -DENABLE_RUN_WITH_WASMER -rdynamic" LIBS="-L$CORE_DIR/lib -lwasmer -Wl,-rpath=$CORE_DIR/lib -lpthread -ldl" INCLUDES="-I$WASMER_INCLUDE_DIR" diff --git a/docs/pluggable_modules.md b/docs/pluggable_modules.md index 3151fdac..ee87eb78 100644 --- a/docs/pluggable_modules.md +++ b/docs/pluggable_modules.md @@ -68,4 +68,10 @@ The corresponding C file that will be compiled to a so/dll looks like: Compiling the C file with: - gcc -o some_useful_code.so -shared -fPIC some_useful_code.c -I ... \ No newline at end of file + gcc -o some_useful_code.so -shared -fPIC some_useful_code.c -I ... + + +A couple of questions that need to be answered: + - How is the WASM memory object going to be given to the shared object + code? Can it just be a public symbol that gets linked against? or + does it need to be passed to an initialization function? \ No newline at end of file diff --git a/misc/onyx_library.h b/misc/onyx_library.h new file mode 100644 index 00000000..d9d9ed17 --- /dev/null +++ b/misc/onyx_library.h @@ -0,0 +1,54 @@ + +#include "wasm.h" + +extern wasm_memory_t* wasm_memory; + +typedef struct WasmValkindBuffer { + unsigned int count; + wasm_valkind_t types[20]; +} WasmValkindBuffer; + +typedef struct WasmFuncDefinition { + char* module_name; + char* import_name; + wasm_func_callback_t func; + + WasmValkindBuffer *params; + WasmValkindBuffer *results; +} WasmFuncDefinition; + +#define STRINGIFY1(a) #a +#define CONCAT2(a, b) a ## _ ## b +#define CONCAT3(a, b, c) a ## _ ## b ## _ ## c +#define ONYX_MODULE_NAME_GEN(m) CONCAT2(__onyx_library, m) +#define ONYX_LINK_NAME_GEN(m) CONCAT2(onyx_library, m) +#define ONYX_FUNC_NAME(m, n) CONCAT3(__onyx_internal, m, n) +#define ONYX_DEF_NAME(m, n) CONCAT3(__onyx_internal_def, m, n) +#define ONYX_PARAM_NAME(m, n) CONCAT3(__onyx_internal_param_buffer, m, n) +#define ONYX_RESULT_NAME(m, n) CONCAT3(__onyx_internal_result_buffer, m, n) +#define ONYX_IMPORT_NAME(m, n) STRINGIFY1(m) "_" #n + +#define NUM_VALS(...) (sizeof((wasm_valkind_t []){ 0, __VA_ARGS__ }) / sizeof(wasm_valkind_t)) +#define _VALS(...) { NUM_VALS(__VA_ARGS__) - 1, __VA_ARGS__ } + +#define ONYX_DEF(name, params_types, result_types) \ + static wasm_trap_t* ONYX_FUNC_NAME(ONYX_LIBRARY_NAME, name)(const wasm_val_vec_t* params, wasm_val_vec_t* results); \ + static struct WasmValkindBuffer ONYX_PARAM_NAME(ONYX_LIBRARY_NAME, name) = _VALS params_types; \ + static struct WasmValkindBuffer ONYX_RESULT_NAME(ONYX_LIBRARY_NAME, name) = _VALS result_types; \ + static struct WasmFuncDefinition ONYX_DEF_NAME(ONYX_LIBRARY_NAME, name) = { STRINGIFY1(ONYX_LIBRARY_NAME), #name, ONYX_FUNC_NAME(ONYX_LIBRARY_NAME, name), & ONYX_PARAM_NAME(ONYX_LIBRARY_NAME, name), & ONYX_RESULT_NAME(ONYX_LIBRARY_NAME, name) }; \ + \ + static wasm_trap_t* ONYX_FUNC_NAME(ONYX_LIBRARY_NAME, name)(const wasm_val_vec_t* params, wasm_val_vec_t* results) + +#define ONYX_FUNC(name) & ONYX_DEF_NAME(ONYX_LIBRARY_NAME, name), +#define ONYX_LIBRARY \ + extern struct WasmFuncDefinition *ONYX_MODULE_NAME_GEN(ONYX_LIBRARY_NAME)[]; \ + WasmFuncDefinition** ONYX_LINK_NAME_GEN(ONYX_LIBRARY_NAME)() { \ + return ONYX_MODULE_NAME_GEN(ONYX_LIBRARY_NAME); \ + } \ + struct WasmFuncDefinition *ONYX_MODULE_NAME_GEN(ONYX_LIBRARY_NAME)[] = + +// Shorter names +#define I32 WASM_I32 +#define I64 WASM_I64 +#define F32 WASM_F32 +#define F64 WASM_F64 diff --git a/misc/onyx_module.h b/misc/onyx_module.h deleted file mode 100644 index 3ad2e353..00000000 --- a/misc/onyx_module.h +++ /dev/null @@ -1,47 +0,0 @@ - -#include "wasm.h" - -#define NUM_VALS(...) (sizeof((wasm_valkind_t []){ 0, __VA_ARGS__ }) / sizeof(wasm_valkind_t)) -#define _VALS(...) { NUM_VALS(__VA_ARGS__) - 1, __VA_ARGS__ } - -typedef struct WasmValkindBuffer { - unsigned int count; - wasm_valkind_t types[20]; -} WasmValkindBuffer; - -typedef struct WasmFuncDefinition { - char* module_name; - char* import_name; - wasm_func_callback_t func; - - WasmValkindBuffer *params; - WasmValkindBuffer *results; -} WasmFuncDefinition; - -#define STRINGIFY1(a) #a -#define CONCAT2(a, b) a ## _ ## b -#define CONCAT3(a, b, c) a ## _ ## b ## _ ## c -#define ONYX_MODULE_NAME_GEN(m) CONCAT2(__onyx_module, m) -#define ONYX_FUNC_NAME(m, n) CONCAT3(__onyx_internal, m, n) -#define ONYX_DEF_NAME(m, n) CONCAT3(__onyx_internal_def, m, n) -#define ONYX_PARAM_NAME(m, n) CONCAT3(__onyx_internal_param_buffer, m, n) -#define ONYX_RESULT_NAME(m, n) CONCAT3(__onyx_internal_result_buffer, m, n) -#define ONYX_IMPORT_NAME(m, n) STRINGIFY1(m) "_" #n - -#define ONYX_DEF(name, params_types, result_types) \ - static wasm_trap_t* ONYX_FUNC_NAME(ONYX_MODULE_NAME, name)(const wasm_val_vec_t* params, wasm_val_vec_t* results); \ - static struct WasmValkindBuffer ONYX_PARAM_NAME(ONYX_MODULE_NAME, name) = _VALS params_types; \ - static struct WasmValkindBuffer ONYX_RESULT_NAME(ONYX_MODULE_NAME, name) = _VALS result_types; \ - static struct WasmFuncDefinition ONYX_DEF_NAME(ONYX_MODULE_NAME, name) = { STRINGIFY1(ONYX_MODULE_NAME), #name, ONYX_FUNC_NAME(ONYX_MODULE_NAME, name), & ONYX_PARAM_NAME(ONYX_MODULE_NAME, name), & ONYX_RESULT_NAME(ONYX_MODULE_NAME, name) }; \ - \ - static wasm_trap_t* ONYX_FUNC_NAME(ONYX_MODULE_NAME, name)(const wasm_val_vec_t* params, wasm_val_vec_t* results) - -#define ONYX_FUNC(name) & ONYX_DEF_NAME(ONYX_MODULE_NAME, name), -#define ONYX_MODULE struct WasmFuncDefinition *ONYX_MODULE_NAME_GEN(ONYX_MODULE_NAME) [] = - -// Shorter names -#define I32 WASM_I32 -#define I64 WASM_I64 -#define F32 WASM_F32 -#define F64 WASM_F64 - diff --git a/modules/test_library/test_library.c b/modules/test_library/test_library.c index 0a8fd25a..08df6ad9 100644 --- a/modules/test_library/test_library.c +++ b/modules/test_library/test_library.c @@ -1,13 +1,13 @@ -#include "onyx_module.h" +#include "onyx_library.h" #include -#define ONYX_MODULE_NAME test_library +#define ONYX_LIBRARY_NAME test_library ONYX_DEF(foo, (), ()) { printf("This worked!\n"); return NULL; } -ONYX_MODULE { +ONYX_LIBRARY { ONYX_FUNC(foo) }; \ No newline at end of file diff --git a/src/wasm_runtime.c b/src/wasm_runtime.c index ef74408c..3ca0ccf6 100644 --- a/src/wasm_runtime.c +++ b/src/wasm_runtime.c @@ -21,7 +21,7 @@ static wasm_engine_t* wasm_engine; static wasm_store_t* wasm_store; static wasm_extern_vec_t wasm_imports; static wasm_module_t* wasm_module; -static wasm_memory_t* wasm_memory; +wasm_memory_t* wasm_memory; b32 wasm_name_equals(const wasm_name_t* name1, const wasm_name_t* name2) { if (name1->size != name2->size) return 0; @@ -503,16 +503,6 @@ WASM_INTEROP(onyx_process_destroy_impl) { // Returns 1 if successful b32 onyx_run_wasm(bh_buffer wasm_bytes) { - // NOCHECKIN - void* handle = dlopen("./test_library.so", RTLD_LAZY); - printf("HANDLE: %p\n", handle); - if (handle == NULL) { - printf("ERROR: %s\n", dlerror()); - } - void *wasm_library = dlsym(handle, "__onyx_module_test_library"); - printf("LOADED: %p %s\n", wasm_library, wasm_library); - dlclose(handle); - wasm_instance_t* instance = NULL; wasmer_features_t* features = NULL; @@ -690,6 +680,17 @@ b32 onyx_run_wasm(bh_buffer wasm_bytes) { wasm_trap_t* traps = NULL; + // NOCHECKIN + void* handle = dlopen("./test_library.so", RTLD_LAZY); + printf("HANDLE: %p\n", handle); + if (handle == NULL) { + printf("ERROR: %s\n", dlerror()); + } + void *wasm_library = dlsym(handle, "onyx_library_test_library"); + printf("LOADED: %p\n", wasm_library); + printf("TABLE: %p\n", ((void* (*)()) wasm_library)()); + dlclose(handle); + instance = wasm_instance_new(wasm_store, wasm_module, &wasm_imports, &traps); if (!instance) goto error_handling;