@@ -654,6 +654,54 @@ using TargetRelativeProtocolRequirementPointer =
654654using RelativeProtocolRequirementPointer =
655655 TargetRelativeProtocolRequirementPointer<InProcess>;
656656
657+ // / An entry in the default override table, consisting of one of our methods
658+ // / `replacement` together with (1) another of our methods `original` which
659+ // / might have been overridden by a subclass and (2) an implementation of
660+ // / `replacement` to be used by such a subclass if it does not provide its own
661+ // / implementation.
662+ template <typename Runtime>
663+ struct TargetMethodDefaultOverrideDescriptor {
664+ // / The method which replaced the original at call-sites.
665+ TargetRelativeMethodDescriptorPointer<Runtime> Replacement;
666+
667+ // / The method originally called at such call sites.
668+ TargetRelativeMethodDescriptorPointer<Runtime> Original;
669+
670+ union {
671+ TargetCompactFunctionPointer<Runtime, void , /* nullable*/ true > Impl;
672+ TargetRelativeDirectPointer<Runtime, void , /* nullable*/ true > AsyncImpl;
673+ TargetRelativeDirectPointer<Runtime, void , /* nullable*/ true > CoroImpl;
674+ };
675+
676+ bool isData () const {
677+ auto *replacement = Replacement.get ();
678+ assert (replacement && " no replacement" );
679+ return replacement->Flags .isData ();
680+ }
681+
682+ void *getImpl () const {
683+ auto *replacement = Replacement.get ();
684+ assert (replacement && " no replacement" );
685+ if (replacement->Flags .isAsync ()) {
686+ return AsyncImpl.get ();
687+ } else if (replacement->Flags .isCalleeAllocatedCoroutine ()) {
688+ return CoroImpl.get ();
689+ } else {
690+ return Impl.get ();
691+ }
692+ }
693+ };
694+
695+ // / Header for a table of default override descriptors. Such a table is a
696+ // / variable-sized structure whose length is stored in this header which is
697+ // / followed by that many TargetMethodDefaultOverrideDescriptors.
698+ template <typename Runtime>
699+ struct TargetMethodDefaultOverrideTableHeader {
700+ // / The number of TargetMethodDefaultOverrideDescriptor records following this
701+ // / header in the class's nominal type descriptor.
702+ uint32_t NumEntries;
703+ };
704+
657705// / An entry in the method override table, referencing a method from one of our
658706// / ancestor classes, together with an implementation.
659707template <typename Runtime>
@@ -4205,9 +4253,11 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
42054253 TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
42064254 TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
42074255 InvertibleProtocolSet,
4208- TargetSingletonMetadataPointer<Runtime>> {
4256+ TargetSingletonMetadataPointer<Runtime>,
4257+ TargetMethodDefaultOverrideTableHeader<Runtime>,
4258+ TargetMethodDefaultOverrideDescriptor<Runtime>> {
42094259private:
4210- using TrailingGenericContextObjects =
4260+ using TrailingGenericContextObjects =
42114261 swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
42124262 TargetTypeGenericContextDescriptorHeader,
42134263 TargetResilientSuperclass<Runtime>,
@@ -4223,7 +4273,9 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
42234273 TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
42244274 TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
42254275 InvertibleProtocolSet,
4226- TargetSingletonMetadataPointer<Runtime>>;
4276+ TargetSingletonMetadataPointer<Runtime>,
4277+ TargetMethodDefaultOverrideTableHeader<Runtime>,
4278+ TargetMethodDefaultOverrideDescriptor<Runtime>>;
42274279
42284280 using TrailingObjects =
42294281 typename TrailingGenericContextObjects::TrailingObjects;
@@ -4254,6 +4306,10 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
42544306 using MetadataCachingOnceToken =
42554307 TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
42564308 using SingletonMetadataPointer = TargetSingletonMetadataPointer<Runtime>;
4309+ using DefaultOverrideTableHeader =
4310+ TargetMethodDefaultOverrideTableHeader<Runtime>;
4311+ using DefaultOverrideDescriptor =
4312+ TargetMethodDefaultOverrideDescriptor<Runtime>;
42574313
42584314 using StoredPointer = typename Runtime::StoredPointer;
42594315 using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4399,6 +4455,16 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
43994455 return this ->hasSingletonMetadataPointer () ? 1 : 0 ;
44004456 }
44014457
4458+ size_t numTrailingObjects (OverloadToken<DefaultOverrideTableHeader>) const {
4459+ return hasDefaultOverrideTable () ? 1 : 0 ;
4460+ }
4461+
4462+ size_t numTrailingObjects (OverloadToken<DefaultOverrideDescriptor>) const {
4463+ if (!hasDefaultOverrideTable ())
4464+ return 0 ;
4465+ return getDefaultOverrideTable ()->NumEntries ;
4466+ }
4467+
44024468public:
44034469 const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
44044470 getResilientSuperclass () const {
@@ -4430,6 +4496,10 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
44304496 return FieldOffsetVectorOffset;
44314497 }
44324498
4499+ bool hasDefaultOverrideTable () const {
4500+ return getTypeContextDescriptorFlags ().class_hasDefaultOverrideTable ();
4501+ }
4502+
44334503 bool isActor () const {
44344504 return this ->getTypeContextDescriptorFlags ().class_isActor ();
44354505 }
@@ -4476,6 +4546,20 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
44764546 numTrailingObjects (OverloadToken<MethodOverrideDescriptor>{})};
44774547 }
44784548
4549+ const DefaultOverrideTableHeader *getDefaultOverrideTable () const {
4550+ if (!hasDefaultOverrideTable ())
4551+ return nullptr ;
4552+ return this ->template getTrailingObjects <DefaultOverrideTableHeader>();
4553+ }
4554+
4555+ llvm::ArrayRef<DefaultOverrideDescriptor> getDefaultOverrideDescriptors ()
4556+ const {
4557+ if (!hasDefaultOverrideTable ())
4558+ return {};
4559+ return {this ->template getTrailingObjects <DefaultOverrideDescriptor>(),
4560+ numTrailingObjects (OverloadToken<DefaultOverrideDescriptor>{})};
4561+ }
4562+
44794563 // / Return the bounds of this class's metadata.
44804564 TargetClassMetadataBounds<Runtime> getMetadataBounds () const {
44814565 if (!hasResilientSuperclass ())
0 commit comments