Skip to content

Commit eb1a296

Browse files
Enable _Concurrency for Embedded Swift with WASI (#79292)
WASI with Embedded Swift provides WASI-libc and libc++ headers necessary to build the `_Concurrency` module for Wasm. We now add `wasm32-unknown-wasip1-wasm` triple to `EMBEDDED_STDLIB_TARGET_TRIPLES` when `SWIFT_WASI_SYSROOT_PATH` is set, which builds the necessary stdlib slice. --------- Co-authored-by: Yuta Saito <[email protected]>
1 parent 0072668 commit eb1a296

File tree

6 files changed

+101
-69
lines changed

6 files changed

+101
-69
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,9 @@ set(SWIFT_NATIVE_CLANG_TOOLS_PATH "" CACHE STRING
487487
set(SWIFT_NATIVE_SWIFT_TOOLS_PATH "" CACHE STRING
488488
"Path to the directory that contains Swift tools that are executable on the build machine")
489489

490+
set(SWIFT_WASI_SYSROOT_PATH "" CACHE PATH
491+
"Path to the directory that contains WASI Sysroot")
492+
490493
option(SWIFT_STDLIB_ENABLE_SIB_TARGETS
491494
"Should we generate sib targets for the stdlib or not?"
492495
FALSE)

stdlib/public/CMakeLists.txt

Lines changed: 67 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,10 @@ option(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB_CROSS_COMPILING
155155
set(SWIFT_EMBEDDED_STDLIB_EXTRA_TARGET_TRIPLES "" CACHE STRING
156156
"List of extra target triples to build the embedded Swift standard library for")
157157

158-
if((NOT SWIFT_HOST_VARIANT STREQUAL "macosx") AND (NOT SWIFT_HOST_VARIANT STREQUAL "linux") AND (NOT SWIFT_HOST_VARIANT STREQUAL "windows"))
158+
if((NOT SWIFT_HOST_VARIANT STREQUAL "macosx") AND
159+
(NOT SWIFT_HOST_VARIANT STREQUAL "linux") AND
160+
(NOT SWIFT_HOST_VARIANT STREQUAL "wasi") AND
161+
(NOT SWIFT_HOST_VARIANT STREQUAL "windows"))
159162
set(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB FALSE)
160163
elseif(BOOTSTRAPPING_MODE STREQUAL "OFF")
161164
set(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB FALSE)
@@ -168,68 +171,76 @@ endif()
168171
set(EMBEDDED_STDLIB_TARGET_TRIPLES)
169172

170173
if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB_CROSS_COMPILING)
171-
if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD)
174+
if(SWIFT_WASI_SYSROOT_PATH)
175+
# Don't attempt to build any other Embedded Swift stdlib triples
176+
# when building for WASI.
172177
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
173-
# arch module_name target triple
174-
"armv6 armv6-apple-none-macho armv6-apple-none-macho"
175-
"armv6m armv6m-apple-none-macho armv6m-apple-none-macho"
176-
"armv7 armv7-apple-none-macho armv7-apple-none-macho"
177-
"armv7m armv7m-apple-none-macho armv7m-apple-none-macho"
178-
"armv7em armv7em-apple-none-macho armv7em-apple-none-macho"
178+
"wasm32 wasm32-unknown-wasip1 wasm32-unknown-wasip1"
179179
)
180-
endif()
181-
if("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD)
182-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
183-
"arm64 arm64-apple-none-macho arm64-apple-none-macho"
184-
"arm64e arm64e-apple-none-macho arm64e-apple-none-macho"
185-
"arm64 arm64-apple-ios arm64-apple-ios18"
186-
"arm64e arm64e-apple-ios arm64e-apple-ios18"
187-
)
188-
endif()
180+
else()
181+
if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD)
182+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
183+
# arch module_name target triple
184+
"armv6 armv6-apple-none-macho armv6-apple-none-macho"
185+
"armv6m armv6m-apple-none-macho armv6m-apple-none-macho"
186+
"armv7 armv7-apple-none-macho armv7-apple-none-macho"
187+
"armv7m armv7m-apple-none-macho armv7m-apple-none-macho"
188+
"armv7em armv7em-apple-none-macho armv7em-apple-none-macho"
189+
)
190+
endif()
191+
if("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD)
192+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
193+
"arm64 arm64-apple-none-macho arm64-apple-none-macho"
194+
"arm64e arm64e-apple-none-macho arm64e-apple-none-macho"
195+
"arm64 arm64-apple-ios arm64-apple-ios18"
196+
"arm64e arm64e-apple-ios arm64e-apple-ios18"
197+
)
198+
endif()
199+
200+
# the following are all ELF targets
201+
if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD)
202+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
203+
"armv4t armv4t-none-none-eabi armv4t-none-none-eabi"
204+
"armv6 armv6-none-none-eabi armv6-none-none-eabi"
205+
"armv6m armv6m-none-none-eabi armv6m-none-none-eabi"
206+
"armv7 armv7-none-none-eabi armv7-none-none-eabi"
207+
"armv7em armv7em-none-none-eabi armv7em-none-none-eabi"
208+
)
209+
endif()
210+
if("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD)
211+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
212+
"aarch64 aarch64-none-none-elf aarch64-none-none-elf"
213+
)
214+
endif()
215+
if("RISCV" IN_LIST LLVM_TARGETS_TO_BUILD)
216+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
217+
"riscv32 riscv32-none-none-eabi riscv32-none-none-eabi"
218+
"riscv64 riscv64-none-none-eabi riscv64-none-none-eabi"
219+
)
220+
endif()
221+
if("X86" IN_LIST LLVM_TARGETS_TO_BUILD)
222+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
223+
"i686 i686-unknown-none-elf i686-unknown-none-elf"
224+
"x86_64 x86_64-unknown-none-elf x86_64-unknown-none-elf"
225+
)
226+
endif()
189227

