Skip to content

Commit 1693ab7

Browse files
build: Add -threads variant of Wasm stdlib build
This patch adds a `-threads` variant of the Wasm stdlib build, which has completely different ABI and target triple. Now we build non-threaded and threaded variants when `--build-wasm-stdlib` is enabled.
1 parent 418dd95 commit 1693ab7

File tree

4 files changed

+73
-16
lines changed

4 files changed

+73
-16
lines changed

utils/swift_build_support/swift_build_support/build_script_invocation.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,10 +676,14 @@ def compute_product_pipelines(self):
676676
is_enabled=self.args.build_wasmstdlib)
677677
builder.add_product(products.WasmLLVMRuntimeLibs,
678678
is_enabled=self.args.build_wasmstdlib)
679+
builder.add_product(products.WasmThreadsLLVMRuntimeLibs,
680+
is_enabled=self.args.build_wasmstdlib)
679681
builder.add_product(products.WasmKit,
680682
is_enabled=self.args.build_wasmkit)
681683
builder.add_product(products.WasmStdlib,
682684
is_enabled=self.args.build_wasmstdlib)
685+
builder.add_product(products.WasmThreadsStdlib,
686+
is_enabled=self.args.build_wasmstdlib)
683687

684688
# Keep SwiftDriver at last.
685689
# swift-driver's integration with the build scripts is not fully

utils/swift_build_support/swift_build_support/products/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737
from .swiftpm import SwiftPM
3838
from .swiftsyntax import SwiftSyntax
3939
from .tsan_libdispatch import TSanLibDispatch
40-
from .wasisysroot import WASILibc, WasmLLVMRuntimeLibs
40+
from .wasisysroot import WASILibc, WasmLLVMRuntimeLibs, WasmThreadsLLVMRuntimeLibs
4141
from .wasmkit import WasmKit
42-
from .wasmstdlib import WasmStdlib
42+
from .wasmstdlib import WasmStdlib, WasmThreadsStdlib
4343
from .xctest import XCTest
4444
from .zlib import Zlib
4545

@@ -76,5 +76,7 @@
7676
'WASILibc',
7777
'WasmLLVMRuntimeLibs',
7878
'WasmKit',
79-
'WasmStdlib'
79+
'WasmStdlib',
80+
'WasmThreadsLLVMRuntimeLibs',
81+
'WasmThreadsStdlib',
8082
]

utils/swift_build_support/swift_build_support/products/wasisysroot.py

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ def should_install(self, host_target):
4444
return False
4545

4646
def build(self, host_target):
47+
self._build(host_target)
48+
self._build(host_target, thread_model='posix', target_triple='wasm32-wasip1-threads')
49+
50+
def _build(self, host_target, thread_model='single', target_triple='wasm32-wasi'):
4751
build_root = os.path.dirname(self.build_dir)
4852
llvm_build_bin_dir = os.path.join(
4953
'..', build_root, '%s-%s' % ('llvm', host_target), 'bin')
@@ -66,12 +70,14 @@ def build(self, host_target):
6670
# https://github.com/llvm/llvm-project/commit/7dd387d2971d7759cadfffeb2082439f6c7ddd49
6771
'--old-file=check-symbols',
6872
'-C', self.source_dir,
69-
'OBJDIR=' + os.path.join(self.build_dir, 'obj'),
73+
'OBJDIR=' + os.path.join(self.build_dir, 'obj-' + thread_model),
7074
'SYSROOT=' + sysroot_build_dir,
7175
'INSTALL_DIR=' + WASILibc.sysroot_install_path(build_root),
7276
'CC=' + os.path.join(clang_tools_path, 'clang'),
7377
'AR=' + os.path.join(llvm_tools_path, 'llvm-ar'),
7478
'NM=' + os.path.join(llvm_tools_path, 'llvm-nm'),
79+
'THREAD_MODEL=' + thread_model,
80+
'TARGET_TRIPLE=' + target_triple,
7581
])
7682

7783
@classmethod
@@ -121,18 +127,30 @@ def should_install(self, host_target):
121127
return False
122128

123129
def build(self, host_target):
130+
self._build(host_target)
131+
132+
def _build(self, host_target, enable_wasi_threads=False):
124133
build_root = os.path.dirname(self.build_dir)
125134
llvm_build_bin_dir = os.path.join(
126135
'..', build_root, '%s-%s' % ('llvm', host_target), 'bin')
127136
llvm_tools_path = self.args.native_llvm_tools_path or llvm_build_bin_dir
128137
clang_tools_path = self.args.native_clang_tools_path or llvm_build_bin_dir
129138

