Skip to content

Commit 8bcb711

Browse files
authored
Merge pull request #42447 from al45tair/eng/PR-90776105
[Build][Runtime] Add a new threading library.
2 parents c4dd271 + e1bc4f1 commit 8bcb711

File tree

129 files changed

+3667
-2996
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+3667
-2996
lines changed

CMakeLists.txt

Lines changed: 104 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,95 @@ else()
6666
any compiler host sources written in Swift")
6767
endif()
6868

69+
# A convenience pattern to match Darwin platforms. Example:
70+
# if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}")
71+
# ...
72+
# endif()
73+
set(SWIFT_DARWIN_VARIANTS "^(macosx|iphoneos|iphonesimulator|appletvos|appletvsimulator|watchos|watchsimulator)")
74+
set(SWIFT_DARWIN_EMBEDDED_VARIANTS "^(iphoneos|iphonesimulator|appletvos|appletvsimulator|watchos|watchsimulator)")
75+
76+
# A convenient list to match Darwin SDKs. Example:
77+
# if("${SWIFT_HOST_VARIANT_SDK}" IN_LIST SWIFT_DARWIN_PLATFORMS)
78+
# ...
79+
# endif()
80+
set(SWIFT_DARWIN_PLATFORMS "IOS" "IOS_SIMULATOR" "TVOS" "TVOS_SIMULATOR" "WATCHOS" "WATCHOS_SIMULATOR" "OSX")
81+
82+
set(SWIFT_APPLE_PLATFORMS ${SWIFT_DARWIN_PLATFORMS})
83+
if(SWIFT_FREESTANDING_FLAVOR STREQUAL "apple")
84+
list(APPEND SWIFT_APPLE_PLATFORMS "FREESTANDING")
85+
if(SWIFT_FREESTANDING_IS_DARWIN)
86+
list(APPEND SWIFT_DARWIN_PLATFORMS "FREESTANDING")
87+
endif()
88+
endif()
89+
90+
# If SWIFT_HOST_VARIANT_SDK not given, try to detect from the CMAKE_SYSTEM_NAME.
91+
if(SWIFT_HOST_VARIANT_SDK)
92+
set(SWIFT_HOST_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
93+
else()
94+
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
95+
set(SWIFT_HOST_VARIANT_SDK_default "LINUX")
96+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
97+
set(SWIFT_HOST_VARIANT_SDK_default "FREEBSD")
98+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD")
99+
set(SWIFT_HOST_VARIANT_SDK_default "OPENBSD")
100+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
101+
set(SWIFT_HOST_VARIANT_SDK_default "CYGWIN")
102+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
103+
set(SWIFT_HOST_VARIANT_SDK_default "WINDOWS")
104+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
105+
set(SWIFT_HOST_VARIANT_SDK_default "HAIKU")
106+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
107+
set(SWIFT_HOST_VARIANT_SDK_default "ANDROID")
108+
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
109+
set(SWIFT_HOST_VARIANT_SDK_default "OSX")
110+
else()
111+
message(FATAL_ERROR "Unable to detect SDK for host system: ${CMAKE_SYSTEM_NAME}")
112+
endif()
113+
endif()
114+
115+
# If SWIFT_HOST_VARIANT_ARCH not given, try to detect from the CMAKE_SYSTEM_PROCESSOR.
116+
if(SWIFT_HOST_VARIANT_ARCH)
117+
set(SWIFT_HOST_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
118+
else()
119+
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
120+
set(SWIFT_HOST_VARIANT_ARCH_default "x86_64")
121+
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64")
122+
if(SWIFT_HOST_VARIANT_SDK_default STREQUAL OSX)
123+
set(SWIFT_HOST_VARIANT_ARCH_default "arm64")
124+
else()
125+
set(SWIFT_HOST_VARIANT_ARCH_default "aarch64")
126+
endif()
127+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64")
128+
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64")
129+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc")
130+
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc")
131+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le")
132+
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
133+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
134+
set(SWIFT_HOST_VARIANT_ARCH_default "s390x")
135+
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv5|armv5te")
136+
set(SWIFT_HOST_VARIANT_ARCH_default "armv5")
137+
# FIXME: Only matches v6l/v7l - by far the most common variants
138+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
139+
set(SWIFT_HOST_VARIANT_ARCH_default "armv6")
140+
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv7l|armv7-a")
141+
set(SWIFT_HOST_VARIANT_ARCH_default "armv7")
142+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64")
143+
set(SWIFT_HOST_VARIANT_ARCH_default "itanium")
144+
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(x86|i686)")
145+
set(SWIFT_HOST_VARIANT_ARCH_default "i686")
146+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "wasm32")
147+
set(SWIFT_HOST_VARIANT_ARCH_default "wasm32")
148+
else()
149+
message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}")
150+
endif()
151+
endif()
152+
153+
set(SWIFT_HOST_VARIANT_SDK "${SWIFT_HOST_VARIANT_SDK_default}" CACHE STRING
154+
"Deployment sdk for Swift host tools (the compiler).")
155+
set(SWIFT_HOST_VARIANT_ARCH "${SWIFT_HOST_VARIANT_ARCH_default}" CACHE STRING
156+
"Deployment arch for Swift host tools (the compiler).")
157+
69158
#
70159
# User-configurable options that control the inclusion and default build
71160
# behavior for components which may not strictly be necessary (tools, examples,
@@ -103,6 +192,16 @@ option(SWIFT_STDLIB_ENABLE_UNICODE_DATA
103192
NOTE: Disabling this will cause many String methods to crash."
104193
TRUE)
105194