190-
# the following are all ELF targets
191-
if("ARM" IN_LIST LLVM_TARGETS_TO_BUILD)
192-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
193-
"armv4t armv4t-none-none-eabi armv4t-none-none-eabi"
194-
"armv6 armv6-none-none-eabi armv6-none-none-eabi"
195-
"armv6m armv6m-none-none-eabi armv6m-none-none-eabi"
196-
"armv7 armv7-none-none-eabi armv7-none-none-eabi"
197-
"armv7em armv7em-none-none-eabi armv7em-none-none-eabi"
198-
)
199-
endif()
200-
if("AArch64" IN_LIST LLVM_TARGETS_TO_BUILD)
201-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
202-
"aarch64 aarch64-none-none-elf aarch64-none-none-elf"
203-
)
204-
endif()
205-
if("RISCV" IN_LIST LLVM_TARGETS_TO_BUILD)
206-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
207-
"riscv32 riscv32-none-none-eabi riscv32-none-none-eabi"
208-
"riscv64 riscv64-none-none-eabi riscv64-none-none-eabi"
209-
)
210-
endif()
211-
if("X86" IN_LIST LLVM_TARGETS_TO_BUILD)
212-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
213-
"i686 i686-unknown-none-elf i686-unknown-none-elf"
214-
"x86_64 x86_64-unknown-none-elf x86_64-unknown-none-elf"
215-
)
216-
endif()
228+
if("WebAssembly" IN_LIST LLVM_TARGETS_TO_BUILD)
229+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
230+
"wasm32 wasm32-unknown-none-wasm wasm32-unknown-none-wasm"
231+
"wasm64 wasm64-unknown-none-wasm wasm64-unknown-none-wasm"
232+
)
233+
endif()
217234

