Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,13 @@ if(CMAKE_SYSTEM_NAME STREQUAL "WASI")
set(HAVE_STRLCPY 1 CACHE BOOL "WASI libc result")
set(HAVE_SYSCONF 1 CACHE BOOL "WASI libc result")
set(HAVE_ARC4RANDOM 1 CACHE BOOL "WASI libc result")
set(USE_POSIX_SEM 0 CACHE BOOL "WASI libc result")
if(DISPATCH_WASI_THREADS)
# wasip1-threads: sem_t is a real blocking semaphore (proven under
# wasmtime v24, including sem_timedwait)
set(USE_POSIX_SEM 1 CACHE BOOL "WASI threads libc result")
else()
set(USE_POSIX_SEM 0 CACHE BOOL "WASI libc result")
endif()
endif()


Expand Down
35 changes: 29 additions & 6 deletions cmake/toolchains/WASI.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,22 @@ set(CMAKE_SYSTEM_PROCESSOR wasm32)
set(SWIFT_WASI_TOOLCHAIN_PATH "${SWIFT_WASI_TOOLCHAIN_PATH}" CACHE PATH
"Host Swift .xctoolchain used to build for WASI")
set(SWIFT_WASI_SDK_PATH "${SWIFT_WASI_SDK_PATH}" CACHE PATH
"wasm32-unknown-wasip1 directory in a Swift WASI SDK")
"wasm32-unknown-wasip1 or wasm32-unknown-wasip1-threads directory in a Swift WASI SDK")
set(SWIFT_WASI_STATIC_RESOURCES_OVERRIDE "" CACHE PATH
"Optional override for the Swift static resource directory")
set(DISPATCH_WASI_BUILTINS_OVERRIDE "" CACHE FILEPATH
"Optional override for the WASI compiler-rt builtins archive")
option(DISPATCH_WASI_THREADS
"Experimental: target wasm32-unknown-wasip1-threads (wasi-threads hosts only)" OFF)
set(DISPATCH_WASI_MAX_MEMORY "268435456" CACHE STRING
"Shared-memory maximum in bytes for threads builds (wasm memories need a hard cap)")
list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
SWIFT_WASI_TOOLCHAIN_PATH
SWIFT_WASI_SDK_PATH
SWIFT_WASI_STATIC_RESOURCES_OVERRIDE
DISPATCH_WASI_BUILTINS_OVERRIDE)
DISPATCH_WASI_BUILTINS_OVERRIDE
DISPATCH_WASI_THREADS
DISPATCH_WASI_MAX_MEMORY)

if(NOT SWIFT_WASI_TOOLCHAIN_PATH)
message(FATAL_ERROR "Set SWIFT_WASI_TOOLCHAIN_PATH to the host Swift .xctoolchain")
Expand Down Expand Up @@ -85,25 +91,42 @@ if(ENABLE_SWIFT)
endif()
endif()

if(DISPATCH_WASI_THREADS)
set(_dispatch_wasi_triple wasm32-unknown-wasip1-threads)
else()
set(_dispatch_wasi_triple wasm32-unknown-wasip1)
endif()

set(CMAKE_C_COMPILER "${_dispatch_wasi_clang}")
set(CMAKE_CXX_COMPILER "${_dispatch_wasi_clangxx}")
set(CMAKE_AR "${_dispatch_wasi_ar}")
set(CMAKE_RANLIB "${_dispatch_wasi_ranlib}")
set(CMAKE_C_COMPILER_TARGET wasm32-unknown-wasip1)
set(CMAKE_CXX_COMPILER_TARGET wasm32-unknown-wasip1)
set(CMAKE_C_COMPILER_TARGET ${_dispatch_wasi_triple})
set(CMAKE_CXX_COMPILER_TARGET ${_dispatch_wasi_triple})
set(CMAKE_SYSROOT "${_dispatch_wasi_sysroot}")
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_EXECUTABLE_SUFFIX .wasm)

if(DISPATCH_WASI_THREADS)
# -pthread turns on atomics and shared memory. The memory must also be
# imported and exported with a hard maximum: wasi-threads hosts spawn
# each thread against the same imported shared memory, and a module
# that owns a private memory fails at the first pthread_create.
string(APPEND CMAKE_C_FLAGS_INIT " -pthread")
string(APPEND CMAKE_CXX_FLAGS_INIT " -pthread")
string(APPEND CMAKE_EXE_LINKER_FLAGS_INIT
" -Wl,--import-memory,--export-memory,--max-memory=${DISPATCH_WASI_MAX_MEMORY}")
endif()

