Skip to content

Commit 486c8f9

Browse files
Milek7vargaz
authored andcommitted
Add support for WASI threads
1 parent eb0c20c commit 486c8f9

File tree

19 files changed

+209
-44
lines changed

19 files changed

+209
-44
lines changed

eng/native/gen-buildsys.cmd

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ set __Arch=%4
2222
set __Os=%5
2323
set __CmakeGenerator=Visual Studio
2424
set __UseEmcmake=0
25+
set __Pthreads=0
2526
if /i "%__Ninja%" == "1" (
2627
set __CmakeGenerator=Ninja
2728
) else (
@@ -37,6 +38,14 @@ if /i "%__Ninja%" == "1" (
3738
)
3839
)
3940

41+
:loop
42+
if [%6] == [] goto end_loop
43+
if ""%6"" == """-DCMAKE_USE_PTHREADS=1""" set __Pthreads=1
44+
set __ExtraCmakeParams=%__ExtraCmakeParams% %6
45+
shift
46+
goto loop
47+
:end_loop
48+
4049
if /i "%__Arch%" == "wasm" (
4150

4251
if "%__Os%" == "" (
@@ -72,19 +81,16 @@ if /i "%__Arch%" == "wasm" (
7281
set "WASI_SDK_PATH=!WASI_SDK_PATH:\=/!"
7382
if not "!WASI_SDK_PATH:~-1!" == "/" set "WASI_SDK_PATH=!WASI_SDK_PATH!/"
7483
set __CmakeGenerator=Ninja
75-
set __ExtraCmakeParams=%__ExtraCmakeParams% -DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm "-DWASI_SDK_PREFIX=!WASI_SDK_PATH!" "-DCMAKE_TOOLCHAIN_FILE=!WASI_SDK_PATH!/share/cmake/wasi-sdk.cmake" "-DCMAKE_SYSROOT=!WASI_SDK_PATH!/share/wasi-sysroot"
84+
if "%__Pthreads%" == "1" (
85+
set __ExtraCmakeParams=%__ExtraCmakeParams% -DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm "-DWASI_SDK_PREFIX=!WASI_SDK_PATH!" "-DCMAKE_TOOLCHAIN_FILE=!WASI_SDK_PATH!/share/cmake/wasi-sdk-pthread.cmake" "-DCMAKE_SYSROOT=!WASI_SDK_PATH!/share/wasi-sysroot"
86+
) else (
87+
set __ExtraCmakeParams=%__ExtraCmakeParams% -DCLR_CMAKE_TARGET_OS=wasi -DCLR_CMAKE_TARGET_ARCH=wasm "-DWASI_SDK_PREFIX=!WASI_SDK_PATH!" "-DCMAKE_TOOLCHAIN_FILE=!WASI_SDK_PATH!/share/cmake/wasi-sdk.cmake" "-DCMAKE_SYSROOT=!WASI_SDK_PATH!/share/wasi-sysroot"
88+
)
7689
)
7790
) else (
7891
set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_SYSTEM_VERSION=10.0"
7992
)
8093

81-
:loop
82-
if [%6] == [] goto end_loop
83-
set __ExtraCmakeParams=%__ExtraCmakeParams% %6
84-
shift
85-
goto loop
86-
:end_loop
87-
8894
set __ExtraCmakeParams="-DCMAKE_INSTALL_PREFIX=%__CMakeBinDir%" "-DCLR_CMAKE_HOST_ARCH=%__Arch%" %__ExtraCmakeParams%
8995

9096
set __CmdLineOptionsUpToDateFile=%__IntermediatesDir%\cmake_cmd_line.txt

src/mono/CMakeLists.txt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ if(NOT AOT_TARGET_TRIPLE STREQUAL "")
154154
elseif(AOT_TARGET_TRIPLE STREQUAL "wasm32-unknown-wasi")
155155
set(TARGET_SYSTEM_NAME "wasi")
156156
set(TARGET_ARCH "wasm")
157+
elseif(AOT_TARGET_TRIPLE STREQUAL "wasm32-unknown-wasi-threads")
158+
set(TARGET_SYSTEM_NAME "wasi")
159+
set(TARGET_SYSTEM_VARIANT "threads")
160+
set(TARGET_ARCH "wasm")
157161
elseif(AOT_TARGET_TRIPLE STREQUAL "x86_64-none-linux-android")
158162
set(TARGET_SYSTEM_NAME "android")
159163
set(TARGET_ARCH "x86_64")
@@ -181,11 +185,17 @@ endif()
181185
# HOST OS CHECKS
182186
######################################
183187

188+
if("${triple}" STREQUAL "wasm32-wasi-threads")
189+
set(CMAKE_SYSTEM_VARIANT "threads")
190+
endif()
191+
184192
message ("CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}")
185193
message ("CMAKE_SYSTEM_VARIANT=${CMAKE_SYSTEM_VARIANT}")
186194

187195
set(CLR_CMAKE_HOST_OS ${CMAKE_SYSTEM_NAME})
188-
string(TOLOWER ${CLR_CMAKE_HOST_OS} CLR_CMAKE_HOST_OS)
196+
set(CLR_CMAKE_HOST_VARIANT ${CMAKE_SYSTEM_VARIANT})
197+
string(TOLOWER "${CLR_CMAKE_HOST_OS}" CLR_CMAKE_HOST_OS)
198+
string(TOLOWER "${CLR_CMAKE_HOST_VARIANT}" CLR_CMAKE_HOST_VARIANT)
189199

190200
# TODO: check if we can enable this on more platforms
191201
# set(MONO_KEYWORD_THREAD "__thread")
@@ -196,7 +206,7 @@ if(CLR_CMAKE_HOST_OS STREQUAL "darwin")
196206
set(HOST_OSX 1)
197207
set(PTHREAD_POINTER_ID 1)
198208
set(USE_MACH_SEMA 1)
199-
if(CMAKE_SYSTEM_VARIANT STREQUAL "maccatalyst")
209+
if(CLR_CMAKE_HOST_VARIANT STREQUAL "maccatalyst")
200210
set(HOST_MACCAT 1)
201211
endif()
202212
elseif(CLR_CMAKE_HOST_OS STREQUAL "ios" OR CLR_CMAKE_HOST_OS STREQUAL "tvos")
@@ -312,14 +322,15 @@ endif()
312322

313323
if(NOT TARGET_SYSTEM_NAME)
314324
set(TARGET_SYSTEM_NAME "${CLR_CMAKE_HOST_OS}")
325+
set(TARGET_SYSTEM_VARIANT "${CLR_CMAKE_HOST_VARIANT}")
315326
endif()
316327

317328
if(TARGET_SYSTEM_NAME STREQUAL "darwin")
318329
set(TARGET_UNIX 1)
319330
set(TARGET_MACH 1)
320331
set(TARGET_OSX 1)
321332
set(TARGET_DARWIN 1)
322-
if(CMAKE_SYSTEM_VARIANT STREQUAL "maccatalyst")
333+
if(TARGET_SYSTEM_VARIANT STREQUAL "maccatalyst")
323334
set(TARGET_MACCAT 1)
324335
endif()
325336
elseif(TARGET_SYSTEM_NAME STREQUAL "ios" OR TARGET_SYSTEM_NAME STREQUAL "tvos")
@@ -353,7 +364,9 @@ elseif(TARGET_SYSTEM_NAME STREQUAL "emscripten")
353364
endif()
354365
elseif(TARGET_SYSTEM_NAME STREQUAL "wasi")
355366
set(TARGET_WASI 1)
356-
set(DISABLE_THREADS 1)
367+
if (NOT (TARGET_SYSTEM_VARIANT STREQUAL "threads"))
368+
set(DISABLE_THREADS 1)
369+
endif()
357370
if (CMAKE_BUILD_TYPE STREQUAL "Release")
358371
add_compile_options(-Os)
359372
endif()

src/mono/mono.proj

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
<PropertyGroup>
6060
<MonoThreadSuspend Condition="'$(TargetswatchOS)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
6161
<MonoThreadSuspend Condition="'$(TargetsBrowser)' == 'true' and '$(WasmEnableThreads)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
62+
<MonoThreadSuspend Condition="'$(TargetsWasi)' == 'true' and '$(WasmEnableThreads)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
6263
<!-- wasm isn't really preemptive, but we don't want safepoints -->
6364
<MonoThreadSuspend Condition="( '$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true' ) and '$(MonoThreadSuspend)' == ''">preemptive</MonoThreadSuspend>
6465
<!-- all other platforms -->
@@ -619,7 +620,8 @@
619620
<_MonoCMakeConfigureCommand>cmake @(_MonoCMakeArgs, ' ') $(MonoCMakeExtraArgs) &quot;$(MonoProjectRoot.TrimEnd('\/'))&quot;</_MonoCMakeConfigureCommand>
620621
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(_MonoSkipInitCompiler)' != 'true' and '$(HostOS)' != 'windows'">sh -c 'build_arch=&quot;$(_CompilerTargetArch)&quot; compiler=&quot;$(MonoCCompiler)&quot; . &quot;$(RepositoryEngineeringCommonDir)native/init-compiler.sh&quot; &amp;&amp; @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)'</_MonoCMakeConfigureCommand>
621622
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(_MonoSkipInitCompiler)' == 'true' and '$(HostOS)' != 'windows'">$(_MonoCCOption) $(_MonoCXXOption) @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)</_MonoCMakeConfigureCommand>
622-
<_MonoCMakeConfigureCommand Condition="'$(TargetsWasi)' == 'true'">$(_MonoCMakeConfigureCommand) -DWASI_SDK_PREFIX=$(WASI_SDK_PATH) -DCMAKE_SYSROOT=$(WASI_SDK_PATH)share/wasi-sysroot -DCMAKE_TOOLCHAIN_FILE=$(WASI_SDK_PATH)share/cmake/wasi-sdk.cmake -DCMAKE_CXX_FLAGS="--sysroot=$(WASI_SDK_PATH)share/wasi-sysroot"</_MonoCMakeConfigureCommand>
623+
<_MonoCMakeConfigureCommand Condition="'$(TargetsWasi)' == 'true' and '$(WasmEnableThreads)' != 'true'">$(_MonoCMakeConfigureCommand) -DWASI_SDK_PREFIX=$(WASI_SDK_PATH) -DCMAKE_SYSROOT=$(WASI_SDK_PATH)share/wasi-sysroot -DCMAKE_TOOLCHAIN_FILE=$(WASI_SDK_PATH)share/cmake/wasi-sdk.cmake -DCMAKE_CXX_FLAGS="--sysroot=$(WASI_SDK_PATH)share/wasi-sysroot"</_MonoCMakeConfigureCommand>
624+
<_MonoCMakeConfigureCommand Condition="'$(TargetsWasi)' == 'true' and '$(WasmEnableThreads)' == 'true'">$(_MonoCMakeConfigureCommand) -DWASI_SDK_PREFIX=$(WASI_SDK_PATH) -DCMAKE_SYSROOT=$(WASI_SDK_PATH)share/wasi-sysroot -DCMAKE_TOOLCHAIN_FILE=$(WASI_SDK_PATH)share/cmake/wasi-sdk-pthread.cmake -DCMAKE_CXX_FLAGS="--sysroot=$(WASI_SDK_PATH)share/wasi-sysroot"</_MonoCMakeConfigureCommand>
623625

