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"
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
--- /dev/null
+
+#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
+++ /dev/null
-
-#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
-
-#include "onyx_module.h"
+#include "onyx_library.h"
#include <stdio.h>
-#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
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;
// 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;
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;