From d9e949ae7e2f4c31001b125305a4fdb6876d2e8b Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 18 Aug 2025 18:41:10 +0100 Subject: [PATCH 1/4] Embedded Wasm: enable `import WASILibc` WASILibc wasn't built for the embedded stdlib in `stdlib/public/Platform/CMakeLists.txt`. New `copy_wasilibc_modulemap_embedded_resource` and `embedded-stdlib-platform-${triple}` targets are added, the latter for `wasm32-unknown-wasip1` only for now. Also added a `wasilibc_functions.swift` test to verify the result. Resolves https://github.com/swiftlang/swift/issues/83513 rdar://157467412 --- stdlib/public/Platform/CMakeLists.txt | 58 +++++++++++++++++++++ test/embedded/wasm/wasilibc_functions.swift | 18 +++++++ 2 files changed, 76 insertions(+) create mode 100644 test/embedded/wasm/wasilibc_functions.swift diff --git a/stdlib/public/Platform/CMakeLists.txt b/stdlib/public/Platform/CMakeLists.txt index 9ae7a977ac400..9e38e0dff0aae 100644 --- a/stdlib/public/Platform/CMakeLists.txt +++ b/stdlib/public/Platform/CMakeLists.txt @@ -504,6 +504,7 @@ if("WASI" IN_LIST SWIFT_SDKS) set(arch_subdir "${SWIFT_SDK_WASI_LIB_SUBDIR}/${arch}") set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}") set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}") + set(module_dir_embedded "${SWIFTLIB_DIR}/embedded/${arch}") add_custom_command_target( copy_wasilibc_modulemap_resource @@ -529,6 +530,25 @@ if("WASI" IN_LIST SWIFT_SDKS) COMPONENT sdk-overlay) endif() + if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB) + add_custom_command_target( + copy_wasilibc_modulemap_embedded_resource + COMMAND + "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir} ${module_dir_embedded} + COMMAND + "${CMAKE_COMMAND}" "-E" "copy_if_different" + "${CMAKE_CURRENT_SOURCE_DIR}/${wasilibc_modulemap_source}" ${module_dir_embedded} + OUTPUT "${module_dir_embedded}/${wasilibc_modulemap_source}" + COMMENT "Copying WASILibc modulemap to resource directories") + add_dependencies(sdk-overlay ${copy_wasilibc_modulemap_embedded_resource}) + list(APPEND wasilibc_modulemap_target_list ${copy_wasilibc_modulemap_embedded_resource}) + + swift_install_in_component(FILES "${wasilibc_modulemap_source}" + DESTINATION "lib/swift/embedded/${arch_subdir}" + COMPONENT sdk-overlay) + message(STATUS "wasilibc_modulemap_target_list is ${wasilibc_modulemap_target_list}") + endif() + set(wasilibc_apinotes_source "SwiftWASILibc.apinotes") add_custom_command_target( copy_wasilibc_apinotes_resource @@ -571,3 +591,41 @@ if(WINDOWS IN_LIST SWIFT_SDKS) DESTINATION "share" COMPONENT sdk-overlay) endif() + +if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB) + add_custom_target(embedded-stdlib-platform) + add_dependencies(embedded-libraries embedded-stdlib-platform) + + if(SWIFT_WASI_SYSROOT_PATH) + set(arch "wasm32") + set(triple "wasm32-unknown-wasip1") + + set(SWIFT_SDK_embedded_ARCH_${arch}_MODULE "${triple}") + set(SWIFT_SDK_embedded_LIB_SUBDIR "embedded") + set(SWIFT_SDK_embedded_ARCH_${arch}_TRIPLE "${triple}") + add_swift_target_library_single( + embedded-stdlib-platform-${triple} + swiftWASILibc + ONLY_SWIFTMODULE + IS_STDLIB IS_FRAGILE + ${swift_platform_sources} + POSIXError.swift + + GYB_SOURCES + ${swift_platform_gyb_sources} + WASILibc.swift.gyb + + SWIFT_COMPILE_FLAGS + -enable-experimental-feature Embedded + -Xfrontend -emit-empty-object-file + + MODULE_DIR "${CMAKE_BINARY_DIR}/lib/swift/embedded" + SDK "embedded" + ARCHITECTURE "${arch}" + ARCHITECTURE_SUBDIR_NAME "${mod}" + DEPENDS wasilibc_modulemap + INSTALL_IN_COMPONENT sdk-overlay + ) + add_dependencies(embedded-stdlib-platform embedded-stdlib-platform-${triple}) + endif() +endif() diff --git a/test/embedded/wasm/wasilibc_functions.swift b/test/embedded/wasm/wasilibc_functions.swift new file mode 100644 index 0000000000000..0fe9cfafc1424 --- /dev/null +++ b/test/embedded/wasm/wasilibc_functions.swift @@ -0,0 +1,18 @@ +// RUN: %target-run-simple-swift(-enable-experimental-feature Embedded -parse-as-library -wmo) | %FileCheck %s + +// REQUIRES: executable_test +// REQUIRES: OS=wasip1 +// REQUIRES: swift_feature_Embedded + +import WASILibc +@main struct Main { + static func main() { + puts("Hello") + // CHECK: Hello + let div_result = div(5,2) + print(div_result.quot) + // CHECK: 2 + print(div_result.rem) + // CHECK: 1 + } +} From 064c8af1162e2a07b6b09907f2376003a4e21823 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 18 Aug 2025 20:28:59 +0100 Subject: [PATCH 2/4] Platform/CMake: add `embedded-stdlib-${mod}` dependency --- stdlib/public/Platform/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/public/Platform/CMakeLists.txt b/stdlib/public/Platform/CMakeLists.txt index 9e38e0dff0aae..392ac4fc2a70f 100644 --- a/stdlib/public/Platform/CMakeLists.txt +++ b/stdlib/public/Platform/CMakeLists.txt @@ -623,7 +623,7 @@ if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB) SDK "embedded" ARCHITECTURE "${arch}" ARCHITECTURE_SUBDIR_NAME "${mod}" - DEPENDS wasilibc_modulemap + DEPENDS embedded-stdlib-${mod} wasilibc_modulemap INSTALL_IN_COMPONENT sdk-overlay ) add_dependencies(embedded-stdlib-platform embedded-stdlib-platform-${triple}) From f964641bfbd4868fe08948a08cabe53b59f3c2b1 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Mon, 18 Aug 2025 20:42:45 +0100 Subject: [PATCH 3/4] Platform/CMake: remove unused `message` func, `mod` var --- stdlib/public/Platform/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stdlib/public/Platform/CMakeLists.txt b/stdlib/public/Platform/CMakeLists.txt index 392ac4fc2a70f..f769ec91f3bc3 100644 --- a/stdlib/public/Platform/CMakeLists.txt +++ b/stdlib/public/Platform/CMakeLists.txt @@ -546,7 +546,6 @@ if("WASI" IN_LIST SWIFT_SDKS) swift_install_in_component(FILES "${wasilibc_modulemap_source}" DESTINATION "lib/swift/embedded/${arch_subdir}" COMPONENT sdk-overlay) - message(STATUS "wasilibc_modulemap_target_list is ${wasilibc_modulemap_target_list}") endif() set(wasilibc_apinotes_source "SwiftWASILibc.apinotes") @@ -622,8 +621,8 @@ if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB) MODULE_DIR "${CMAKE_BINARY_DIR}/lib/swift/embedded" SDK "embedded" ARCHITECTURE "${arch}" - ARCHITECTURE_SUBDIR_NAME "${mod}" - DEPENDS embedded-stdlib-${mod} wasilibc_modulemap + ARCHITECTURE_SUBDIR_NAME "${triple}" + DEPENDS embedded-stdlib-${triple} wasilibc_modulemap INSTALL_IN_COMPONENT sdk-overlay ) add_dependencies(embedded-stdlib-platform embedded-stdlib-platform-${triple}) From 3f10ba91fc81f7020a9f77e225211b5ea89fc346 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 19 Aug 2025 11:25:14 +0100 Subject: [PATCH 4/4] Platform/CMake: use `arch` instead of `arch_subdir` This fixes wasi-libc.modulemap not found after installation --- stdlib/public/Platform/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/public/Platform/CMakeLists.txt b/stdlib/public/Platform/CMakeLists.txt index f769ec91f3bc3..be20ebe2174be 100644 --- a/stdlib/public/Platform/CMakeLists.txt +++ b/stdlib/public/Platform/CMakeLists.txt @@ -544,7 +544,7 @@ if("WASI" IN_LIST SWIFT_SDKS) list(APPEND wasilibc_modulemap_target_list ${copy_wasilibc_modulemap_embedded_resource}) swift_install_in_component(FILES "${wasilibc_modulemap_source}" - DESTINATION "lib/swift/embedded/${arch_subdir}" + DESTINATION "lib/swift/embedded/${arch}" COMPONENT sdk-overlay) endif()