Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for WASI threads #98120

Closed
wants to merge 3 commits into from
Closed
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
22 changes: 14 additions & 8 deletions eng/native/gen-buildsys.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ set __Arch=%4
set __Os=%5
set __CmakeGenerator=Visual Studio
set __UseEmcmake=0
set __Pthreads=0
if /i "%__Ninja%" == "1" (
set __CmakeGenerator=Ninja
) else (
Expand All @@ -37,6 +38,14 @@ if /i "%__Ninja%" == "1" (
)
)

:loop
if [%6] == [] goto end_loop
if ""%6"" == """-DCMAKE_USE_PTHREADS=1""" set __Pthreads=1
set __ExtraCmakeParams=%__ExtraCmakeParams% %6
shift
goto loop
:end_loop

if /i "%__Arch%" == "wasm" (

if "%__Os%" == "" (
Expand Down Expand Up @@ -72,19 +81,16 @@ if /i "%__Arch%" == "wasm" (
set "WASI_SDK_PATH=!WASI_SDK_PATH:\=/!"
if not "!WASI_SDK_PATH:~-1!" == "/" set "WASI_SDK_PATH=!WASI_SDK_PATH!/"
set __CmakeGenerator=Ninja
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"
if "%__Pthreads%" == "1" (
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"
) else (
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"
)
)
) else (
set __ExtraCmakeParams=%__ExtraCmakeParams% "-DCMAKE_SYSTEM_VERSION=10.0"
)

:loop
if [%6] == [] goto end_loop
set __ExtraCmakeParams=%__ExtraCmakeParams% %6
shift
goto loop
:end_loop

set __ExtraCmakeParams="-DCMAKE_INSTALL_PREFIX=%__CMakeBinDir%" "-DCLR_CMAKE_HOST_ARCH=%__Arch%" %__ExtraCmakeParams%

set __CmdLineOptionsUpToDateFile=%__IntermediatesDir%\cmake_cmd_line.txt
Expand Down
21 changes: 17 additions & 4 deletions src/mono/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ if(NOT AOT_TARGET_TRIPLE STREQUAL "")
elseif(AOT_TARGET_TRIPLE STREQUAL "wasm32-unknown-wasi")
set(TARGET_SYSTEM_NAME "wasi")
set(TARGET_ARCH "wasm")
elseif(AOT_TARGET_TRIPLE STREQUAL "wasm32-unknown-wasi-threads")
set(TARGET_SYSTEM_NAME "wasi")
set(TARGET_SYSTEM_VARIANT "threads")
set(TARGET_ARCH "wasm")
elseif(AOT_TARGET_TRIPLE STREQUAL "x86_64-none-linux-android")
set(TARGET_SYSTEM_NAME "android")
set(TARGET_ARCH "x86_64")
Expand Down Expand Up @@ -180,11 +184,17 @@ endif()
# HOST OS CHECKS
######################################

if("${triple}" STREQUAL "wasm32-wasi-threads")
set(CMAKE_SYSTEM_VARIANT "threads")
endif()

message ("CMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}")
message ("CMAKE_SYSTEM_VARIANT=${CMAKE_SYSTEM_VARIANT}")

set(CLR_CMAKE_HOST_OS ${CMAKE_SYSTEM_NAME})
string(TOLOWER ${CLR_CMAKE_HOST_OS} CLR_CMAKE_HOST_OS)
set(CLR_CMAKE_HOST_VARIANT ${CMAKE_SYSTEM_VARIANT})
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i'm not super familiar with cmake, but it seems weird that the host variant is either threads or not threads depending on the target you're building for. don't all cmake build hosts have threads?

Copy link
Author

@Milek7 Milek7 Feb 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is referring not to build host but mono runtime host. (as opposed to target system for which runtime will do codegen)
Still, I'm not sure how that interacts with DISABLE_THREADS (shouldn't there be TARGET/HOST_DISABLE_THREADS?), but in any case it was used this way for wasm before.

string(TOLOWER "${CLR_CMAKE_HOST_OS}" CLR_CMAKE_HOST_OS)
string(TOLOWER "${CLR_CMAKE_HOST_VARIANT}" CLR_CMAKE_HOST_VARIANT)

