Switch to UVWASI for a test

extensions
Volodymyr Shymanskyy 4 years ago
parent cf843bb327
commit 66e84a5f18

@ -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()

@ -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()

@ -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)));

@ -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:

@ -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)));

Loading…
Cancel
Save