From: Brendan Hansen Date: Thu, 16 Nov 2023 17:02:44 +0000 (-0600) Subject: working on support for MacOS in onyx runtime X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=a94a40132126bc8e9c030069a2b2a610ba348d1b;p=onyx.git working on support for MacOS in onyx runtime --- diff --git a/compiler/src/wasm_runtime.c b/compiler/src/wasm_runtime.c index d423d01a..9a78ce2f 100644 --- a/compiler/src/wasm_runtime.c +++ b/compiler/src/wasm_runtime.c @@ -14,7 +14,7 @@ #include "wasmer.h" #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #include #include #include @@ -80,7 +80,7 @@ typedef struct LinkLibraryContext { static void *locate_symbol_in_dynamic_library_raw(char *libname, char *sym) { -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) void* handle = dlopen(libname, RTLD_LAZY); if (handle == NULL) { return NULL; @@ -108,6 +108,10 @@ static void *locate_symbol_in_dynamic_library(LinkLibraryContext *ctx, char *lib library_name = bh_lookup_file(libname, ".", ".so", 1, (const char **) ctx->library_paths, 1); #endif + #ifdef _BH_DARWIN + library_name = bh_lookup_file(libname, ".", ".dylib", 1, (const char **) ctx->library_paths, 1); + #endif + #ifdef _BH_WINDOWS library_name = bh_lookup_file(libname, ".", ".dll", 1, (const char **) ctx->library_paths, 1); #endif @@ -118,7 +122,7 @@ static void *locate_symbol_in_dynamic_library(LinkLibraryContext *ctx, char *lib typedef void *(*LinkLibraryer)(OnyxRuntime *runtime); static WasmFuncDefinition** onyx_load_library(LinkLibraryContext *ctx, char *name) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) #define DIR_SEPARATOR '/' #endif #ifdef _BH_WINDOWS diff --git a/runtime/onyx_runtime.c b/runtime/onyx_runtime.c index e756e253..5847a6e4 100644 --- a/runtime/onyx_runtime.c +++ b/runtime/onyx_runtime.c @@ -6,7 +6,7 @@ #define ONYX_NO_SHORT_NAMES #include "onyx_library.h" -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #include #include #include @@ -36,7 +36,7 @@ #include "src/ort_cptr.h" #include "src/ort_tty.h" -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) #include "src/ort_net_linux.h" #endif diff --git a/runtime/src/ort_directories.h b/runtime/src/ort_directories.h index 3cc8d355..c067a309 100644 --- a/runtime/src/ort_directories.h +++ b/runtime/src/ort_directories.h @@ -28,7 +28,7 @@ ONYX_DEF(__dir_open, (WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) DIR* dir = opendir(path); *(u64 *) ONYX_PTR(params->data[2].of.i32) = (u64) dir; results->data[0] = WASM_I32_VAL(dir != NULL); @@ -65,7 +65,7 @@ ONYX_DEF(__dir_read, (WASM_I64, WASM_I32), (WASM_I32)) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) DIR* dir = (DIR *) params->data[0].of.i64; if (dir == NULL) { results->data[0] = WASM_I32_VAL(0); @@ -118,7 +118,7 @@ ONYX_DEF(__dir_close, (WASM_I64), ()) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) DIR* dir = (DIR *) params->data[0].of.i64; if (dir == NULL) return NULL; @@ -141,7 +141,7 @@ ONYX_DEF(__dir_create, (WASM_I32, WASM_I32), (WASM_I32)) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) results->data[0] = WASM_I32_VAL(mkdir(path, 0777) == 0); return NULL; #endif @@ -161,7 +161,7 @@ ONYX_DEF(__dir_remove, (WASM_I32, WASM_I32), (WASM_I32)) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) results->data[0] = WASM_I32_VAL(rmdir(path) == 0); return NULL; #endif diff --git a/runtime/src/ort_files.h b/runtime/src/ort_files.h index de6e3e0b..148454e6 100644 --- a/runtime/src/ort_files.h +++ b/runtime/src/ort_files.h @@ -204,7 +204,7 @@ ONYX_DEF(__file_rename, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { return NULL; #endif -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) results->data[0] = WASM_I32_VAL(rename(old_path, new_path) == 0); return NULL; #endif diff --git a/runtime/src/ort_os.h b/runtime/src/ort_os.h index 403f5b70..93954a83 100644 --- a/runtime/src/ort_os.h +++ b/runtime/src/ort_os.h @@ -38,7 +38,7 @@ ONYX_DEF(__exit, (WASM_I32), ()) { } ONYX_DEF(__sleep, (WASM_I32), ()) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) usleep(params->data[0].of.i32 * 1000); #endif @@ -56,7 +56,7 @@ ONYX_DEF(__time, (), (WASM_I64)) { // ([] PollDescription, timeout: i32) -> void // PollDescription :: struct { fd: i64; in_event: PollEvent; out_event: PollEvent; } ONYX_DEF(__poll, (WASM_I32, WASM_I32, WASM_I32), ()) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) struct pollfd* fds = alloca(params->data[1].of.i32 * sizeof(struct pollfd)); for (int i=0; i < params->data[1].of.i32; i++) { @@ -102,7 +102,7 @@ ONYX_DEF(__poll, (WASM_I32, WASM_I32, WASM_I32), ()) { ONYX_DEF(__lookup_env, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) char *key_ptr = ONYX_PTR(params->data[0].of.i32); int key_len = params->data[1].of.i32; char *out_ptr = ONYX_PTR(params->data[2].of.i32); @@ -131,7 +131,7 @@ ONYX_DEF(__lookup_env, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) { ONYX_DEF(__random_get, (WASM_PTR, WASM_I32), ()) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) getrandom(ONYX_PTR(params->data[0].of.i32), params->data[1].of.i32, 0); #endif @@ -149,7 +149,7 @@ ONYX_DEF(__random_get, (WASM_PTR, WASM_I32), ()) { ONYX_DEF(__futex_wait, (WASM_PTR, WASM_I32, WASM_I32), (WASM_I32)) { int *addr = ONYX_PTR(params->data[0].of.i32); - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) struct timespec delay; struct timespec *t = NULL; @@ -181,7 +181,7 @@ ONYX_DEF(__futex_wait, (WASM_PTR, WASM_I32, WASM_I32), (WASM_I32)) { ONYX_DEF(__futex_wake, (WASM_PTR, WASM_I32), (WASM_I32)) { int *addr = ONYX_PTR(params->data[0].of.i32); - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) int res = syscall(SYS_futex, addr, FUTEX_WAKE, params->data[1].of.i32, NULL, NULL, 0); results->data[0] = WASM_I32_VAL(res); @@ -200,7 +200,7 @@ ONYX_DEF(__futex_wake, (WASM_PTR, WASM_I32), (WASM_I32)) { -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) static wasm_func_t *wasm_cleanup_func; static void unix_signal_handler(int signo, siginfo_t *info, void *context) { @@ -211,7 +211,7 @@ static void unix_signal_handler(int signo, siginfo_t *info, void *context) { #endif ONYX_DEF(__register_cleanup, (WASM_I32, WASM_I32), (WASM_I32)) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) int len = (127 < params->data[1].of.i32 ? 127 : params->data[1].of.i32); char name[128]; diff --git a/runtime/src/ort_processes.h b/runtime/src/ort_processes.h index 600deca1..d4fa1120 100644 --- a/runtime/src/ort_processes.h +++ b/runtime/src/ort_processes.h @@ -7,7 +7,7 @@ typedef struct OnyxProcess { u64 magic_number; -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) // Pipes i32 proc_to_host[2]; i32 host_to_proc[2]; @@ -50,7 +50,7 @@ ONYX_DEF(__process_spawn, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WAS memset(process, 0, sizeof(*process)); process->magic_number = ONYX_PROCESS_MAGIC_NUMBER; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) // :Security - alloca a user controlled string. char **process_args = alloca(sizeof(char *) * (args_len + 2)); byte_t* array_loc = ONYX_PTR(args_ptr); @@ -198,7 +198,7 @@ ONYX_DEF(__process_read, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { u8 *buffer = ONYX_PTR(output_ptr); i32 bytes_read; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) bytes_read = read(process->proc_to_host[0], buffer, output_len); if (bytes_read < 0) { switch (errno) { @@ -232,7 +232,7 @@ ONYX_DEF(__process_write, (WASM_I64, WASM_I32, WASM_I32), (WASM_I32)) { u8 *buffer = ONYX_PTR(input_ptr); i32 bytes_written; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) bytes_written = write(process->host_to_proc[1], buffer, input_len); bytes_written = bh_max(bytes_written, 0); // Silently consume errors #endif @@ -253,7 +253,7 @@ ONYX_DEF(__process_kill, (WASM_I64), (WASM_I32)) { return NULL; } - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) i32 failed = kill(process->pid, SIGKILL); results->data[0] = WASM_I32_VAL(!failed); #endif @@ -273,7 +273,7 @@ ONYX_DEF(__process_wait, (WASM_I64), (WASM_I32)) { return NULL; } - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) i32 status; waitpid(process->pid, &status, 0); @@ -330,7 +330,7 @@ ONYX_DEF(__process_destroy, (WASM_I64), ()) { return NULL; } - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) close(process->proc_to_host[0]); close(process->host_to_proc[1]); #endif diff --git a/runtime/src/ort_threads.h b/runtime/src/ort_threads.h index c58114d6..92cc35a5 100644 --- a/runtime/src/ort_threads.h +++ b/runtime/src/ort_threads.h @@ -11,7 +11,7 @@ typedef struct OnyxThread { i32 dataptr; wasm_instance_t* instance; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) pthread_t thread; #endif @@ -23,7 +23,7 @@ typedef struct OnyxThread { static bh_arr(OnyxThread) threads = NULL; -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) static void *onyx_run_thread(void *data) { #endif #ifdef _BH_WINDOWS @@ -94,7 +94,7 @@ ONYX_DEF(__spawn_thread, (WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM_I32, WASM thread->closureptr = params->data[4].of.i32; thread->dataptr = params->data[6].of.i32; - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) pthread_create(&thread->thread, NULL, onyx_run_thread, thread); #endif @@ -113,7 +113,7 @@ ONYX_DEF(__kill_thread, (WASM_I32), (WASM_I32)) { i32 i = 0; bh_arr_each(OnyxThread, thread, threads) { if (thread->id == thread_id) { - #ifdef _BH_LINUX + #if defined(_BH_LINUX) || defined(_BH_DARWIN) // This leads to some weirdness and bugs... // // pthread_kill(thread->thread, SIGKILL); diff --git a/runtime/src/ort_tty.h b/runtime/src/ort_tty.h index 2bbf6b1e..12dce9d8 100644 --- a/runtime/src/ort_tty.h +++ b/runtime/src/ort_tty.h @@ -8,7 +8,7 @@ struct Onyx_TTY_State { ONYX_DEF(__tty_get, (WASM_I32), ()) { struct Onyx_TTY_State *state = ONYX_PTR(params->data[0].of.i32); -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) struct winsize sz; ioctl(0, TIOCGWINSZ, &sz); state->rows = sz.ws_row; @@ -40,7 +40,7 @@ ONYX_DEF(__tty_get, (WASM_I32), ()) { ONYX_DEF(__tty_set, (WASM_I32), (WASM_I32)) { struct Onyx_TTY_State *state = ONYX_PTR(params->data[0].of.i32); -#ifdef _BH_LINUX +#if defined(_BH_LINUX) || defined(_BH_DARWIN) int success = 1; struct termios term; diff --git a/shared/include/onyx_library.h b/shared/include/onyx_library.h index eb5c3ce4..41789a7a 100644 --- a/shared/include/onyx_library.h +++ b/shared/include/onyx_library.h @@ -8,7 +8,7 @@ #define ONYX_IMPORT extern __declspec(dllimport) #endif -#if defined(__unix__) +#if defined(__unix__) || defined(__APPLE__) #define ONYX_EXPORT #define ONYX_IMPORT #endif