# TODO: check if we can enable this on more platforms
# set(MONO_KEYWORD_THREAD "__thread")
Expand All @@ -195,7 +205,7 @@ if(CLR_CMAKE_HOST_OS STREQUAL "darwin")
set(HOST_OSX 1)
set(PTHREAD_POINTER_ID 1)
set(USE_MACH_SEMA 1)
if(CMAKE_SYSTEM_VARIANT STREQUAL "maccatalyst")
if(CLR_CMAKE_HOST_VARIANT STREQUAL "maccatalyst")
set(HOST_MACCAT 1)
endif()
elseif(CLR_CMAKE_HOST_OS STREQUAL "ios" OR CLR_CMAKE_HOST_OS STREQUAL "tvos")
Expand Down Expand Up @@ -310,14 +320,15 @@ endif()

if(NOT TARGET_SYSTEM_NAME)
set(TARGET_SYSTEM_NAME "${CLR_CMAKE_HOST_OS}")
set(TARGET_SYSTEM_VARIANT "${CLR_CMAKE_HOST_VARIANT}")
endif()

if(TARGET_SYSTEM_NAME STREQUAL "darwin")
set(TARGET_UNIX 1)
set(TARGET_MACH 1)
set(TARGET_OSX 1)
set(TARGET_DARWIN 1)
if(CMAKE_SYSTEM_VARIANT STREQUAL "maccatalyst")
if(TARGET_SYSTEM_VARIANT STREQUAL "maccatalyst")
set(TARGET_MACCAT 1)
endif()
elseif(TARGET_SYSTEM_NAME STREQUAL "ios" OR TARGET_SYSTEM_NAME STREQUAL "tvos")
Expand Down Expand Up @@ -351,7 +362,9 @@ elseif(TARGET_SYSTEM_NAME STREQUAL "emscripten")
endif()
elseif(TARGET_SYSTEM_NAME STREQUAL "wasi")
set(TARGET_WASI 1)
set(DISABLE_THREADS 1)
if (NOT (TARGET_SYSTEM_VARIANT STREQUAL "threads"))
set(DISABLE_THREADS 1)
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Release")
add_compile_options(-Os)
endif()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@
<FeatureWasmPerfTracing Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and ('$(WasmEnableThreads)' == 'true')">true</FeatureWasmPerfTracing>
<FeaturePortableTimer Condition="('$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true') or '$(FeatureWasmManagedThreads)' == 'true'">true</FeaturePortableTimer>
<FeaturePortableThreadPool Condition="('$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true') or '$(FeatureWasmManagedThreads)' == 'true'">true</FeaturePortableThreadPool>
<FeaturePerfTracing Condition="('$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true') or '$(FeatureWasmPerftracing)' == 'true'">true</FeaturePerfTracing>
<FeaturePerfTracing Condition="('$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true') or ('$(TargetsBrowser)' == 'true' and '$(FeatureWasmPerftracing)' == 'true')">true</FeaturePerfTracing>
<FeatureObjCMarshal Condition="'$(TargetsOSX)' == 'true' or '$(TargetsMacCatalyst)' == 'true' or '$(TargetsiOS)' == 'true' or '$(TargetstvOS)' == 'true'">true</FeatureObjCMarshal>
</PropertyGroup>

