Skip to content

Commit ae0a061

Browse files
Merge pull request #66543 from kateinoigakukun/pr-b1e7535cbac5af8c5e06068a747c1b925d571265
[wasm] Add metadata registration for WebAssembly
2 parents a70b040 + 8d84a64 commit ae0a061

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
@@ -88,7 +88,7 @@ set(swift_runtime_backtracing_sources
8888
# Acknowledge that the following sources are known.
8989
set(LLVM_OPTIONAL_SOURCES
9090
SwiftRT-COFF.cpp
91-
SwiftRT-ELF.cpp
91+
SwiftRT-ELF-WASM.cpp
9292
${swift_runtime_sources}
9393
${swift_runtime_objc_sources}
9494
${swift_runtime_leaks_sources}
@@ -140,11 +140,14 @@ add_swift_target_library(swiftRuntime OBJECT_LIBRARY
140140

141141
set(ELFISH_SDKS)
142142
set(COFF_SDKS)
143+
set(WASM_SDKS)
143144
foreach(sdk ${SWIFT_SDKS})
144145
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF")
145146
list(APPEND ELFISH_SDKS ${sdk})
146147
elseif("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF")
147148
list(APPEND COFF_SDKS ${sdk})
149+
elseif("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
150+
list(APPEND WASM_SDKS ${sdk})
148151
endif()
149152
endforeach()
150153

@@ -153,7 +156,7 @@ endforeach()
153156
# with LTO, force swift runtime to compile without LTO for Linux.
154157
add_swift_target_library(swiftImageRegistrationObjectELF
155158
OBJECT_LIBRARY IS_STDLIB IS_STDLIB_CORE
156-
SwiftRT-ELF.cpp
159+
SwiftRT-ELF-WASM.cpp
157160
C_COMPILE_FLAGS ${SWIFT_RUNTIME_CORE_CXX_FLAGS}
158161
C_COMPILE_FLAGS_LINUX -fno-lto
159162
LINK_FLAGS ${SWIFT_RUNTIME_CORE_LINK_FLAGS}
@@ -171,17 +174,32 @@ add_swift_target_library(swiftImageRegistrationObjectCOFF
171174
SWIFT_COMPILE_FLAGS ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS}
172175
INSTALL_IN_COMPONENT none)
173176

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

179191
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF" OR
180-
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF")
192+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "COFF" OR
193+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
181194
# TODO(compnerd) switch to the generator expression when cmake is upgraded
182195
# to a version which supports it.
183196
# set(swiftrtObject "$<TARGET_OBJECTS:swiftImageRegistrationObject${SWIFT_SDK_${sdk}_OBJECT_FORMAT}-${arch_suffix}>")
184-
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})
197+
set(swiftrtSourceName SwiftRT-${SWIFT_SDK_${sdk}_OBJECT_FORMAT}.cpp)
198+
if("${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "ELF" OR
199+
"${SWIFT_SDK_${sdk}_OBJECT_FORMAT}" STREQUAL "WASM")
200+
set(swiftrtSourceName SwiftRT-ELF-WASM.cpp)
201+
endif()
202+
set(swiftrtObject ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/swiftImageRegistrationObject${SWIFT_SDK_${sdk}_OBJECT_FORMAT}-${arch_suffix}.dir/${swiftrtSourceName}${CMAKE_C_OUTPUT_EXTENSION})
185203

186204
if(sdk STREQUAL WINDOWS)
187205
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)