diff --git a/Runtimes/Core/Concurrency/CMakeLists.txt b/Runtimes/Core/Concurrency/CMakeLists.txt index 4a7fbd45d5ef7..f82b8db784f4c 100644 --- a/Runtimes/Core/Concurrency/CMakeLists.txt +++ b/Runtimes/Core/Concurrency/CMakeLists.txt @@ -16,7 +16,6 @@ add_library(swift_Concurrency ExecutorImpl.cpp ExecutorChecks.cpp GlobalExecutor.cpp - Setup.cpp Task.cpp TaskAlloc.cpp TaskGroup.cpp diff --git a/stdlib/public/Concurrency/CMakeLists.txt b/stdlib/public/Concurrency/CMakeLists.txt index bdc646da3d97f..70757822f5f8b 100644 --- a/stdlib/public/Concurrency/CMakeLists.txt +++ b/stdlib/public/Concurrency/CMakeLists.txt @@ -84,7 +84,6 @@ set(SWIFT_RUNTIME_CONCURRENCY_C_SOURCES Error.cpp ExecutorBridge.cpp ExecutorChecks.cpp - Setup.cpp Task.cpp TaskAlloc.cpp TaskStatus.cpp diff --git a/stdlib/public/Concurrency/Setup.cpp b/stdlib/public/Concurrency/Setup.cpp deleted file mode 100644 index 628a6ef0240f2..0000000000000 --- a/stdlib/public/Concurrency/Setup.cpp +++ /dev/null @@ -1,56 +0,0 @@ -//===--- Setup.cpp - Load-time setup code ---------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors -// -//===----------------------------------------------------------------------===// - -#include "swift/Runtime/Metadata.h" - -// Helper macros for figuring out the mangled name of a context descriptor. -#define DESCRIPTOR_MANGLING_SUFFIX_Structure Mn -#define DESCRIPTOR_MANGLING_SUFFIX_Class Mn -#define DESCRIPTOR_MANGLING_SUFFIX_Enum Mn -#define DESCRIPTOR_MANGLING_SUFFIX_Protocol Mp - -#define DESCRIPTOR_MANGLING_SUFFIX_(X) X -#define DESCRIPTOR_MANGLING_SUFFIX(KIND) \ - DESCRIPTOR_MANGLING_SUFFIX_(DESCRIPTOR_MANGLING_SUFFIX_##KIND) - -#define DESCRIPTOR_MANGLING_(CHAR, SUFFIX) $sSc##CHAR##SUFFIX -#define DESCRIPTOR_MANGLING(CHAR, SUFFIX) DESCRIPTOR_MANGLING_(CHAR, SUFFIX) - -// Declare context descriptors for all of the concurrency descriptors with -// standard manglings. -#define STANDARD_TYPE(KIND, MANGLING, TYPENAME) -#define STANDARD_TYPE_CONCURRENCY(KIND, MANGLING, TYPENAME) \ - extern "C" const swift::ContextDescriptor DESCRIPTOR_MANGLING( \ - MANGLING, DESCRIPTOR_MANGLING_SUFFIX(KIND)); -#include "swift/Demangling/StandardTypesMangling.def" - -// Defined in Swift, redeclared here so we can register it with the runtime. -extern "C" SWIFT_CC(swift) -bool _swift_task_isCurrentGlobalActor( - const swift::Metadata *, const swift::WitnessTable *); - -// Register our type descriptors with standard manglings when the concurrency -// runtime is loaded. This allows the runtime to quickly resolve those standard -// manglings. -SWIFT_ALLOWED_RUNTIME_GLOBAL_CTOR_BEGIN -__attribute__((constructor)) static void setupStandardConcurrencyDescriptors() { - static const swift::ConcurrencyStandardTypeDescriptors descriptors = { -#define STANDARD_TYPE(KIND, MANGLING, TYPENAME) -#define STANDARD_TYPE_CONCURRENCY(KIND, MANGLING, TYPENAME) \ - &DESCRIPTOR_MANGLING(MANGLING, DESCRIPTOR_MANGLING_SUFFIX(KIND)), -#include "swift/Demangling/StandardTypesMangling.def" - }; - _swift_registerConcurrencyRuntime( - &descriptors, - &_swift_task_isCurrentGlobalActor); -} -SWIFT_ALLOWED_RUNTIME_GLOBAL_CTOR_END diff --git a/stdlib/public/Concurrency/Task.cpp b/stdlib/public/Concurrency/Task.cpp index 496c6a1100e14..661ceabec8dff 100644 --- a/stdlib/public/Concurrency/Task.cpp +++ b/stdlib/public/Concurrency/Task.cpp @@ -1874,6 +1874,60 @@ static void swift_task_startOnMainActorImpl(AsyncTask* task) { _swift_task_setCurrent(originalTask); } +// ==== Load-time setup code ---------------------------------------------------- +// +// The ctor below is placed here so that it must always be linked into the final +// image even if the libswift_Concurrency is linked in as a static library. + +#if !SWIFT_CONCURRENCY_EMBEDDED + +// Helper macros for figuring out the mangled name of a context descriptor. +#define DESCRIPTOR_MANGLING_SUFFIX_Structure Mn +#define DESCRIPTOR_MANGLING_SUFFIX_Class Mn +#define DESCRIPTOR_MANGLING_SUFFIX_Enum Mn +#define DESCRIPTOR_MANGLING_SUFFIX_Protocol Mp + +#define DESCRIPTOR_MANGLING_SUFFIX_(X) X +#define DESCRIPTOR_MANGLING_SUFFIX(KIND) \ + DESCRIPTOR_MANGLING_SUFFIX_(DESCRIPTOR_MANGLING_SUFFIX_##KIND) + +#define DESCRIPTOR_MANGLING_(CHAR, SUFFIX) $sSc##CHAR##SUFFIX +#define DESCRIPTOR_MANGLING(CHAR, SUFFIX) DESCRIPTOR_MANGLING_(CHAR, SUFFIX) + +// Declare context descriptors for all of the concurrency descriptors with +// standard manglings. +#define STANDARD_TYPE(KIND, MANGLING, TYPENAME) +#define STANDARD_TYPE_CONCURRENCY(KIND, MANGLING, TYPENAME) \ + extern "C" const swift::ContextDescriptor DESCRIPTOR_MANGLING( \ + MANGLING, DESCRIPTOR_MANGLING_SUFFIX(KIND)); +#include "swift/Demangling/StandardTypesMangling.def" + +// Defined in Swift, redeclared here so we can register it with the runtime. +extern "C" SWIFT_CC(swift) +bool _swift_task_isCurrentGlobalActor( + const swift::Metadata *, const swift::WitnessTable *); + +// Register our type descriptors with standard manglings when the concurrency +// runtime is loaded. This allows the runtime to quickly resolve those standard +// manglings. +SWIFT_ALLOWED_RUNTIME_GLOBAL_CTOR_BEGIN +__attribute__((constructor)) static void setupStandardConcurrencyDescriptors() { + static const swift::ConcurrencyStandardTypeDescriptors descriptors = { +#define STANDARD_TYPE(KIND, MANGLING, TYPENAME) +#define STANDARD_TYPE_CONCURRENCY(KIND, MANGLING, TYPENAME) \ + &DESCRIPTOR_MANGLING(MANGLING, DESCRIPTOR_MANGLING_SUFFIX(KIND)), +#include "swift/Demangling/StandardTypesMangling.def" + }; + _swift_registerConcurrencyRuntime( + &descriptors, + &_swift_task_isCurrentGlobalActor); +} +SWIFT_ALLOWED_RUNTIME_GLOBAL_CTOR_END + +#endif + +// ==== Back-deploy hooks ------------------------------------------------------- + #define OVERRIDE_TASK COMPATIBILITY_OVERRIDE #ifdef SWIFT_STDLIB_SUPPORT_BACK_DEPLOYMENT diff --git a/test/Concurrency/Runtime/isolated_conformance.swift b/test/Concurrency/Runtime/isolated_conformance.swift index bc795e22e592d..a4b0d486cc0a3 100644 --- a/test/Concurrency/Runtime/isolated_conformance.swift +++ b/test/Concurrency/Runtime/isolated_conformance.swift @@ -5,12 +5,6 @@ // REQUIRES: concurrency_runtime // UNSUPPORTED: back_deployment_runtime -// FIXME: WebAssembly doesn't currently have a good way to install the -// "isCurrentGlobalActor" hook on which this checking depends. Disable -// the test for the moment. -// UNSUPPORTED: wasm -// UNSUPPORTED: CPU=wasm32 - protocol P { func f() } @@ -206,8 +200,10 @@ await Task.detached { @SomeGlobalActor in // CHECK: Testing a separate task off the main actor print("Testing a separate task off the main actor") +#if !os(WASI) await Task.detached { if #available(SwiftStdlib 6.2, *) { + precondition(!tryCastToP(mc)) precondition(!tryCastToP(wrappedMC)) @@ -220,6 +216,7 @@ await Task.detached { print("Cast succeeds, but shouldn't") } }.value +#endif // Ensure that we access mc later