624626
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(HostOS)' == 'windows'">call &quot;$(RepositoryEngineeringDir)native\init-vs-env.cmd&quot; $(_CompilerTargetArch) &amp;&amp; cd /D &quot;$(MonoObjDir)&quot; &amp;&amp; @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)</_MonoCMakeConfigureCommand>
625627
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' != 'windows'">bash -c 'source $(EMSDK_PATH)/emsdk_env.sh 2>&amp;1 &amp;&amp; emcmake $(_MonoCMakeConfigureCommand)'</_MonoCMakeConfigureCommand>
@@ -741,7 +743,8 @@
741743
<PropertyGroup Condition="'$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true'">
742744
<MonoUseCrossTool>true</MonoUseCrossTool>
743745
<MonoAotAbi Condition="'$(TargetsBrowser)' == 'true'">wasm32-unknown-none</MonoAotAbi>
744-
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true'">wasm32-unknown-wasi</MonoAotAbi>
746+
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true' and $(WasmEnableThreads) != 'true'">wasm32-unknown-wasi</MonoAotAbi>
747+
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true' and $(WasmEnableThreads) == 'true'">wasm32-unknown-wasi-threads</MonoAotAbi>
745748
<MonoAotOffsetsFile>$(MonoObjCrossDir)offsets-wasm32-unknown-none.h</MonoAotOffsetsFile>
746749
<MonoLibClang Condition="$([MSBuild]::IsOSPlatform('OSX'))">$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.dylib</MonoLibClang>
747750
<MonoLibClang Condition="$([MSBuild]::IsOSPlatform('Linux'))">$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.so</MonoLibClang>