if(ENABLE_SWIFT)
if(NOT EXISTS "${_dispatch_wasi_swiftc}")
message(FATAL_ERROR "Swift compiler does not exist: ${_dispatch_wasi_swiftc}")
endif()
set(CMAKE_Swift_COMPILER "${_dispatch_wasi_swiftc}")
set(CMAKE_Swift_COMPILER_TARGET wasm32-unknown-wasip1)
set(CMAKE_Swift_COMPILER_TARGET ${_dispatch_wasi_triple})
set(CMAKE_Swift_FLAGS
"-sdk \"${CMAKE_SYSROOT}\" -resource-dir \"${SWIFT_WASI_STATIC_RESOURCES}\"")
set(dispatch_MODULE_TRIPLE wasm32-unknown-wasip1 CACHE STRING "Swift module triple")
set(dispatch_MODULE_TRIPLE ${_dispatch_wasi_triple} CACHE STRING "Swift module triple")
set(dispatch_ARCH wasm32 CACHE STRING "Swift architecture")
set(dispatch_PLATFORM wasi CACHE STRING "Swift platform")
endif()
10 changes: 8 additions & 2 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ add_library(dispatch
event/event_internal.h
event/event_kevent.c
event/event_wasi.c
event/event_wasi_threads.c
event/event_windows.c
firehose/firehose_internal.h
shims/android_stubs.h
Expand Down Expand Up @@ -107,8 +108,13 @@ elseif(ANDROID)
target_compile_options(dispatch PRIVATE
-U_GNU_SOURCE)
elseif(CMAKE_SYSTEM_NAME STREQUAL "WASI")
target_compile_definitions(dispatch PRIVATE
DISPATCH_HW_CONFIG_UP=1)
if(NOT DISPATCH_WASI_THREADS)
# single-threaded wasip1 is a uniprocessor by construction; the threads
# target is not (and DISPATCH_HW_CONFIG_UP also shrinks continuations
# below sizeof(struct dispatch_apply_s) there)
target_compile_definitions(dispatch PRIVATE
DISPATCH_HW_CONFIG_UP=1)
endif()
target_compile_definitions(dispatch PUBLIC
"$<$<COMPILE_LANGUAGE:C,CXX>:_WASI_EMULATED_SIGNAL>"
"$<$<COMPILE_LANGUAGE:C,CXX>:_WASI_EMULATED_MMAN>"
Expand Down
14 changes: 13 additions & 1 deletion src/event/event_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,39 @@
#ifndef __DISPATCH_EVENT_EVENT_CONFIG__
#define __DISPATCH_EVENT_EVENT_CONFIG__

#if defined(__wasi__)
#if defined(__wasi__) && !defined(_REENTRANT)
# define DISPATCH_EVENT_BACKEND_EPOLL 0
# define DISPATCH_EVENT_BACKEND_KEVENT 0
# define DISPATCH_EVENT_BACKEND_WASI 1
# define DISPATCH_EVENT_BACKEND_WASI_THREADS 0
# define DISPATCH_EVENT_BACKEND_WINDOWS 0
#elif defined(__wasi__)
// wasm32-wasip1-threads: experimental threaded mode; a manager thread on a
// condition variable replaces the cooperative drain (event_wasi_threads.c)
# define DISPATCH_EVENT_BACKEND_EPOLL 0
# define DISPATCH_EVENT_BACKEND_KEVENT 0
# define DISPATCH_EVENT_BACKEND_WASI 0
# define DISPATCH_EVENT_BACKEND_WASI_THREADS 1
# define DISPATCH_EVENT_BACKEND_WINDOWS 0
#elif defined(__linux__)
# include <sys/eventfd.h>
# define DISPATCH_EVENT_BACKEND_EPOLL 1
# define DISPATCH_EVENT_BACKEND_KEVENT 0
# define DISPATCH_EVENT_BACKEND_WASI 0
# define DISPATCH_EVENT_BACKEND_WASI_THREADS 0
# define DISPATCH_EVENT_BACKEND_WINDOWS 0
#elif __has_include(<sys/event.h>)
# include <sys/event.h>
# define DISPATCH_EVENT_BACKEND_EPOLL 0
# define DISPATCH_EVENT_BACKEND_KEVENT 1
# define DISPATCH_EVENT_BACKEND_WASI 0
# define DISPATCH_EVENT_BACKEND_WASI_THREADS 0
# define DISPATCH_EVENT_BACKEND_WINDOWS 0
#elif defined(_WIN32)
# define DISPATCH_EVENT_BACKEND_EPOLL 0
# define DISPATCH_EVENT_BACKEND_KEVENT 0
# define DISPATCH_EVENT_BACKEND_WASI 0
# define DISPATCH_EVENT_BACKEND_WASI_THREADS 0
# define DISPATCH_EVENT_BACKEND_WINDOWS 1
#else
# error unsupported event loop
Expand Down
Loading