195+
include(Threading)
196+
197+
threading_package_default("${SWIFT_HOST_VARIANT_SDK}"
198+
SWIFT_THREADING_PACKAGE_default)
199+
200+
set(SWIFT_THREADING_PACKAGE "${SWIFT_THREADING_PACKAGE_default}"
201+
CACHE STRING
202+
"The threading package to use. Must be one of 'none', 'pthreads',
203+
'darwin', 'linux', 'win32', 'c11'.")
204+
106205
option(SWIFT_BUILD_DYNAMIC_SDK_OVERLAY
107206
"Build dynamic variants of the Swift SDK overlay"
108207
TRUE)
@@ -671,27 +770,6 @@ include_directories(BEFORE
671770
${SWIFT_INCLUDE_DIR}
672771
)
673772

674-
# A convenience pattern to match Darwin platforms. Example:
675-
# if(SWIFT_HOST_VARIANT MATCHES "${SWIFT_DARWIN_VARIANTS}")
676-
# ...
677-
# endif()
678-
set(SWIFT_DARWIN_VARIANTS "^(macosx|iphoneos|iphonesimulator|appletvos|appletvsimulator|watchos|watchsimulator)")
679-
set(SWIFT_DARWIN_EMBEDDED_VARIANTS "^(iphoneos|iphonesimulator|appletvos|appletvsimulator|watchos|watchsimulator)")
680-
681-
# A convenient list to match Darwin SDKs. Example:
682-
# if("${SWIFT_HOST_VARIANT_SDK}" IN_LIST SWIFT_DARWIN_PLATFORMS)
683-
# ...
684-
# endif()
685-
set(SWIFT_DARWIN_PLATFORMS "IOS" "IOS_SIMULATOR" "TVOS" "TVOS_SIMULATOR" "WATCHOS" "WATCHOS_SIMULATOR" "OSX")
686-
687-
set(SWIFT_APPLE_PLATFORMS ${SWIFT_DARWIN_PLATFORMS})
688-
if(SWIFT_FREESTANDING_FLAVOR STREQUAL "apple")
689-
list(APPEND SWIFT_APPLE_PLATFORMS "FREESTANDING")
690-
if(SWIFT_FREESTANDING_IS_DARWIN)
691-
list(APPEND SWIFT_DARWIN_PLATFORMS "FREESTANDING")
692-
endif()
693-
endif()
694-
695773
# Configuration flags passed to all of our invocations of gyb. Try to
696774
# avoid making up new variable names here if you can find a CMake
697775
# variable that will do the job.
@@ -708,74 +786,6 @@ if(XCODE)
708786
swift_common_xcode_cxx_config()
709787
endif()
710788

711-
# If SWIFT_HOST_VARIANT_SDK not given, try to detect from the CMAKE_SYSTEM_NAME.
712-
if(SWIFT_HOST_VARIANT_SDK)
713-
set(SWIFT_HOST_VARIANT_SDK_default "${SWIFT_HOST_VARIANT_SDK}")
714-
else()
715-
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
716-
set(SWIFT_HOST_VARIANT_SDK_default "LINUX")
717-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
718-
set(SWIFT_HOST_VARIANT_SDK_default "FREEBSD")
719-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "OpenBSD")
720-
set(SWIFT_HOST_VARIANT_SDK_default "OPENBSD")
721-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "CYGWIN")
722-
set(SWIFT_HOST_VARIANT_SDK_default "CYGWIN")
723-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
724-
set(SWIFT_HOST_VARIANT_SDK_default "WINDOWS")
725-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Haiku")
726-
set(SWIFT_HOST_VARIANT_SDK_default "HAIKU")
727-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Android")
728-
set(SWIFT_HOST_VARIANT_SDK_default "ANDROID")
729-
elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
730-
set(SWIFT_HOST_VARIANT_SDK_default "OSX")
731-
else()
732-
message(FATAL_ERROR "Unable to detect SDK for host system: ${CMAKE_SYSTEM_NAME}")
733-
endif()
734-
endif()
735-
736-
# If SWIFT_HOST_VARIANT_ARCH not given, try to detect from the CMAKE_SYSTEM_PROCESSOR.
737-
if(SWIFT_HOST_VARIANT_ARCH)
738-
set(SWIFT_HOST_VARIANT_ARCH_default "${SWIFT_HOST_VARIANT_ARCH}")
739-
else()
740-
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64")
741-
set(SWIFT_HOST_VARIANT_ARCH_default "x86_64")
742-
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|ARM64|arm64")
743-
if(SWIFT_HOST_VARIANT_SDK_default STREQUAL OSX)
744-
set(SWIFT_HOST_VARIANT_ARCH_default "arm64")
745-
else()
746-
set(SWIFT_HOST_VARIANT_ARCH_default "aarch64")
747-
endif()
748-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64")
749-
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64")
750-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc")
751-
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc")
752-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le")
753-
set(SWIFT_HOST_VARIANT_ARCH_default "powerpc64le")
754-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
755-
set(SWIFT_HOST_VARIANT_ARCH_default "s390x")
756-
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv5|armv5te")
757-
set(SWIFT_HOST_VARIANT_ARCH_default "armv5")
758-
# FIXME: Only matches v6l/v7l - by far the most common variants
759-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
760-
set(SWIFT_HOST_VARIANT_ARCH_default "armv6")
761-
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "armv7l|armv7-a")
762-
set(SWIFT_HOST_VARIANT_ARCH_default "armv7")
763-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64")
764-
set(SWIFT_HOST_VARIANT_ARCH_default "itanium")
765-
elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "(x86|i686)")
766-
set(SWIFT_HOST_VARIANT_ARCH_default "i686")
767-
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "wasm32")
768-
set(SWIFT_HOST_VARIANT_ARCH_default "wasm32")
769-
else()
770-
message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}")
771-
endif()
772-
endif()
773-
774-
set(SWIFT_HOST_VARIANT_SDK "${SWIFT_HOST_VARIANT_SDK_default}" CACHE STRING
775-
"Deployment sdk for Swift host tools (the compiler).")
776-
set(SWIFT_HOST_VARIANT_ARCH "${SWIFT_HOST_VARIANT_ARCH_default}" CACHE STRING
777-
"Deployment arch for Swift host tools (the compiler).")
778-
779789
# Which default linker to use. Prefer LLVM_USE_LINKER if it set, otherwise use
780790
# our own defaults. This should only be possible in a unified (not stand alone)
781791
# build environment.
@@ -1037,11 +1047,12 @@ if(SWIFT_BUILD_STDLIB OR SWIFT_BUILD_SDK_OVERLAY)
10371047
message(STATUS " Leak Detection Checker Entrypoints: ${SWIFT_RUNTIME_ENABLE_LEAK_CHECKER}")
10381048
message(STATUS "")
10391049