218-
if("WebAssembly" IN_LIST LLVM_TARGETS_TO_BUILD)
219-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
220-
"wasm32 wasm32-unknown-none-wasm wasm32-unknown-none-wasm"
221-
"wasm64 wasm64-unknown-none-wasm wasm64-unknown-none-wasm"
222-
)
235+
if("AVR" IN_LIST LLVM_TARGETS_TO_BUILD)
236+
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
237+
"avr avr-none-none-elf avr-none-none-elf"
238+
)
239+
endif()
223240
endif()
224-
225-
if("AVR" IN_LIST LLVM_TARGETS_TO_BUILD)
226-
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
227-
"avr avr-none-none-elf avr-none-none-elf"
228-
)
229-
endif()
230241
endif()
231242

232-
if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB)
243+
if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB AND NOT SWIFT_WASI_SYSROOT_PATH)
233244
if (SWIFT_HOST_VARIANT STREQUAL "linux")
234245
list(APPEND EMBEDDED_STDLIB_TARGET_TRIPLES
235246
"${SWIFT_HOST_VARIANT_ARCH} ${SWIFT_HOST_VARIANT_ARCH}-unknown-linux-gnu ${SWIFT_HOST_VARIANT_ARCH}-unknown-linux-gnu"

stdlib/public/Concurrency/CMakeLists.txt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,8 +260,15 @@ if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB AND SWIFT_SHOULD_BUILD_EMBEDDED_CONCURRENC
260260
if("${mod}" MATCHES "armv6m")
261261
continue()
262262
endif()
263-
set(extra_c_compile_flags -D__MACH__ -D__APPLE__ -ffreestanding -stdlib=libc++)
264-
set(extra_swift_compile_flags -Xcc -D__MACH__ -Xcc -D__APPLE__ -Xcc -ffreestanding)
263+
264+
if("${mod}" MATCHES "-macos$")
265+
set(extra_c_compile_flags -D__MACH__ -D__APPLE__ -ffreestanding -stdlib=libc++)
266+
set(extra_swift_compile_flags -Xcc -D__MACH__ -Xcc -D__APPLE__ -Xcc -ffreestanding)
267+
endif()
268+
269+
elseif (SWIFT_HOST_VARIANT STREQUAL "wasi")
270+
set(extra_c_compile_flags)
271+
set(extra_swift_compile_flags)
265272
endif()
266273

267274
set(SWIFT_SDK_embedded_THREADING_PACKAGE none)
@@ -304,7 +311,10 @@ if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB AND SWIFT_SHOULD_BUILD_EMBEDDED_CONCURRENC
304311
COMPONENT "stdlib"
305312
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
306313
)
307-
set_property(TARGET embedded-concurrency-${mod} PROPERTY OSX_ARCHITECTURES "${arch}")
314+
315+
if(NOT "${arch}" MATCHES "wasm32")
316+
set_property(TARGET embedded-concurrency-${mod} PROPERTY OSX_ARCHITECTURES "${arch}")
317+
endif()
308318
add_dependencies(embedded-concurrency embedded-concurrency-${mod})
309319

310320
# lib/swift/embedded/<triple>/libswift_ConcurrencyDefaultExecutor.a

utils/build-script-impl

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,13 +1639,6 @@ for host in "${ALL_HOSTS[@]}"; do
16391639
)
16401640
fi
16411641