139+
cmake_has_threads = 'TRUE' if enable_wasi_threads else 'FALSE'
140+
130141
self.cmake_options.define('CMAKE_SYSROOT:PATH',
131142
WASILibc.sysroot_build_path(build_root, host_target))
132-
self.cmake_options.define('LLVM_ENABLE_RUNTIMES:STRING',
133-
'libcxx;libcxxabi;compiler-rt')
134-
self.cmake_options.define('LIBCXX_LIBDIR_SUFFIX:STRING', '/wasm32-wasi')
135-
self.cmake_options.define('LIBCXXABI_LIBDIR_SUFFIX:STRING', '/wasm32-wasi')
143+
enable_runtimes = ['libcxx', 'libcxxabi']
144+
if not enable_wasi_threads:
145+
# compiler-rt can be shared between wasi and wasip1-threads
146+
enable_runtimes.append('compiler-rt')
147+
self.cmake_options.define('LLVM_ENABLE_RUNTIMES:STRING', ';'.join(enable_runtimes))
148+
149+
libdir_suffix = '/wasm32-wasi'
150+
if enable_wasi_threads:
151+
libdir_suffix = '/wasm32-wasi-threads'
152+
self.cmake_options.define('LIBCXX_LIBDIR_SUFFIX:STRING', libdir_suffix)
153+
self.cmake_options.define('LIBCXXABI_LIBDIR_SUFFIX:STRING', libdir_suffix)
136154
self.cmake_options.define('CMAKE_STAGING_PREFIX:PATH', '/')
137155

138156
self.cmake_options.define('COMPILER_RT_DEFAULT_TARGET_ARCH:STRING', 'wasm32')
@@ -157,19 +175,27 @@ def build(self, host_target):
157175
os.path.join(clang_tools_path, 'clang'))
158176
self.cmake_options.define('CMAKE_CXX_COMPILER:STRING',
159177
os.path.join(clang_tools_path, 'clang++'))
178+
179+
c_flags = []
160180
# Explicitly disable exceptions even though it's usually implicitly disabled by
161181
# LIBCXX_ENABLE_EXCEPTIONS because the CMake feature check fails to detect
162182
# -fno-exceptions support in clang due to missing compiler-rt while configuring
163183
# as mono project.
164-
self.cmake_options.define('CMAKE_CXX_FLAGS:STRING', '-fno-exceptions')
184+
cxx_flags = ['-fno-exceptions']
185+
if enable_wasi_threads:
186+
c_flags.append('-pthread')
187+
cxx_flags.append('-pthread')
188+
self.cmake_options.define('CMAKE_C_FLAGS:STRING', ' '.join(c_flags))
189+
self.cmake_options.define('CMAKE_CXX_FLAGS:STRING', ' '.join(cxx_flags))
165190

166-
self.cmake_options.define('CMAKE_C_COMPILER_TARGET:STRING', 'wasm32-wasi')
167-
self.cmake_options.define('CMAKE_CXX_COMPILER_TARGET:STRING', 'wasm32-wasi')
191+
target_triple = 'wasm32-wasi-threads' if enable_wasi_threads else 'wasm32-wasi'
192+
self.cmake_options.define('CMAKE_C_COMPILER_TARGET:STRING', target_triple)
193+
self.cmake_options.define('CMAKE_CXX_COMPILER_TARGET:STRING', target_triple)
168194

169195
self.cmake_options.define('CXX_SUPPORTS_CXX11:BOOL', 'TRUE')
170196

