Skip to content

Commit 236237f

Browse files
authored
Merge pull request #32471 from nate-chandler/runtime/add-swift_compareProtocolConformanceDescriptors
2 parents 79c38b2 + 6d0c34c commit 236237f

File tree

7 files changed

+62
-0
lines changed

7 files changed

+62
-0
lines changed

include/swift/AST/ASTContext.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,11 @@ class ASTContext final {
653653
/// for the target platform.
654654
AvailabilityContext getCompareTypeContextDescriptorsAvailability();
655655

656+
/// Get the runtime availability of the
657+
/// swift_compareProtocolConformanceDescriptors entry point for the target
658+
/// platform.
659+
AvailabilityContext getCompareProtocolConformanceDescriptorsAvailability();
660+
656661
/// Get the runtime availability of features introduced in the Swift 5.2
657662
/// compiler for the target platform.
658663
AvailabilityContext getSwift52Availability();

include/swift/Runtime/Metadata.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,21 @@ const WitnessTable *swift_getAssociatedConformanceWitness(
423423
const ProtocolRequirement *reqBase,
424424
const ProtocolRequirement *assocConformance);
425425

426+
/// Determine whether two protocol conformance descriptors describe the same
427+
/// conformance of a type to a protocol.
428+
///
429+
/// Runtime availability: Swift 5.4
430+
///
431+
/// \param lhs The first protocol conformance descriptor to compare.
432+
/// \param rhs The second protocol conformance descriptor to compare.
433+
///
434+
/// \returns true if both describe the same conformance, false otherwise.
435+
SWIFT_RUNTIME_EXPORT
436+
SWIFT_CC(swift)
437+
bool swift_compareProtocolConformanceDescriptors(
438+
const ProtocolConformanceDescriptor *lhs,
439+
const ProtocolConformanceDescriptor *rhs);
440+
426441
/// Fetch a uniqued metadata for a function type.
427442
SWIFT_RUNTIME_EXPORT
428443
const FunctionTypeMetadata *

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,18 @@ FUNCTION(GetAssociatedConformanceWitness,
735735
ProtocolRequirementStructTy->getPointerTo()),
736736
ATTRS(NoUnwind, ReadNone))
737737

738+
// SWIFT_RUNTIME_EXPORT
739+
// SWIFT_CC(swift) bool swift_compareProtocolConformanceDescriptors(
740+
// const ProtocolConformanceDescriptor *lhs,
741+
// const ProtocolConformanceDescriptor *rhs);
742+
FUNCTION(CompareProtocolConformanceDescriptors,
743+
swift_compareProtocolConformanceDescriptors, SwiftCC,
744+
CompareProtocolConformanceDescriptorsAvailability,
745+
RETURNS(Int1Ty),
746+
ARGS(ProtocolConformanceDescriptorPtrTy,
747+
ProtocolConformanceDescriptorPtrTy),
748+
ATTRS(NoUnwind, ReadNone))
749+
738750
// Metadata *swift_getMetatypeMetadata(Metadata *instanceTy);
739751
FUNCTION(GetMetatypeMetadata, swift_getMetatypeMetadata, C_CC, AlwaysAvailable,
740752
RETURNS(TypeMetadataPtrTy),

lib/AST/Availability.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ AvailabilityContext ASTContext::getCompareTypeContextDescriptorsAvailability() {
299299
return getSwiftFutureAvailability();
300300
}
301301

302+
AvailabilityContext
303+
ASTContext::getCompareProtocolConformanceDescriptorsAvailability() {
304+
return getSwiftFutureAvailability();
305+
}
306+
302307
AvailabilityContext ASTContext::getSwift52Availability() {
303308
auto target = LangOpts.Target;
304309

lib/IRGen/IRGenModule.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,16 @@ namespace RuntimeConstants {
660660
}
661661
return RuntimeAvailability::AlwaysAvailable;
662662
}
663+
664+
RuntimeAvailability
665+
CompareProtocolConformanceDescriptorsAvailability(ASTContext &Context) {
666+
auto featureAvailability =
667+
Context.getCompareProtocolConformanceDescriptorsAvailability();
668+
if (!isDeploymentAvailabilityContainedIn(Context, featureAvailability)) {
669+
return RuntimeAvailability::ConditionallyAvailable;
670+
}
671+
return RuntimeAvailability::AlwaysAvailable;
672+
}
663673
} // namespace RuntimeConstants
664674

665675
// We don't use enough attributes to justify generalizing the

stdlib/public/runtime/Metadata.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4993,6 +4993,12 @@ const WitnessTable *swift::swift_getAssociatedConformanceWitness(
49934993
assocConformance);
49944994
}
49954995

4996+
bool swift::swift_compareProtocolConformanceDescriptors(
4997+
const ProtocolConformanceDescriptor *lhs,
4998+
const ProtocolConformanceDescriptor *rhs) {
4999+
return MetadataCacheKey::compareProtocolConformanceDescriptors(lhs, rhs) == 0;
5000+
}
5001+
49965002
/***************************************************************************/
49975003
/*** Recursive metadata dependencies ***************************************/
49985004
/***************************************************************************/

stdlib/public/runtime/MetadataCache.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,14 @@ class MetadataCacheKey {
386386

387387
auto *aDescription = awt->getDescription();
388388
auto *bDescription = bwt->getDescription();
389+
return compareProtocolConformanceDescriptors(aDescription, bDescription);
390+
}
391+
392+
public:
393+
/// Compare two conformance descriptors, checking their contents if necessary.
394+
static int compareProtocolConformanceDescriptors(
395+
const ProtocolConformanceDescriptor *aDescription,
396+
const ProtocolConformanceDescriptor *bDescription) {
389397
if (aDescription == bDescription)
390398
return 0;
391399

@@ -405,6 +413,7 @@ class MetadataCacheKey {
405413
bDescription->getProtocol());
406414
}
407415

416+
private:
408417
/// Compare the content from two keys.
409418
static int compareContent(const void * const *adata,
410419
const void * const *bdata,

0 commit comments

Comments
 (0)