Expand Down Expand Up @@ -274,7 +274,7 @@
<ItemGroup Condition="('$(TargetsUnix)' == 'true' or '$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(FeaturePortableThreadPool)' == 'true'">
<Compile Include="$(BclSourcesRoot)\System\Threading\LowLevelLifoSemaphore.Unix.Mono.cs" />
</ItemGroup>
<ItemGroup Condition="('$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true') and '$(FeatureWasmManagedThreads)' == 'true'">
<ItemGroup Condition="'$(TargetsBrowser)' == 'true' and '$(FeatureWasmManagedThreads)' == 'true'">
<Compile Include="$(BclSourcesRoot)\System\Threading\ThreadPoolBoundHandle.Browser.Threads.Mono.cs" />
<Compile Include="$(BclSourcesRoot)\System\Threading\LowLevelLifoAsyncWaitSemaphore.Browser.Threads.Mono.cs" />
<Compile Include="$(BclSourcesRoot)\System\Threading\PortableThreadPool.Browser.Threads.Mono.cs" />
Expand All @@ -288,7 +288,7 @@
<Compile Include="$(BclSourcesRoot)\System\Threading\ThreadPool.Browser.Mono.cs" />
<Compile Include="$(BclSourcesRoot)\System\Threading\TimerQueue.Browser.Mono.cs" />
</ItemGroup>
<ItemGroup Condition="'$(TargetsWasi)' == 'true'">
<ItemGroup Condition="'$(TargetsWasi)' == 'true' and '$(FeatureWasmManagedThreads)' != 'true'">
<Compile Include="$(BclSourcesRoot)\System\Threading\ThreadPoolBoundHandle.Browser.Mono.cs" />
<Compile Include="$(BclSourcesRoot)\System\Threading\PreAllocatedOverlapped.Browser.Mono.cs" />
<Compile Include="$(BclSourcesRoot)\System\Threading\ThreadPool.Wasi.Mono.cs" />
Expand Down
7 changes: 5 additions & 2 deletions src/mono/mono.proj
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
<PropertyGroup>
<MonoThreadSuspend Condition="'$(TargetswatchOS)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
<MonoThreadSuspend Condition="'$(TargetsBrowser)' == 'true' and '$(WasmEnableThreads)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
<MonoThreadSuspend Condition="'$(TargetsWasi)' == 'true' and '$(WasmEnableThreads)' == 'true' and '$(MonoThreadSuspend)' == ''">coop</MonoThreadSuspend>
<!-- wasm isn't really preemptive, but we don't want safepoints -->
<MonoThreadSuspend Condition="( '$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true' ) and '$(MonoThreadSuspend)' == ''">preemptive</MonoThreadSuspend>
<!-- all other platforms -->
Expand Down Expand Up @@ -602,7 +603,8 @@
<_MonoCMakeConfigureCommand>cmake @(_MonoCMakeArgs, ' ') $(MonoCMakeExtraArgs) &quot;$(MonoProjectRoot.TrimEnd('\/'))&quot;</_MonoCMakeConfigureCommand>
<_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>
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' != 'true' and '$(TargetsWasi)' != 'true' and '$(_MonoSkipInitCompiler)' == 'true' and '$(HostOS)' != 'windows'">$(_MonoCCOption) $(_MonoCXXOption) @(_MonoBuildEnv, ' ') $(_MonoCMakeConfigureCommand)</_MonoCMakeConfigureCommand>
<_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>
<_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>
<_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>

<_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>
<_MonoCMakeConfigureCommand Condition="'$(TargetsBrowser)' == 'true' and '$(HostOS)' != 'windows'">bash -c 'source $(EMSDK_PATH)/emsdk_env.sh 2>&amp;1 &amp;&amp; emcmake $(_MonoCMakeConfigureCommand)'</_MonoCMakeConfigureCommand>
Expand Down Expand Up @@ -724,7 +726,8 @@
<PropertyGroup Condition="'$(TargetsBrowser)' == 'true' or '$(TargetsWasi)' == 'true'">
<MonoUseCrossTool>true</MonoUseCrossTool>
<MonoAotAbi Condition="'$(TargetsBrowser)' == 'true'">wasm32-unknown-none</MonoAotAbi>
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true'">wasm32-unknown-wasi</MonoAotAbi>
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true' and $(WasmEnableThreads) != 'true'">wasm32-unknown-wasi</MonoAotAbi>
<MonoAotAbi Condition="'$(TargetsWasi)' == 'true' and $(WasmEnableThreads) == 'true'">wasm32-unknown-wasi-threads</MonoAotAbi>
<MonoAotOffsetsFile>$(MonoObjCrossDir)offsets-wasm32-unknown-none.h</MonoAotOffsetsFile>
<MonoLibClang Condition="$([MSBuild]::IsOSPlatform('OSX'))">$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.dylib</MonoLibClang>
<MonoLibClang Condition="$([MSBuild]::IsOSPlatform('Linux'))">$(MonoLLVMDir)/$(BuildArchitecture)/lib/libclang.so</MonoLibClang>
Expand Down
6 changes: 3 additions & 3 deletions src/mono/mono/component/diagnostics_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <mono/utils/mono-publib.h>
#include <mono/utils/mono-compiler.h>
#include <eventpipe/ds-server.h>
#if defined (HOST_WASM) && !defined(HOST_WASI)
#if defined(HOST_BROWSER)
#include <eventpipe/ep-ipc-stream.h>
#include <mono/component/event_pipe-wasm.h>
#include <mono/utils/mono-coop-semaphore.h>
Expand All @@ -19,7 +19,7 @@
static bool
diagnostics_server_available (void);

#if !defined (HOST_WASM) || defined (DISABLE_THREADS)
#if !defined(HOST_BROWSER) || defined (DISABLE_THREADS)
static MonoComponentDiagnosticsServer fn_table = {
{ MONO_COMPONENT_ITF_VERSION, &diagnostics_server_available },
&ds_server_init,
Expand Down Expand Up @@ -350,7 +350,7 @@ wasm_ipc_stream_close (void *self)
return r == 0;
}

#endif /* !defined (HOST_WASM) || defined (DISABLE_THREADS) */
#endif /* !defined (HOST_BROWSER) || defined (DISABLE_THREADS) */