1050+
message(STATUS "Threading Package: ${SWIFT_THREADING_PACKAGE}")
10401051
message(STATUS "Differentiable Programming Support: ${SWIFT_ENABLE_EXPERIMENTAL_DIFFERENTIABLE_PROGRAMMING}")
1041-
message(STATUS "Concurrency Support: ${SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY}")
1042-
message(STATUS "Distributed Support: ${SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED}")
1043-
message(STATUS "String Processing Support: ${SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING}")
1044-
message(STATUS "Unicode Support: ${SWIFT_STDLIB_ENABLE_UNICODE_DATA}")
1052+
message(STATUS "Concurrency Support: ${SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY}")
1053+
message(STATUS "Distributed Support: ${SWIFT_ENABLE_EXPERIMENTAL_DISTRIBUTED}")
1054+
message(STATUS "String Processing Support: ${SWIFT_ENABLE_EXPERIMENTAL_STRING_PROCESSING}")
1055+
message(STATUS "Unicode Support: ${SWIFT_STDLIB_ENABLE_UNICODE_DATA}")
10451056
message(STATUS "")
10461057
else()
10471058
message(STATUS "Not building Swift standard library, SDK overlays, and runtime")

cmake/caches/Runtime-WASI-wasm32.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ set(SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY YES CACHE BOOL "")
2323
# build with the host compiler
2424
set(SWIFT_BUILD_RUNTIME_WITH_HOST_COMPILER YES CACHE BOOL "")
2525

26-
set(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME TRUE CACHE BOOL "")
26+
set(SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY TRUE CACHE BOOL "")

cmake/modules/AddSwift.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ include(SwiftXcodeSupport)
44
include(SwiftWindowsSupport)
55
include(SwiftAndroidSupport)
66
include(SwiftCXXUtils)
7+
include(Threading)
78

