From 04ebd1614a678c7b69d19bb9338b95ac65bff65f Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 27 Oct 2023 11:27:23 -0400 Subject: [PATCH] IRGen: Weak-link references to swift_getExtendedExistentialTypeMetadata() Fixes rdar://117530421. --- include/swift/Runtime/RuntimeFunctions.def | 9 ++++++--- lib/IRGen/IRGenModule.cpp | 8 ++++++++ test/IRGen/extended_existential_metadata_weak.swift | 13 +++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 test/IRGen/extended_existential_metadata_weak.swift diff --git a/include/swift/Runtime/RuntimeFunctions.def b/include/swift/Runtime/RuntimeFunctions.def index 935ee732c634d..2a65412b1a6d8 100644 --- a/include/swift/Runtime/RuntimeFunctions.def +++ b/include/swift/Runtime/RuntimeFunctions.def @@ -1177,7 +1177,8 @@ FUNCTION(GetExistentialMetadata, // swift_getExtendedExistentialTypeShape( // const NonUniqueExtendedExistentialTypeShape *nonUnique); FUNCTION(GetExtendedExistentialTypeShape, - swift_getExtendedExistentialTypeShape, C_CC, AlwaysAvailable, + swift_getExtendedExistentialTypeShape, C_CC, + ParameterizedExistentialAvailability, RETURNS(TypeMetadataPtrTy), ARGS(Int8PtrTy, Int8PtrPtrTy), ATTRS(NoUnwind, ArgMemOnly, WillReturn), @@ -1187,7 +1188,8 @@ FUNCTION(GetExtendedExistentialTypeShape, // const NonUniqueExtendedExistentialTypeShape *shape, // const void * const *generalizationArgs); FUNCTION(GetExtendedExistentialTypeMetadata, - swift_getExtendedExistentialTypeMetadata, C_CC, AlwaysAvailable, + swift_getExtendedExistentialTypeMetadata, C_CC, + ParameterizedExistentialAvailability, RETURNS(TypeMetadataPtrTy), ARGS(Int8PtrTy, Int8PtrPtrTy), ATTRS(NoUnwind, ArgMemOnly, WillReturn), @@ -1197,7 +1199,8 @@ FUNCTION(GetExtendedExistentialTypeMetadata, // const ExtendedExistentialTypeShape *shape, // const void * const *generalizationArgs); FUNCTION(GetExtendedExistentialTypeMetadataUnique, - swift_getExtendedExistentialTypeMetadata_unique, C_CC, AlwaysAvailable, + swift_getExtendedExistentialTypeMetadata_unique, C_CC, + ParameterizedExistentialAvailability, RETURNS(TypeMetadataPtrTy), ARGS(Int8PtrTy, Int8PtrPtrTy), ATTRS(NoUnwind, ArgMemOnly, WillReturn), diff --git a/lib/IRGen/IRGenModule.cpp b/lib/IRGen/IRGenModule.cpp index 8cc535b5ec6fe..45d8910bf6974 100644 --- a/lib/IRGen/IRGenModule.cpp +++ b/lib/IRGen/IRGenModule.cpp @@ -924,6 +924,14 @@ namespace RuntimeConstants { return RuntimeAvailability::ConditionallyAvailable; } + RuntimeAvailability ParameterizedExistentialAvailability(ASTContext &Context) { + auto featureAvailability = Context.getParameterizedExistentialRuntimeAvailability(); + if (!isDeploymentAvailabilityContainedIn(Context, featureAvailability)) { + return RuntimeAvailability::ConditionallyAvailable; + } + return RuntimeAvailability::AlwaysAvailable; + } + } // namespace RuntimeConstants // We don't use enough attributes to justify generalizing the diff --git a/test/IRGen/extended_existential_metadata_weak.swift b/test/IRGen/extended_existential_metadata_weak.swift new file mode 100644 index 0000000000000..59633eea8b922 --- /dev/null +++ b/test/IRGen/extended_existential_metadata_weak.swift @@ -0,0 +1,13 @@ +// RUN: %target-swift-frontend -emit-ir %s -target %target-swift-abi-5.5-triple | %FileCheck %s +// REQUIRES: VENDOR=apple + +public protocol P { + associatedtype A +} + +public func f(_: T.Type) {} + +@available(SwiftStdlib 5.7, *) +public func g(_: T.Type) { f((any P).self) } + +// CHECK-LABEL: declare extern_weak {{.*}} @swift_getExtendedExistentialTypeMetadata(