Skip to content

[6.2][Concurrency] Fix runtime isolated-conformance checks with static stdlib #83120

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion Runtimes/Core/Concurrency/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ add_library(swift_Concurrency
ExecutorImpl.cpp
ExecutorChecks.cpp
GlobalExecutor.cpp
Setup.cpp
Task.cpp
TaskAlloc.cpp
TaskGroup.cpp
Expand Down
1 change: 0 additions & 1 deletion stdlib/public/Concurrency/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ set(SWIFT_RUNTIME_CONCURRENCY_C_SOURCES
Error.cpp
ExecutorBridge.cpp
ExecutorChecks.cpp
Setup.cpp
Task.cpp
TaskAlloc.cpp
TaskStatus.cpp
Expand Down
56 changes: 0 additions & 56 deletions stdlib/public/Concurrency/Setup.cpp

This file was deleted.

54 changes: 54 additions & 0 deletions stdlib/public/Concurrency/Task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 3 additions & 6 deletions test/Concurrency/Runtime/isolated_conformance.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Expand Down Expand Up @@ -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))

Expand All @@ -220,6 +216,7 @@ await Task.detached {
print("Cast succeeds, but shouldn't")
}
}.value
#endif


// Ensure that we access mc later
Expand Down