1642-
if [[ ! "${SKIP_BUILD_WASM}" ]]; then
1643-
cmake_options=(
1644-
"${cmake_options[@]}"
1645-
-DSWIFT_WASI_SYSROOT_PATH:STRING="${WASI_SYSROOT}"
1646-
)
1647-
fi
1648-
16491642
if [[ $(is_cross_tools_host ${host}) && "${host}" == "openbsd-"* && -n "${OPENBSD_USE_TOOLCHAIN_FILE}" ]]; then
16501643
cmake_options=(
16511644
"${cmake_options[@]}"
@@ -2503,7 +2496,7 @@ for host in "${ALL_HOSTS[@]}"; do
25032496
cmake_options=(
25042497
-DENABLE_SWIFT=YES
25052498
${cmake_options[@]}
2506-
2499+
25072500
-DCMAKE_BUILD_TYPE:STRING="${LIBDISPATCH_BUILD_TYPE}"
25082501
-DCMAKE_C_COMPILER:PATH="${CLANG_BIN}/clang"
25092502
-DCMAKE_CXX_COMPILER:PATH="${CLANG_BIN}/clang++"

utils/swift_build_support/swift_build_support/products/wasisysroot.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def _build(self, host_target, thread_model='single', target_triple='wasm32-wasi'
6262
# check-symbols. The directory is required during sysroot installation step.
6363
os.makedirs(os.path.join(sysroot_build_dir, "share"), exist_ok=True)
6464

65+
sysroot_install_path = WASILibc.sysroot_install_path(build_root, target_triple)
6566
shell.call([
6667
'make', 'install',
6768
'-j', str(build_jobs),
@@ -74,14 +75,22 @@ def _build(self, host_target, thread_model='single', target_triple='wasm32-wasi'
7475
'-C', self.source_dir,
7576
'OBJDIR=' + os.path.join(self.build_dir, 'obj-' + thread_model),
7677
'SYSROOT=' + sysroot_build_dir,
77-
'INSTALL_DIR=' + WASILibc.sysroot_install_path(build_root, target_triple),
78+
'INSTALL_DIR=' + sysroot_install_path,
7879
'CC=' + os.path.join(clang_tools_path, 'clang'),
7980
'AR=' + os.path.join(llvm_tools_path, 'llvm-ar'),
8081
'NM=' + os.path.join(llvm_tools_path, 'llvm-nm'),
8182
'THREAD_MODEL=' + thread_model,
8283
'TARGET_TRIPLE=' + target_triple,
8384
])
8485

86+
if target_triple == "wasm32-wasi":
87+
# Alias wasm32-wasip1 to wasm32-wasi as Embedded modules use
88+
# wasm32-unknown-wasip1 as the target triple.
89+
for subpath in ["lib", "include"]:
90+
dest_path = os.path.join(sysroot_install_path, subpath, "wasm32-wasip1")
91+
if not os.path.exists(dest_path):
92+
shell.symlink("wasm32-wasi", dest_path)
93+
8594
@classmethod
8695
def get_dependencies(cls):
8796
return [llvm.LLVM]

utils/swift_build_support/swift_build_support/products/wasmstdlib.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ def _build_stdlib(self, host_target, target_triple, llvm_cmake_dir):
141141
self.cmake_options.define('SWIFT_STDLIB_TRACING:BOOL', 'FALSE')
142142
self.cmake_options.define('SWIFT_STDLIB_HAS_ASLR:BOOL', 'FALSE')
143143
self.cmake_options.define('SWIFT_STDLIB_CONCURRENCY_TRACING:BOOL', 'FALSE')
144-
self.cmake_options.define('SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB:BOOL', 'FALSE')
145144
self.cmake_options.define(
146145
'SWIFT_STDLIB_INSTALL_PARENT_MODULE_FOR_SHIMS:BOOL', 'FALSE')
147146
self.cmake_options.define('SWIFT_RUNTIME_CRASH_REPORTER_CLIENT:BOOL', 'FALSE')
@@ -165,6 +164,13 @@ def _build_stdlib(self, host_target, target_triple, llvm_cmake_dir):
165164
self.cmake_options.define('SWIFT_ENABLE_VOLATILE:BOOL', 'TRUE')
166165
self.cmake_options.define('SWIFT_ENABLE_EXPERIMENTAL_OBSERVATION:BOOL', 'TRUE')
167166

167+
self.cmake_options.define('SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB:BOOL', 'TRUE')
168+
self.cmake_options.define(
169+
'SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB_CROSS_COMPILING', 'TRUE')
170+
self.cmake_options.define(
171+
'SWIFT_SDK_embedded_ARCH_wasm32-unknown-wasip1_PATH:PATH',
172+
self._wasi_sysroot_path("wasm32-wasi"))
173+
168174
self.add_extra_cmake_options()
169175

170176
# Test configuration

0 commit comments

Comments
 (0)