src/mono/mono/component/diagnostics_server.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <mono/utils/mono-publib.h>
88
#include <mono/utils/mono-compiler.h>
99
#include <eventpipe/ds-server.h>
10-
#if defined (HOST_WASM) && !defined(HOST_WASI)
10+
#if defined(HOST_BROWSER)
1111
#include <eventpipe/ep-ipc-stream.h>
1212
#include <mono/component/event_pipe-wasm.h>
1313
#include <mono/utils/mono-coop-semaphore.h>
@@ -19,7 +19,7 @@
1919
static bool
2020
diagnostics_server_available (void);
2121

22-
#if !defined (HOST_WASM) || defined (DISABLE_THREADS)
22+
#if !defined(HOST_BROWSER) || defined (DISABLE_THREADS)
2323
static MonoComponentDiagnosticsServer fn_table = {
2424
{ MONO_COMPONENT_ITF_VERSION, &diagnostics_server_available },
2525
&ds_server_init,
@@ -349,7 +349,7 @@ wasm_ipc_stream_close (void *self)
349349
return r == 0;
350350
}
351351

352-
#endif /* !defined (HOST_WASM) || defined (DISABLE_THREADS) */
352+
#endif /* !defined (HOST_BROWSER) || defined (DISABLE_THREADS) */
353353