89
function(_swift_gyb_target_sources target scope)
910
file(GLOB GYB_UNICODE_DATA ${SWIFT_SOURCE_DIR}/utils/UnicodeData/*)
@@ -308,6 +309,10 @@ function(_add_host_variant_c_compile_flags target)
308309
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS>)
309310
endif()
310311

312+
threading_package_name("${SWIFT_HOST_VARIANT_SDK}" _threading_package)
313+
target_compile_definitions(${target} PRIVATE
314+
"SWIFT_THREADING_${_threading_package}")
315+
311316
if(SWIFT_ANALYZE_CODE_COVERAGE)
312317
target_compile_options(${target} PRIVATE
313318
$<$<COMPILE_LANGUAGE:C,CXX,OBJC,OBJCXX>:-fprofile-instr-generate -fcoverage-mapping>)

cmake/modules/AddSwiftUnittests.cmake

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11

22
include(AddSwift)
3+
include(Threading)
34

45
add_custom_target(SwiftUnitTests)
56

@@ -47,11 +48,15 @@ function(add_swift_unittest test_dirname)
4748
endif()
4849

4950
# some headers switch their inline implementations based on
50-
# SWIFT_STDLIB_SINGLE_THREADED_RUNTIME definition
51-
if(SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
51+
# SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY and
52+
# SWIFT_THREADING_PACKAGE definitions
53+
if(SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY)
5254
target_compile_definitions("${test_dirname}" PRIVATE
53-
SWIFT_STDLIB_SINGLE_THREADED_RUNTIME)
55+
SWIFT_STDLIB_SINGLE_THREADED_CONCURRENCY)
5456
endif()
57+
threading_package_name("${SWIFT_HOST_VARIANT_SDK}" _threading_package)
58+
target_compile_definitions("${test_dirname}" PRIVATE
59+
"SWIFT_THREADING_${_threading_package}")
5560

5661
if(NOT SWIFT_COMPILER_IS_MSVC_LIKE)
5762
if(SWIFT_USE_LINKER)

cmake/modules/Threading.cmake

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Get the default threading package for the platform
2+
function(threading_package_default sdk out_var)
3+
if(sdk IN_LIST SWIFT_DARWIN_PLATFORMS)
4+
set("${out_var}" "darwin" PARENT_SCOPE)
5+
elseif(sdk STREQUAL "LINUX")
6+
set("${out_var}" "linux" PARENT_SCOPE)
7+
elseif(sdk STREQUAL "WINDOWS")
8+
set("${out_var}" "win32" PARENT_SCOPE)
9+
elseif(sdk STREQUAL "WASI")
10+
set("${out_var}" "none" PARENT_SCOPE)
11+
else()
12+
set("${out_var}" "pthreads" PARENT_SCOPE)
13+
endif()
14+
endfunction()
15+
16+
# Given the threading package, find the name for the preprocessor
17+
# define that we need to make. Also deals with the default platform
18+
# setting.
19+
function(threading_package_name sdk out_var)
20+
precondition(SWIFT_HOST_VARIANT_SDK)
21+
precondition(SWIFT_DARWIN_PLATFORMS)
22+
23+
string(TOUPPER "${SWIFT_THREADING_PACKAGE}" package)
24+
if(package STREQUAL "")
25+
threading_package_default(package)
26+
string(TOUPPER "${package}" package)
27+
endif()
28+
set("${out_var}" "${package}" PARENT_SCOPE)
29+
endfunction()

include/swift/Basic/Compiler.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,20 @@
162162
#define SWIFT_ASM_LABEL_WITH_PREFIX(STRING) \
163163
SWIFT_ASM_LABEL_RAW(SWIFT_SYMBOL_PREFIX_STRING STRING)
164164

165+
// SWIFT_FORMAT(fmt,first) marks a function as taking a format string argument
166+
// at argument `fmt`, with the first argument for the format string as `first`.
167+
#if __has_attribute(format)
168+
#define SWIFT_FORMAT(fmt, first) __attribute__((format(printf, fmt, first)))
169+
#else
170+
#define SWIFT_FORMAT(fmt, first)
171+
#endif
172+
173+
// SWIFT_VFORMAT(fmt) marks a function as taking a format string argument at
174+
// argument `fmt`, with the arguments in a `va_list`.
175+
#if __has_attribute(format)
176+
#define SWIFT_VFORMAT(fmt) __attribute__((format(printf, fmt, 0)))
177+
#else
178+
#define SWIFT_VFORMAT(fmt)
179+
#endif
180+
165181
#endif // SWIFT_BASIC_COMPILER_H

0 commit comments

Comments
 (0)