From 66e84a5f18be5e45f59385eca3f2e607484bd816 Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Thu, 23 Apr 2020 01:40:37 +0300 Subject: [PATCH] Switch to UVWASI for a test --- CMakeLists.txt | 34 +++++-------- source/CMakeLists.txt | 26 +++++----- source/m3_api_meta_wasi.c | 4 +- source/m3_api_uvwasi.c | 104 ++++++++++++++++++++++++++++---------- source/m3_api_wasi.c | 4 +- 5 files changed, 105 insertions(+), 67 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 86a5e02..d600da0 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.11) -option(BUILD_WASI_SUPPORT "Build with WASI support" ON) -option(BUILD_UVWASI_SUPPORT "Build with UVWASI support" OFF) +set(BUILD_WASI "uvwasi" CACHE STRING "WASI implementation") +set_property(CACHE BUILD_WASI PROPERTY STRINGS none simple uvwasi metawasi) set(OUT_FILE "wasm3") set(APP_DIR "platforms/app") @@ -98,10 +98,7 @@ if(EMSCRIPTEN OR EMSCRIPTEN_LIB) elseif(WASIENV) - if(BUILD_WASI_SUPPORT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasMetaWASI -Dd_m3HasTracer") - endif() - + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasTracer") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -Wfatal-errors -fomit-frame-pointer -fno-stack-check -fno-stack-protector") # TODO: LTO breaks wasm imports currently: @@ -112,11 +109,7 @@ elseif(WASIENV) elseif(WIN32) - if(BUILD_WASI_SUPPORT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI -Dd_m3HasTracer") - endif() - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS /WX- /diagnostics:column") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasTracer -D_CRT_SECURE_NO_WARNINGS /WX- /diagnostics:column") string(REGEX REPLACE "/W[0-4]" "/W0" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") @@ -140,10 +133,7 @@ elseif(WIN32) else() - if(BUILD_WASI_SUPPORT) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI -Dd_m3HasTracer") #-Dd_m3FixedHeap=1048576 - endif() - + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasTracer") #-Dd_m3FixedHeap=1048576 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wparentheses -Wundef -Wpointer-arith -Wstrict-aliasing=2") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=implicit-function-declaration") # -Werror=cast-align set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function -Wno-unused-variable -Wno-unused-parameter -Wno-missing-field-initializers") @@ -154,7 +144,7 @@ else() endif() set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -O0") - if(NOT BUILD_UVWASI_SUPPORT) + if(NOT BUILD_WASI MATCHES "uvwasi") # -Werror=shadow fails when building libuv. Enable it only if libuv is not present. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror=shadow") endif() @@ -167,11 +157,11 @@ else() endif() -if(BUILD_UVWASI_SUPPORT) - if(BUILD_WASI_SUPPORT) - message(FATAL_ERROR "BUILD_UVWASI_SUPPORT is incompatible with BUILD_WASI_SUPPORT") - endif() - +if(BUILD_WASI MATCHES "simple") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasWASI") +elseif(BUILD_WASI MATCHES "metawasi") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasMetaWASI") +elseif(BUILD_WASI MATCHES "uvwasi") include(FetchContent) FetchContent_Declare( uvwasi @@ -185,7 +175,7 @@ if(BUILD_UVWASI_SUPPORT) include_directories("${uvwasi_SOURCE_DIR}/include") add_subdirectory(${uvwasi_SOURCE_DIR} ${uvwasi_BINARY_DIR} EXCLUDE_FROM_ALL) endif() - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasUVWASI -Dd_m3HasTracer") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dd_m3HasUVWASI") target_link_libraries(${OUT_FILE} uvwasi_a uv_a) endif() diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 30b7efe..af36d10 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,9 +1,9 @@ -set(srcs +set(sources "m3_api_libc.c" - "m3_api_meta_wasi.c" "m3_api_wasi.c" - "m3_api_tracer.c" "m3_api_uvwasi.c" + "m3_api_meta_wasi.c" + "m3_api_tracer.c" "m3_bind.c" "m3_code.c" "m3_compile.c" @@ -16,10 +16,12 @@ set(srcs "m3_parse.c" ) -add_library(m3 STATIC ${srcs}) +add_library(m3 STATIC ${sources}) target_include_directories(m3 PUBLIC .) +target_compile_features(m3 PRIVATE c_std_99) + if (CMAKE_C_COMPILER_ID MATCHES "MSVC") # add MSVC specific flags here else() @@ -45,13 +47,11 @@ else() endif() endif() -option(BUILD_WASI_SUPPORT "Build with WASI support" OFF) - -if (BUILD_WASI_SUPPORT) - if (WASIENV) - target_compile_definitions(m3 PUBLIC d_m3HasMetaWASI) - elseif (EMSCRIPTEN OR EMSCRIPTEN_LIB) - else() - target_compile_definitions(m3 PUBLIC d_m3HasWASI) - endif() +if(BUILD_WASI MATCHES "simple") + target_compile_definitions(m3 PUBLIC d_m3HasWASI) +elseif(BUILD_WASI MATCHES "metawasi") + target_compile_definitions(m3 PUBLIC d_m3HasMetaWASI) +elseif(BUILD_WASI MATCHES "uvwasi") + target_compile_definitions(m3 PUBLIC d_m3HasUVWASI) + include_directories("${libuv_SOURCE_DIR}/include") endif() diff --git a/source/m3_api_meta_wasi.c b/source/m3_api_meta_wasi.c index 2e79fd1..25c3719 100644 --- a/source/m3_api_meta_wasi.c +++ b/source/m3_api_meta_wasi.c @@ -339,8 +339,8 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_get _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(iii*)", &m3_wasi_unstable_fd_write))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(iii*)", &m3_wasi_unstable_fd_read))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(i*i*)", &m3_wasi_unstable_fd_write))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(i*i*)", &m3_wasi_unstable_fd_read))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", "i(i)", &m3_wasi_unstable_fd_datasync))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_close", "i(i)", &m3_wasi_unstable_fd_close))); diff --git a/source/m3_api_uvwasi.c b/source/m3_api_uvwasi.c index 8a864bb..40ff607 100644 --- a/source/m3_api_uvwasi.c +++ b/source/m3_api_uvwasi.c @@ -156,7 +156,7 @@ m3ApiRawFunction(m3_wasi_unstable_fd_prestat_get) // TODO(cjihrig): This memory writing logic is wrong. *buf = prestat.pr_type; - *(buf + 4) = prestat.u.dir.pr_name_len; + *(buf + 1) = prestat.u.dir.pr_name_len; m3ApiReturn(UVWASI_ESUCCESS); } @@ -215,6 +215,20 @@ m3ApiRawFunction(m3_wasi_unstable_path_open) fd)); } +m3ApiRawFunction(m3_wasi_unstable_path_filestat_get) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArg (__wasi_fd_t , fd) + m3ApiGetArg (__wasi_lookupflags_t , flags) + m3ApiGetArgMem (const char * , path) + m3ApiGetArg (uint32_t , path_len) + m3ApiGetArgMem (__wasi_filestat_t * , buf) + + uvwasi_errno_t ret = uvwasi_path_filestat_get(&uvwasi, fd, flags, path, path_len, buf); + + m3ApiReturn(ret); +} + m3ApiRawFunction(m3_wasi_unstable_fd_read) { m3ApiReturnType (uint32_t) @@ -223,9 +237,14 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read) m3ApiGetArg (__wasi_size_t , iovs_len) m3ApiGetArgMem (__wasi_size_t* , nread) - uvwasi_iovec_t* iovs = calloc(iovs_len, sizeof(uvwasi_iovec_t)); + // TODO: check iovs_len +#if defined(M3_COMPILER_MSVC) + uvwasi_ciovec_t iovs[32]; +#else + uvwasi_ciovec_t iovs[iovs_len]; +#endif size_t num_read; - uvwasi_errno_t err; + uvwasi_errno_t ret; if (iovs == NULL) { m3ApiReturn(UVWASI_ENOMEM); @@ -236,10 +255,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_read) iovs[i].buf_len = wasi_iovs[i].buf_len; } - err = uvwasi_fd_read(&uvwasi, fd, iovs, iovs_len, &num_read); + ret = uvwasi_fd_read(&uvwasi, fd, iovs, iovs_len, &num_read); *nread = num_read; - free(iovs); - m3ApiReturn(err); + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_write) @@ -250,9 +268,15 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write) m3ApiGetArg (__wasi_size_t , iovs_len) m3ApiGetArgMem (__wasi_size_t* , nwritten) - uvwasi_ciovec_t* iovs = calloc(iovs_len, sizeof(uvwasi_ciovec_t)); + // TODO: check iovs_len + +#if defined(M3_COMPILER_MSVC) + uvwasi_ciovec_t iovs[32]; +#else + uvwasi_ciovec_t iovs[iovs_len]; +#endif size_t num_written; - uvwasi_errno_t err; + uvwasi_errno_t ret; if (iovs == NULL) { m3ApiReturn(UVWASI_ENOMEM); @@ -263,10 +287,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_write) iovs[i].buf_len = wasi_iovs[i].buf_len; } - err = uvwasi_fd_write(&uvwasi, fd, iovs, iovs_len, &num_written); + ret = uvwasi_fd_write(&uvwasi, fd, iovs, iovs_len, &num_written); *nwritten = num_written; - free(iovs); - m3ApiReturn(err); + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_close) @@ -274,7 +297,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_close) m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t, fd) - m3ApiReturn(uvwasi_fd_close(&uvwasi, fd)); + uvwasi_errno_t ret = uvwasi_fd_close(&uvwasi, fd); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_fd_datasync) @@ -282,7 +307,9 @@ m3ApiRawFunction(m3_wasi_unstable_fd_datasync) m3ApiReturnType (uint32_t) m3ApiGetArg (uvwasi_fd_t, fd) - m3ApiReturn(uvwasi_fd_datasync(&uvwasi, fd)); + uvwasi_errno_t ret = uvwasi_fd_datasync(&uvwasi, fd); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_random_get) @@ -291,7 +318,9 @@ m3ApiRawFunction(m3_wasi_unstable_random_get) m3ApiGetArgMem (uint8_t* , buf) m3ApiGetArg (__wasi_size_t , buflen) - m3ApiReturn(uvwasi_random_get(&uvwasi, buf, buflen)); + uvwasi_errno_t ret = uvwasi_random_get(&uvwasi, buf, buflen); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_clock_res_get) @@ -300,7 +329,9 @@ m3ApiRawFunction(m3_wasi_unstable_clock_res_get) m3ApiGetArg (uvwasi_clockid_t , wasi_clk_id) m3ApiGetArgMem (uvwasi_timestamp_t* , resolution) - m3ApiReturn(uvwasi_clock_res_get(&uvwasi, wasi_clk_id, resolution)); + uvwasi_errno_t ret = uvwasi_clock_res_get(&uvwasi, wasi_clk_id, resolution); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_clock_time_get) @@ -310,7 +341,22 @@ m3ApiRawFunction(m3_wasi_unstable_clock_time_get) m3ApiGetArg (uvwasi_timestamp_t , precision) m3ApiGetArgMem (uvwasi_timestamp_t* , time) - m3ApiReturn(uvwasi_clock_time_get(&uvwasi, wasi_clk_id, precision, time)); + uvwasi_errno_t ret = uvwasi_clock_time_get(&uvwasi, wasi_clk_id, precision, time); + + m3ApiReturn(ret); +} + +m3ApiRawFunction(m3_wasi_unstable_poll_oneoff) +{ + m3ApiReturnType (uint32_t) + m3ApiGetArgMem (const __wasi_subscription_t* , in) + m3ApiGetArgMem (__wasi_event_t* , out) + m3ApiGetArg (__wasi_size_t , nsubscriptions) + m3ApiGetArgMem (__wasi_size_t* , nevents) + + uvwasi_errno_t ret = uvwasi_poll_oneoff(&uvwasi, in, out, nsubscriptions, nevents); + + m3ApiReturn(ret); } m3ApiRawFunction(m3_wasi_unstable_proc_exit) @@ -343,7 +389,7 @@ M3Result m3_LinkWASI (IM3Module module) const char* wasi = "wasi_unstable"; uvwasi_options_t init_options; - uvwasi_errno_t err; + uvwasi_errno_t ret; init_options.in = 0; init_options.out = 1; @@ -355,25 +401,24 @@ M3Result m3_LinkWASI (IM3Module module) init_options.argc = 0; init_options.argv = NULL; init_options.envp = (char**) environ; - init_options.preopenc = 1; + // TODO(cjihrig): This requires better support for the --dir command line // flag to implement properly. For now, just let WASI applications access // the current working directory as the sandboxed root directory. - init_options.preopens = calloc(1, sizeof(uvwasi_preopen_t)); - if (init_options.preopens == NULL) { - result = m3Err_mallocFailed; - return result; - } - init_options.preopens[0].mapped_path = "/"; - init_options.preopens[0].real_path = "."; + uvwasi_preopen_t preopens[1]; + preopens[0].mapped_path = "/"; + preopens[0].real_path = "."; + + init_options.preopenc = 1; + init_options.preopens = &preopens; init_options.allocator = NULL; - err = uvwasi_init(&uvwasi, &init_options); - free(init_options.preopens); + + ret = uvwasi_init(&uvwasi, &init_options); // uvwasi_init() returns WASI errors, which don't really map to m3 Errors, // so return unknown error for now. - if (err != UVWASI_ESUCCESS) { + if (ret != UVWASI_ESUCCESS) { result = m3Err_unknownError; return result; } @@ -387,6 +432,7 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_dir_na _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_prestat_get", "i(i*)", &m3_wasi_unstable_fd_prestat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", "i(ii*iiIIi*)", &m3_wasi_unstable_path_open))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_filestat_get", "i(ii*i*)", &m3_wasi_unstable_path_filestat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags))); @@ -400,6 +446,8 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "random_get", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_res_get", "i(i*)", &m3_wasi_unstable_clock_res_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "clock_time_get", "i(iI*)", &m3_wasi_unstable_clock_time_get))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "poll_oneoff", "i(**i*)", &m3_wasi_unstable_poll_oneoff))); + _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "proc_exit", "v(i)", &m3_wasi_unstable_proc_exit))); _catch: diff --git a/source/m3_api_wasi.c b/source/m3_api_wasi.c index b59f166..ee67775 100644 --- a/source/m3_api_wasi.c +++ b/source/m3_api_wasi.c @@ -664,8 +664,8 @@ _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "path_open", _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_get", "i(i*)", &m3_wasi_unstable_fd_fdstat_get))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_fdstat_set_flags", "i(ii)", &m3_wasi_unstable_fd_fdstat_set_flags))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(iii*)", &m3_wasi_unstable_fd_write))); -_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(iii*)", &m3_wasi_unstable_fd_read))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_write", "i(i*i*)", &m3_wasi_unstable_fd_write))); +_ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_read", "i(i*i*)", &m3_wasi_unstable_fd_read))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_seek", "i(iIi*)", &m3_wasi_unstable_fd_seek))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_datasync", "i(i)", &m3_wasi_unstable_fd_datasync))); _ (SuppressLookupFailure (m3_LinkRawFunction (module, wasi, "fd_close", "i(i)", &m3_wasi_unstable_fd_close)));