diff --git a/platforms/app/main.c b/platforms/app/main.c index aed94ba..8aec75a 100644 --- a/platforms/app/main.c +++ b/platforms/app/main.c @@ -18,6 +18,10 @@ #define FATAL(msg, ...) { printf("Error: [Fatal] " msg "\n", ##__VA_ARGS__); goto _onfatal; } +#if defined(d_m3HasWASI) || defined(d_m3HasMetaWASI) || defined(d_m3HasUVWASI) +#define LINK_WASI +#endif + M3Result repl_load (IM3Runtime runtime, const char* fn) { M3Result result = m3Err_none; @@ -273,7 +277,7 @@ int main (int i_argc, const char* i_argv[]) } else if (!strcmp("--dump-on-trap", arg)) { argDumpOnTrap = true; } else if (!strcmp("--stack-size", arg)) { - const char* tmp; + const char* tmp = "65536"; ARGV_SET(tmp); argStackSize = atol(tmp); } else if (!strcmp("--dir", arg)) { @@ -301,7 +305,7 @@ int main (int i_argc, const char* i_argv[]) result = repl_load(runtime, argFile); if (result) FATAL("repl_load: %s", result); -#if defined(d_m3HasWASI) || defined(d_m3HasMetaWASI) || defined(d_m3HasUVWASI) +#if defined(LINK_WASI) result = m3_LinkWASI (runtime->modules); if (result) FATAL("m3_LinkWASI: %s", result); #endif @@ -315,6 +319,7 @@ int main (int i_argc, const char* i_argv[]) if (result) FATAL("m3_LinkLibC: %s", result); if (argFunc and not argRepl) { +#if defined(LINK_WASI) if (!strcmp(argFunc, "_start")) { m3_wasi_context_t* wasi_ctx = m3_GetWasiContext(); // When passing args to WASI, include wasm filename as argv[0] @@ -324,7 +329,10 @@ int main (int i_argc, const char* i_argv[]) if (result == m3Err_trapExit) { return wasi_ctx->exit_code; } - } else { + } + else +#endif + { result = repl_call(runtime, argFunc, i_argc, i_argv); } diff --git a/platforms/cosmopolitan/.gitignore b/platforms/cosmopolitan/.gitignore new file mode 100644 index 0000000..f920527 --- /dev/null +++ b/platforms/cosmopolitan/.gitignore @@ -0,0 +1 @@ +cosmopolitan/ diff --git a/platforms/cosmopolitan/build.sh b/platforms/cosmopolitan/build.sh new file mode 100755 index 0000000..5933d0c --- /dev/null +++ b/platforms/cosmopolitan/build.sh @@ -0,0 +1,33 @@ + +COSMOPOLITAN_URL=https://justine.lol/cosmopolitan/cosmopolitan.zip + +SOURCE_DIR=../../source + +EXTRA_FLAGS= #-Dd_m3HasWASI + +STD=./cosmopolitan/std + +if [ ! -d "./cosmopolitan" ]; then + echo "Downloading Cosmopolitan..." + curl -o cosmopolitan.zip $COSMOPOLITAN_URL + unzip cosmopolitan.zip -d cosmopolitan + rm cosmopolitan.zip +fi + +if [ ! -d "$STD/sys" ]; then + # Generate header stubs + mkdir -p $STD/sys + touch $STD/assert.h $STD/limits.h $STD/ctype.h $STD/time.h $STD/errno.h + touch $STD/inttypes.h $STD/fcntl.h $STD/math.h $STD/stdarg.h $STD/stdbool.h + touch $STD/stdint.h $STD/stdio.h $STD/stdlib.h $STD/string.h $STD/stddef.h + touch $STD/sys/types.h $STD/sys/stat.h $STD/unistd.h $STD/sys/uio.h $STD/sys/random.h +fi + +echo "Building Wasm3..." + +gcc -g -O -static -fno-pie -no-pie -mno-red-zone -nostdlib -nostdinc \ + -Wl,--oformat=binary -Wl,--gc-sections -Wl,-z,max-page-size=0x1000 -fuse-ld=bfd \ + -Wl,-T,cosmopolitan/ape.lds -include cosmopolitan/cosmopolitan.h \ + -Wno-format-security -Wfatal-errors $EXTRA_FLAGS \ + -o wasm3.com -DAPE -I$STD -I$SOURCE_DIR $SOURCE_DIR/*.c ../app/main.c \ + cosmopolitan/crt.o cosmopolitan/ape.o cosmopolitan/cosmopolitan.a diff --git a/platforms/cosmopolitan/wasm3.com b/platforms/cosmopolitan/wasm3.com new file mode 100755 index 0000000..0a6f758 Binary files /dev/null and b/platforms/cosmopolitan/wasm3.com differ diff --git a/source/m3_api_wasi.c b/source/m3_api_wasi.c index bae646e..ea83d1a 100644 --- a/source/m3_api_wasi.c +++ b/source/m3_api_wasi.c @@ -31,7 +31,10 @@ #include #include -#if defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__) +#if defined(APE) +// Actually Portable Executable +// All functions are already included in cosmopolitan.h +#elif defined(__wasi__) || defined(__APPLE__) || defined(__ANDROID_API__) || defined(__OpenBSD__) || defined(__linux__) || defined(__EMSCRIPTEN__) # include # include # if defined(__APPLE__) @@ -84,44 +87,54 @@ Preopen preopen[PREOPEN_CNT] = { { -1, "/" , "./" }, }; +#if defined(APE) +# define APE_SWITCH_BEG +# define APE_SWITCH_END {} +# define APE_CASE_RET(e1,e2) if (errnum == e1) return e2; else +#else +# define APE_SWITCH switch (errnum) { +# define APE_SWITCH_END } +# define APE_CASE_RET(e1,e2) case e1: return e2; break; +#endif + static __wasi_errno_t errno_to_wasi(int errnum) { - switch (errnum) { - case EPERM: return __WASI_ERRNO_PERM; break; - case ENOENT: return __WASI_ERRNO_NOENT; break; - case ESRCH: return __WASI_ERRNO_SRCH; break; - case EINTR: return __WASI_ERRNO_INTR; break; - case EIO: return __WASI_ERRNO_IO; break; - case ENXIO: return __WASI_ERRNO_NXIO; break; - case E2BIG: return __WASI_ERRNO_2BIG; break; - case ENOEXEC: return __WASI_ERRNO_NOEXEC; break; - case EBADF: return __WASI_ERRNO_BADF; break; - case ECHILD: return __WASI_ERRNO_CHILD; break; - case EAGAIN: return __WASI_ERRNO_AGAIN; break; - case ENOMEM: return __WASI_ERRNO_NOMEM; break; - case EACCES: return __WASI_ERRNO_ACCES; break; - case EFAULT: return __WASI_ERRNO_FAULT; break; - case EBUSY: return __WASI_ERRNO_BUSY; break; - case EEXIST: return __WASI_ERRNO_EXIST; break; - case EXDEV: return __WASI_ERRNO_XDEV; break; - case ENODEV: return __WASI_ERRNO_NODEV; break; - case ENOTDIR: return __WASI_ERRNO_NOTDIR; break; - case EISDIR: return __WASI_ERRNO_ISDIR; break; - case EINVAL: return __WASI_ERRNO_INVAL; break; - case ENFILE: return __WASI_ERRNO_NFILE; break; - case EMFILE: return __WASI_ERRNO_MFILE; break; - case ENOTTY: return __WASI_ERRNO_NOTTY; break; - case ETXTBSY: return __WASI_ERRNO_TXTBSY; break; - case EFBIG: return __WASI_ERRNO_FBIG; break; - case ENOSPC: return __WASI_ERRNO_NOSPC; break; - case ESPIPE: return __WASI_ERRNO_SPIPE; break; - case EROFS: return __WASI_ERRNO_ROFS; break; - case EMLINK: return __WASI_ERRNO_MLINK; break; - case EPIPE: return __WASI_ERRNO_PIPE; break; - case EDOM: return __WASI_ERRNO_DOM; break; - case ERANGE: return __WASI_ERRNO_RANGE; break; - default: return __WASI_ERRNO_INVAL; - } + APE_SWITCH_BEG + APE_CASE_RET( EPERM , __WASI_ERRNO_PERM ) + APE_CASE_RET( ENOENT , __WASI_ERRNO_NOENT ) + APE_CASE_RET( ESRCH , __WASI_ERRNO_SRCH ) + APE_CASE_RET( EINTR , __WASI_ERRNO_INTR ) + APE_CASE_RET( EIO , __WASI_ERRNO_IO ) + APE_CASE_RET( ENXIO , __WASI_ERRNO_NXIO ) + APE_CASE_RET( E2BIG , __WASI_ERRNO_2BIG ) + APE_CASE_RET( ENOEXEC , __WASI_ERRNO_NOEXEC ) + APE_CASE_RET( EBADF , __WASI_ERRNO_BADF ) + APE_CASE_RET( ECHILD , __WASI_ERRNO_CHILD ) + APE_CASE_RET( EAGAIN , __WASI_ERRNO_AGAIN ) + APE_CASE_RET( ENOMEM , __WASI_ERRNO_NOMEM ) + APE_CASE_RET( EACCES , __WASI_ERRNO_ACCES ) + APE_CASE_RET( EFAULT , __WASI_ERRNO_FAULT ) + APE_CASE_RET( EBUSY , __WASI_ERRNO_BUSY ) + APE_CASE_RET( EEXIST , __WASI_ERRNO_EXIST ) + APE_CASE_RET( EXDEV , __WASI_ERRNO_XDEV ) + APE_CASE_RET( ENODEV , __WASI_ERRNO_NODEV ) + APE_CASE_RET( ENOTDIR , __WASI_ERRNO_NOTDIR ) + APE_CASE_RET( EISDIR , __WASI_ERRNO_ISDIR ) + APE_CASE_RET( EINVAL , __WASI_ERRNO_INVAL ) + APE_CASE_RET( ENFILE , __WASI_ERRNO_NFILE ) + APE_CASE_RET( EMFILE , __WASI_ERRNO_MFILE ) + APE_CASE_RET( ENOTTY , __WASI_ERRNO_NOTTY ) + APE_CASE_RET( ETXTBSY , __WASI_ERRNO_TXTBSY ) + APE_CASE_RET( EFBIG , __WASI_ERRNO_FBIG ) + APE_CASE_RET( ENOSPC , __WASI_ERRNO_NOSPC ) + APE_CASE_RET( ESPIPE , __WASI_ERRNO_SPIPE ) + APE_CASE_RET( EROFS , __WASI_ERRNO_ROFS ) + APE_CASE_RET( EMLINK , __WASI_ERRNO_MLINK ) + APE_CASE_RET( EPIPE , __WASI_ERRNO_PIPE ) + APE_CASE_RET( EDOM , __WASI_ERRNO_DOM ) + APE_CASE_RET( ERANGE , __WASI_ERRNO_RANGE ) + APE_SWITCH_END + return __WASI_ERRNO_INVAL; } #if defined(_WIN32) diff --git a/source/m3_env.h b/source/m3_env.h index b21d3a2..fa58593 100644 --- a/source/m3_env.h +++ b/source/m3_env.h @@ -247,8 +247,6 @@ IM3CodePage AcquireCodePage (IM3Runtime io_runtime); IM3CodePage AcquireCodePageWithCapacity (IM3Runtime io_runtime, u32 i_lineCount); void ReleaseCodePage (IM3Runtime io_runtime, IM3CodePage i_codePage); -M3Result m3Error (M3Result i_result, IM3Runtime i_runtime, IM3Module i_module, IM3Function i_function, const char * const i_file, u32 i_lineNum, const char * const i_errorMessage, ...); - d_m3EndExternC #endif // m3_env_h