Skip to content

Commit 3ea940e

Browse files
authored
Merge pull request #77730 from nickolas-pohilets/mpokhylets/isolated-deinit-version
2 parents 3f5a6f3 + 733cb7e commit 3ea940e

28 files changed

+128
-107
lines changed

include/swift/ABI/MetadataValues.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,6 +1704,9 @@ namespace SpecialPointerAuthDiscriminators {
17041704
const uint16_t RelativeProtocolWitnessTable = 0xb830; // = 47152
17051705

17061706
const uint16_t TypeLayoutString = 0x8b65; // = 35685
1707+
1708+
/// Isolated deinit body function pointer
1709+
const uint16_t DeinitWorkFunction = 0x8438; // = 33848
17071710
}
17081711

17091712
/// The number of arguments that will be passed directly to a generic

include/swift/AST/DiagnosticsSIL.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,11 @@ NOTE(box_to_stack_cannot_promote_box_to_stack_due_to_escape_location, none,
790790

791791
WARNING(semantic_function_improper_nesting, none, "'@_semantics' function calls non-'@_semantics' function with nested '@_semantics' calls", ())
792792

793+
// SDK mismatch diagnostics
794+
ERROR(missing_deinit_on_executor_function, none,
795+
"Missing 'swift_task_deinitOnExecutor' function! "
796+
"This is likely due to an outdated/incompatible SDK.", ())
797+
793798
// Capture promotion diagnostics
794799
WARNING(capturepromotion_concurrentcapture_mutation, none,
795800
"'%0' mutated after capture by sendable closure", (StringRef))

include/swift/AST/DiagnosticsSema.def

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5969,9 +5969,9 @@ ERROR(isolated_deinit_no_isolation,none,
59695969
ERROR(isolated_deinit_on_value_type,none,
59705970
"only classes and actors can have isolated deinit",
59715971
())
5972-
ERROR(isolated_deinit_experimental,none,
5973-
"'isolated' deinit requires frontend flag -enable-experimental-feature IsolatedDeinit "
5974-
"to enable the usage of this language feature", ())
5972+
ERROR(isolated_deinit_unavailable,none,
5973+
"isolated deinit is only available in %0 %1 or newer",
5974+
(StringRef, llvm::VersionTuple))
59755975

59765976
//------------------------------------------------------------------------------
59775977
// MARK: String Processing

include/swift/AST/FeatureAvailability.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ FEATURE(InitRawStructMetadata, (6, 0))
7676

7777
FEATURE(LayoutStringValueWitnesses, (6, 1))
7878
FEATURE(CreateTaskWithConsumedFunction, (6, 1))
79+
FEATURE(IsolatedDeinit, (6, 1))
7980

8081
FEATURE(TaskExecutor, FUTURE)
8182
FEATURE(Differentiation, FUTURE)

include/swift/Basic/Features.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ EXPERIMENTAL_FEATURE(SafeInteropWrappers, false)
414414
EXPERIMENTAL_FEATURE(AssumeResilientCxxTypes, true)
415415

416416
// Isolated deinit
417-
SUPPRESSIBLE_EXPERIMENTAL_FEATURE(IsolatedDeinit, true)
417+
SUPPRESSIBLE_LANGUAGE_FEATURE(IsolatedDeinit, 371, "isolated deinit")
418418

419419
// Enable values in generic signatures, e.g. <let N: Int>
420420
EXPERIMENTAL_FEATURE(ValueGenerics, true)

include/swift/Runtime/Config.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,9 @@ extern uintptr_t __COMPATIBILITY_LIBRARIES_CANNOT_CHECK_THE_IS_SWIFT_BIT_DIRECTL
324324
#define __ptrauth_swift_type_layout_string \
325325
__ptrauth(ptrauth_key_process_independent_data, 1, \
326326
SpecialPointerAuthDiscriminators::TypeLayoutString)
327+
#define __ptrauth_swift_deinit_work_function \
328+
__ptrauth(ptrauth_key_function_pointer, 1, \
329+
SpecialPointerAuthDiscriminators::DeinitWorkFunction)
327330

328331
#if __has_attribute(ptrauth_struct)
329332
#define swift_ptrauth_struct(key, discriminator) \
@@ -364,6 +367,7 @@ extern uintptr_t __COMPATIBILITY_LIBRARIES_CANNOT_CHECK_THE_IS_SWIFT_BIT_DIRECTL
364367
#define swift_ptrauth_sign_opaque_read_resume_function(__fn, __buffer) (__fn)
365368
#define swift_ptrauth_sign_opaque_modify_resume_function(__fn, __buffer) (__fn)
366369
#define __ptrauth_swift_type_layout_string
370+
#define __ptrauth_swift_deinit_work_function
367371
#define swift_ptrauth_struct(key, discriminator)
368372
#define swift_ptrauth_struct_derived(from)
369373
#endif
@@ -542,6 +546,17 @@ swift_auth_code(T value, unsigned extra) {
542546
#endif
543547
}
544548

549+
template <typename T>
550+
SWIFT_RUNTIME_ATTRIBUTE_ALWAYS_INLINE static inline T
551+
swift_auth_code_function(T value, unsigned extra) {
552+
#if SWIFT_PTRAUTH
553+
return (T)ptrauth_auth_function((void *)value,
554+
ptrauth_key_function_pointer, extra);
555+
#else
556+
return value;
557+
#endif
558+
}
559+
545560
/// Does this platform support backtrace-on-crash?
546561
#ifdef __APPLE__
547562
# include <TargetConditionals.h>

lib/SILGen/SILGenDestructor.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "SwitchEnumBuilder.h"
1818
#include "swift/AST/ConformanceLookup.h"
1919
#include "swift/AST/Decl.h"
20+
#include "swift/AST/DiagnosticsSIL.h"
2021
#include "swift/AST/GenericSignature.h"
2122
#include "swift/AST/SubstitutionMap.h"
2223
#include "swift/Basic/Assertions.h"
@@ -373,8 +374,10 @@ void SILGenFunction::emitIsolatingDestructor(DestructorDecl *dd) {
373374

374375
// Get deinitOnExecutor
375376
FuncDecl *swiftDeinitOnExecutorDecl = SGM.getDeinitOnExecutor();
376-
assert(swiftDeinitOnExecutorDecl &&
377-
"Failed to find swift_task_deinitOnExecutor function decl");
377+
if (!swiftDeinitOnExecutorDecl) {
378+
dd->diagnose(diag::missing_deinit_on_executor_function);
379+
return;
380+
}
378381
SILFunction *swiftDeinitOnExecutorSILFunc = SGM.getFunction(
379382
SILDeclRef(swiftDeinitOnExecutorDecl, SILDeclRef::Kind::Func),
380383
NotForDefinition);

lib/Sema/TypeCheckAttr.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,20 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
115115
auto &C = D->getASTContext();
116116

117117
if (isa<DestructorDecl>(D)) {
118-
if (!C.LangOpts.hasFeature(Feature::IsolatedDeinit)) {
119-
diagnoseAndRemoveAttr(attr, diag::isolated_deinit_experimental);
120-
return;
121-
}
122-
123118
if (auto nominal = dyn_cast<NominalTypeDecl>(D->getDeclContext())) {
124119
if (!isa<ClassDecl>(nominal)) {
125120
// only classes and actors can have isolated deinit.
126121
diagnoseAndRemoveAttr(attr, diag::isolated_deinit_on_value_type);
127122
return;
128123
}
129124
}
125+
126+
TypeChecker::checkAvailability(
127+
attr->getRange(), C.getIsolatedDeinitAvailability(),
128+
D->getDeclContext(),
129+
[&](StringRef platformName, llvm::VersionTuple version) {
130+
return diagnoseAndRemoveAttr(attr, diag::isolated_deinit_unavailable, platformName, version);
131+
});
130132
}
131133
}
132134

stdlib/public/Concurrency/Actor.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "swift/Runtime/Concurrency.h"
1919
#include <atomic>
2020
#include <new>
21+
#include <ptrauth.h>
2122

2223
#include "../CompatibilityOverride/CompatibilityOverride.h"
2324
#include "swift/ABI/Actor.h"
@@ -2322,11 +2323,11 @@ namespace {
23222323
class IsolatedDeinitJob : public Job {
23232324
private:
23242325
void *Object;
2325-
DeinitWorkFunction *Work;
2326+
DeinitWorkFunction *__ptrauth_swift_deinit_work_function Work;
23262327

23272328
public:
23282329
IsolatedDeinitJob(JobPriority priority, void *object,
2329-
DeinitWorkFunction *work)
2330+
DeinitWorkFunction * work)
23302331
: Job({JobKind::IsolatedDeinit, priority}, &process), Object(object),
23312332
Work(work) {}
23322333

@@ -2351,6 +2352,9 @@ static void swift_task_deinitOnExecutorImpl(void *object,
23512352
DeinitWorkFunction *work,
23522353
SerialExecutorRef newExecutor,
23532354
size_t rawFlags) {
2355+
// Sign the function pointer
2356+
work = swift_auth_code_function(
2357+
work, SpecialPointerAuthDiscriminators::DeinitWorkFunction);
23542358
// If the current executor is compatible with running the new executor,
23552359
// we can just immediately continue running with the resume function
23562360
// we were passed in.

stdlib/public/Concurrency/Executor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@ internal final class DispatchQueueShim: @unchecked Sendable, SerialExecutor {
541541
#endif // SWIFT_CONCURRENCY_USES_DISPATCH
542542

543543

544-
@available(SwiftStdlib 5.6, *) // TODO: Clarify version
544+
@available(SwiftStdlib 6.1, *)
545545
@_silgen_name("swift_task_deinitOnExecutor")
546546
@usableFromInline
547547
internal func _deinitOnExecutor(_ object: __owned AnyObject,

0 commit comments

Comments
 (0)