354354
static bool
355355
diagnostics_server_available (void)

src/mono/mono/metadata/gc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,7 @@ mono_gc_finalize_notify (void)
691691
if (mono_gc_is_null ())
692692
return;
693693

694-
#if defined(HOST_WASI)
694+
#if defined(HOST_WASI) && defined(DISABLE_THREADS)
695695
// TODO: Schedule the background job on WASI. Threads aren't yet supported in this build.
696696
#elif defined(HOST_WASM) && defined(DISABLE_THREADS)
697697
mono_main_thread_schedule_background_job (mono_runtime_do_background_work);

src/mono/mono/metadata/sgen-mono.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2893,7 +2893,7 @@ sgen_client_binary_protocol_collection_end (int minor_gc_count, int generation,
28932893
MONO_PROFILER_RAISE (gc_event, (MONO_GC_EVENT_END, generation, generation == GENERATION_OLD && sgen_concurrent_collection_in_progress));
28942894
}
28952895

2896-
#if defined(HOST_WASM) && defined(DISABLE_THREADS)
2896+
#if defined(HOST_BROWSER) && defined(DISABLE_THREADS)
28972897
void
28982898
sgen_client_schedule_background_job (void (*cb)(void))
28992899
{

src/mono/mono/metadata/threads.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1286,8 +1286,11 @@ start_wrapper (gpointer data)
12861286
}
12871287

12881288
mono_thread_info_exit (res);
1289-
1289+
#ifdef HOST_WASI
1290+
return (mono_thread_start_return_t)res;
1291+
#else
12901292
g_assert_not_reached ();
1293+
#endif
12911294
}
12921295

12931296
static void
@@ -1754,6 +1757,8 @@ mono_thread_exit (void)
17541757
exit (mono_environment_exitcode_get ());
17551758

17561759
mono_thread_info_exit (0);
1760+
1761+
g_assert_not_reached ();
17571762
}
17581763

17591764
MonoThread *
@@ -2889,6 +2894,8 @@ mono_threads_set_shutting_down (void)
28892894

28902895
/* Wake up other threads potentially waiting for us */
28912896
mono_thread_info_exit (0);
2897+
2898+
g_assert_not_reached ();
28922899
} else {
28932900
shutting_down = TRUE;
28942901

src/mono/mono/mini/mini-wasm.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,10 @@ typedef struct {
9191
#define MONO_ARCH_HAS_REGISTER_ICALL 1
9292
#define MONO_ARCH_HAVE_SDB_TRAMPOLINES 1
9393
#define MONO_ARCH_LLVM_TARGET_LAYOUT "e-m:e-p:32:32-i64:64-n32:64-S128"
94-
#ifdef TARGET_WASI
94+
#if defined(TARGET_WASI) && defined(DISABLE_THREADS)
9595
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-wasi"
96+
#elif defined(TARGET_WASI)
97+
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-wasi-threads"
9698
#else
9799
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-emscripten"
98100
#endif

src/mono/mono/utils/mono-threads-posix.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232

3333
#include <errno.h>
3434

35-
#if defined(_POSIX_VERSION) && !defined (HOST_WASM)
35+
#if defined(_POSIX_VERSION) && !defined (USE_WASM_BACKEND)
3636

3737
#include <pthread.h>
3838

@@ -127,11 +127,13 @@ mono_threads_platform_yield (void)
127127
return sched_yield () == 0;
128128
}
129129

130+
#ifndef USE_PTHREAD_WASM_BACKEND
130131
void
131132
mono_threads_platform_exit (gsize exit_code)
132133
{
133134
pthread_exit ((gpointer) exit_code);
134135
}
136+
#endif
135137

136138
gboolean
137139
mono_thread_platform_external_eventloop_keepalive_check (void)
@@ -142,7 +144,7 @@ mono_thread_platform_external_eventloop_keepalive_check (void)
142144
return FALSE;
143145
}
144146

145-
#if HOST_FUCHSIA
147+
#if defined(HOST_FUCHSIA) || !defined(HAVE_GETRLIMIT)
146148
int
147149
mono_thread_info_get_system_max_stack_size (void)
148150
{

src/mono/mono/utils/mono-threads-wasi.S

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,16 @@ get_wasm_heap_base:
1313
.functype get_wasm_heap_base () -> (i32)
1414
global.get __heap_base@GOT
1515
end_function
16+
17+
.globl get_wasm_stack_low
18+
.globl get_wasm_stack_high
19+
20+
get_wasm_stack_low:
21+
.functype get_wasm_stack_low () -> (i32)
22+
global.get __stack_low@GOT
23+
end_function
24+
25+
get_wasm_stack_high:
26+
.functype get_wasm_stack_high () -> (i32)
27+
global.get __stack_high@GOT
28+
end_function

0 commit comments

Comments
 (0)