static bool
diagnostics_server_available (void)
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/metadata/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,7 @@ mono_gc_finalize_notify (void)
if (mono_gc_is_null ())
return;

#if defined(HOST_WASI)
#if defined(HOST_WASI) && defined(DISABLE_THREADS)
// TODO: Schedule the background job on WASI. Threads aren't yet supported in this build.
#elif defined(HOST_WASM) && defined(DISABLE_THREADS)
mono_main_thread_schedule_background_job (mono_runtime_do_background_work);
Expand Down
2 changes: 1 addition & 1 deletion src/mono/mono/metadata/sgen-mono.c
Original file line number Diff line number Diff line change
Expand Up @@ -2893,7 +2893,7 @@ sgen_client_binary_protocol_collection_end (int minor_gc_count, int generation,
MONO_PROFILER_RAISE (gc_event, (MONO_GC_EVENT_END, generation, generation == GENERATION_OLD && sgen_concurrent_collection_in_progress));
}

#if defined(HOST_WASM) && defined(DISABLE_THREADS)
#if defined(HOST_BROWSER) && defined(DISABLE_THREADS)
void
sgen_client_schedule_background_job (void (*cb)(void))
{
Expand Down
9 changes: 8 additions & 1 deletion src/mono/mono/metadata/threads.c
Original file line number Diff line number Diff line change
Expand Up @@ -1286,8 +1286,11 @@ start_wrapper (gpointer data)
}

mono_thread_info_exit (res);

#ifdef HOST_WASI
return (mono_thread_start_return_t)res;
#else
g_assert_not_reached ();
#endif
}

static void
Expand Down Expand Up @@ -1754,6 +1757,8 @@ mono_thread_exit (void)
exit (mono_environment_exitcode_get ());

mono_thread_info_exit (0);

g_assert_not_reached ();
}

MonoThread *
Expand Down Expand Up @@ -2889,6 +2894,8 @@ mono_threads_set_shutting_down (void)

/* Wake up other threads potentially waiting for us */
mono_thread_info_exit (0);

g_assert_not_reached ();
} else {
shutting_down = TRUE;

Expand Down
4 changes: 3 additions & 1 deletion src/mono/mono/mini/mini-wasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,10 @@ typedef struct {
#define MONO_ARCH_HAS_REGISTER_ICALL 1
#define MONO_ARCH_HAVE_SDB_TRAMPOLINES 1
#define MONO_ARCH_LLVM_TARGET_LAYOUT "e-m:e-p:32:32-i64:64-n32:64-S128"
#ifdef TARGET_WASI
#if defined(TARGET_WASI) && defined(DISABLE_THREADS)
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-wasi"
#elif defined(TARGET_WASI)
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-wasi-threads"
#else
#define MONO_ARCH_LLVM_TARGET_TRIPLE "wasm32-unknown-emscripten"
#endif
Expand Down
6 changes: 4 additions & 2 deletions src/mono/mono/utils/mono-threads-posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

#include <errno.h>

#if defined(_POSIX_VERSION) && !defined (HOST_WASM)
#if defined(_POSIX_VERSION) && !defined (USE_WASM_BACKEND)

#include <pthread.h>

Expand Down Expand Up @@ -127,11 +127,13 @@ mono_threads_platform_yield (void)
return sched_yield () == 0;
}

#ifndef USE_PTHREAD_WASM_BACKEND
void
mono_threads_platform_exit (gsize exit_code)
{
pthread_exit ((gpointer) exit_code);
}
#endif

gboolean
mono_thread_platform_external_eventloop_keepalive_check (void)
Expand All @@ -142,7 +144,7 @@ mono_thread_platform_external_eventloop_keepalive_check (void)
return FALSE;
}

#if HOST_FUCHSIA
#if defined(HOST_FUCHSIA) || !defined(HAVE_GETRLIMIT)
int
mono_thread_info_get_system_max_stack_size (void)
{
Expand Down
13 changes: 13 additions & 0 deletions src/mono/mono/utils/mono-threads-wasi.S
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,16 @@ get_wasm_heap_base:
.functype get_wasm_heap_base () -> (i32)
global.get __heap_base@GOT
end_function

.globl get_wasm_stack_low
.globl get_wasm_stack_high

get_wasm_stack_low:
.functype get_wasm_stack_low () -> (i32)
global.get __stack_low@GOT
end_function

get_wasm_stack_high:
.functype get_wasm_stack_high () -> (i32)
global.get __stack_high@GOT
end_function
Loading
Loading