171-
self.cmake_options.define('LIBCXX_ENABLE_THREADS:BOOL', 'FALSE')
172-
self.cmake_options.define('LIBCXX_HAS_PTHREAD_API:BOOL', 'FALSE')
197+
self.cmake_options.define('LIBCXX_ENABLE_THREADS:BOOL', cmake_has_threads)
198+
self.cmake_options.define('LIBCXX_HAS_PTHREAD_API:BOOL', cmake_has_threads)
173199
self.cmake_options.define('LIBCXX_HAS_EXTERNAL_THREAD_API:BOOL', 'FALSE')
174200
self.cmake_options.define('LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL', 'FALSE')
175201
self.cmake_options.define('LIBCXX_HAS_WIN32_THREAD_API:BOOL', 'FALSE')
@@ -184,8 +210,8 @@ def build(self, host_target):
184210
self.cmake_options.define('LIBCXXABI_ENABLE_EXCEPTIONS:BOOL', 'FALSE')
185211
self.cmake_options.define('LIBCXXABI_ENABLE_SHARED:BOOL', 'FALSE')
186212
self.cmake_options.define('LIBCXXABI_SILENT_TERMINATE:BOOL', 'TRUE')
187-
self.cmake_options.define('LIBCXXABI_ENABLE_THREADS:BOOL', 'FALSE')
188-
self.cmake_options.define('LIBCXXABI_HAS_PTHREAD_API:BOOL', 'FALSE')
213+
self.cmake_options.define('LIBCXXABI_ENABLE_THREADS:BOOL', cmake_has_threads)
214+
self.cmake_options.define('LIBCXXABI_HAS_PTHREAD_API:BOOL', cmake_has_threads)
189215
self.cmake_options.define('LIBCXXABI_HAS_EXTERNAL_THREAD_API:BOOL', 'FALSE')
190216
self.cmake_options.define('LIBCXXABI_BUILD_EXTERNAL_THREAD_LIBRARY:BOOL',
191217
'FALSE')
@@ -201,3 +227,15 @@ def build(self, host_target):
201227
@classmethod
202228
def get_dependencies(cls):
203229
return [WASILibc, llvm.LLVM]
230+
231+
class WasmThreadsLLVMRuntimeLibs(WasmLLVMRuntimeLibs):
232+
def build(self, host_target):
233+
self._build(host_target, enable_wasi_threads=True)
234+
235+
build_root = os.path.dirname(self.build_dir)
236+
wasi_sysroot = WASILibc.sysroot_install_path(build_root)
237+
# Copy compiler-rt os dirs to the WASI variant
238+
os_dir = os.path.join(wasi_sysroot, 'lib', 'wasip1')
239+
if os.path.exists(os_dir):
240+
shell.rmtree(os_dir)
241+
shell.copytree(os.path.join(wasi_sysroot, 'lib', 'wasi'), os_dir)

utils/swift_build_support/swift_build_support/products/wasmstdlib.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ def build(self, host_target):
8585
self.cmake_options.define(
8686
'SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY:BOOL', 'TRUE')
8787
self.cmake_options.define('SWIFT_ENABLE_DISPATCH:BOOL', 'FALSE')
88-
self.cmake_options.define('SWIFT_THREADING_PACKAGE:STRING', 'none')
8988
self.cmake_options.define(
9089
'SWIFT_STDLIB_SUPPORTS_BACKTRACE_REPORTING:BOOL', 'FALSE')
9190
self.cmake_options.define('SWIFT_STDLIB_HAS_DLADDR:BOOL', 'FALSE')
@@ -98,6 +97,8 @@ def build(self, host_target):
9897
os.path.join(self.source_dir, '..',
9998
'swift-experimental-string-processing'))
10099

100+
self.add_extra_cmake_options()
101+
101102
# Test configuration
102103
self.cmake_options.define('SWIFT_INCLUDE_TESTS:BOOL', 'TRUE')
103104
self.cmake_options.define('SWIFT_ENABLE_SOURCEKIT_TESTS:BOOL', 'FALSE')
@@ -119,6 +120,9 @@ def build(self, host_target):
119120
self.build_with_cmake([], self._build_variant, [],
120121
prefer_native_toolchain=True)
121122

123+
def add_extra_cmake_options(self):
124+
self.cmake_options.define('SWIFT_THREADING_PACKAGE:STRING', 'none')
125+
122126
def test(self, host_target):
123127
build_root = os.path.dirname(self.build_dir)
124128
bin_paths = [
@@ -170,3 +174,12 @@ def get_dependencies(cls):
170174
wasisysroot.WasmLLVMRuntimeLibs,
171175
wasmkit.WasmKit,
172176
swift.Swift]
177+
178+
class WasmThreadsStdlib(WasmStdlib):
179+
def add_extra_cmake_options(self):
180+
self.cmake_options.define('SWIFT_THREADING_PACKAGE:STRING', 'pthreads')
181+
self.cmake_options.define('SWIFT_STDLIB_EXTRA_C_COMPILE_FLAGS:STRING',
182+
'-mthread-model;posix;-pthread;-ftls-model=local-exec')
183+
self.cmake_options.define('SWIFT_STDLIB_EXTRA_SWIFT_COMPILE_FLAGS:STRING',
184+
'-Xcc;-matomics;-Xcc;-mbulk-memory;-Xcc;-mthread-model;-Xcc;posix;-Xcc;-pthread;-Xcc;-ftls-model=local-exec')
185+
self.cmake_options.define('SWIFT_ENABLE_WASI_THREADS:BOOL', 'TRUE')

0 commit comments

Comments
 (0)