Skip to content

Commit 8d84a64

Browse files
[wasm] Add metadata registration for WebAssembly
This patch adds the metadata registration for the wasm targets, and also adds build support for it.
1 parent 4e2f3b1 commit 8d84a64

File tree

2 files changed

+35
-6
lines changed

2 files changed

+35
-6
lines changed

stdlib/public/runtime/CMakeLists.txt

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ set(swift_runtime_backtracing_sources
8787
# Acknowledge that the following sources are known.
8888
set(LLVM_OPTIONAL_SOURCES
8989
SwiftRT-COFF.cpp
90-
SwiftRT-ELF.cpp
90+
SwiftRT-ELF-WASM.cpp
9191
${swift_runtime_sources}
9292
${swift_runtime_objc_sources}
9393
${swift_runtime_leaks_sources}
@@ -138,11 +138,14 @@ add_swift_target_library(swiftRuntime OBJECT_LIBRARY
138138

139139
set(ELFISH_SDKS)
140140
set(COFF_SDKS)
141+
set(WASM_SDKS)
141142
foreach(sdk ${SWIFT_SDKS})
142143
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF")
143144
list(APPEND ELFISH_SDKS ${sdk})
144145
elseif("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF")
145146
list(APPEND COFF_SDKS ${sdk})
147+
elseif("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
148+
list(APPEND WASM_SDKS ${sdk})
146149
endif()
147150
endforeach()
148151

@@ -151,7 +154,7 @@ endforeach()
151154
# with LTO, force swift runtime to compile without LTO for Linux.
152155
add_swift_target_library(swiftImageRegistrationObjectELF
153156
OBJECT_LIBRARY IS_STDLIB IS_STDLIB_CORE
154-
SwiftRT-ELF.cpp
157+
SwiftRT-ELF-WASM.cpp
155158
C_COMPILE_FLAGS ${SWIFT_RUNTIME_CORE_CXX_FLAGS}
156159
C_COMPILE_FLAGS_LINUX -fno-lto
157160
LINK_FLAGS ${SWIFT_RUNTIME_CORE_LINK_FLAGS}
@@ -169,17 +172,32 @@ add_swift_target_library(swiftImageRegistrationObjectCOFF
169172
SWIFT_COMPILE_FLAGS ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
170173
INSTALL_IN_COMPONENT none)
171174

175+
add_swift_target_library(swiftImageRegistrationObjectWASM
176+
OBJECT_LIBRARY IS_STDLIB IS_STDLIB_CORE
177+
SwiftRT-ELF-WASM.cpp
178+
C_COMPILE_FLAGS ${SWIFT_RUNTIME_CORE_CXX_FLAGS}
179+
LINK_FLAGS ${SWIFT_RUNTIME_CORE_LINK_FLAGS}
180+
TARGET_SDKS ${WASM_SDKS}
181+
SWIFT_COMPILE_FLAGS ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
182+
INSTALL_IN_COMPONENT none)
183+
172184
foreach(sdk ${SWIFT_SDKS})
173185
foreach(arch ${SWIFT_SDK_${sdk}_ARCHITECTURES})
174186
set(arch_subdir "${SWIFT_SDK_${sdk}_LIB_SUBDIR}/${arch}")
175187
set(arch_suffix "${SWIFT_SDK_${sdk}_LIB_SUBDIR}-${arch}")
176188

177189
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF" OR
178-
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF")
190+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF" OR
191+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
179192
# TODO(compnerd) switch to the generator expression when cmake is upgraded
180193
# to a version which supports it.
181194
# set(swiftrtObject "$<TARGET_OBJECTS:swiftImageRegistrationObject${SWIFT_SDK_${sdk}_OBJECT_FORMAT}-${arch_suffix}>")
182-
set(swiftrtObject ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/swiftImageRegistrationObject${SWIFT_SDK_${sdk}_OBJECT_FORMAT}-${arch_suffix}.dir/SwiftRT-${SWIFT_SDK_${sdk}_OBJECT_FORMAT}.cpp${CMAKE_C_OUTPUT_EXTENSION})
195+
set(swiftrtSourceName SwiftRT-${SWIFT_SDK_${sdk}_OBJECT_FORMAT}.cpp)
196+
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF" OR
197+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
198+
set(swiftrtSourceName SwiftRT-ELF-WASM.cpp)
199+
endif()
200+
set(swiftrtObject ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/swiftImageRegistrationObject${SWIFT_SDK_${sdk}_OBJECT_FORMAT}-${arch_suffix}.dir/${swiftrtSourceName}${CMAKE_C_OUTPUT_EXTENSION})
183201

184202
if(sdk STREQUAL WINDOWS)
185203
set(extension .obj)

stdlib/public/runtime/SwiftRT-ELF.cpp renamed to stdlib/public/runtime/SwiftRT-ELF-WASM.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//===--- SwiftRT-ELF.cpp --------------------------------------------------===//
1+
//===--- SwiftRT-ELF-WASM.cpp ---------------------------------------------===//
22
//
33
// This source file is part of the Swift.org open source project
44
//
@@ -16,14 +16,25 @@
1616
#include <cstddef>
1717
#include <new>
1818

19+
#if defined(__ELF__)
1920
extern "C" const char __dso_handle[];
21+
#elif defined(__wasm__)
22+
// NOTE: Multi images in a single process is not yet
23+
// stabilized in WebAssembly toolchain outside of Emscripten.
24+
static constexpr const void *__dso_handle = nullptr;
25+
#endif
2026

2127
// Create empty sections to ensure that the start/stop symbols are synthesized
2228
// by the linker. Otherwise, we may end up with undefined symbol references as
2329
// the linker table section was never constructed.
30+
#if defined(__ELF__)
31+
# define DECLARE_EMPTY_METADATA_SECTION(name) __asm__("\t.section " #name ",\"a\"\n");
32+
#elif defined(__wasm__)
33+
# define DECLARE_EMPTY_METADATA_SECTION(name) __asm__("\t.section " #name ",\"\",@\n");
34+
#endif
2435

2536
#define DECLARE_SWIFT_SECTION(name) \
26-
__asm__("\t.section " #name ",\"a\"\n"); \
37+
DECLARE_EMPTY_METADATA_SECTION(name) \
2738
__attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __start_##name; \
2839
__attribute__((__visibility__("hidden"),__aligned__(1))) extern const char __stop_##name;
2940

0 commit comments

Comments
 (0)