@@ -654,6 +654,54 @@ using TargetRelativeProtocolRequirementPointer =
654
654
using RelativeProtocolRequirementPointer =
655
655
TargetRelativeProtocolRequirementPointer<InProcess>;
656
656
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
+
657
705
// / An entry in the method override table, referencing a method from one of our
658
706
// / ancestor classes, together with an implementation.
659
707
template <typename Runtime>
@@ -4205,9 +4253,11 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4205
4253
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4206
4254
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
4207
4255
InvertibleProtocolSet,
4208
- TargetSingletonMetadataPointer<Runtime>> {
4256
+ TargetSingletonMetadataPointer<Runtime>,
4257
+ TargetMethodDefaultOverrideTableHeader<Runtime>,
4258
+ TargetMethodDefaultOverrideDescriptor<Runtime>> {
4209
4259
private:
4210
- using TrailingGenericContextObjects =
4260
+ using TrailingGenericContextObjects =
4211
4261
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
4212
4262
TargetTypeGenericContextDescriptorHeader,
4213
4263
TargetResilientSuperclass<Runtime>,
@@ -4223,7 +4273,9 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4223
4273
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4224
4274
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
4225
4275
InvertibleProtocolSet,
4226
- TargetSingletonMetadataPointer<Runtime>>;
4276
+ TargetSingletonMetadataPointer<Runtime>,
4277
+ TargetMethodDefaultOverrideTableHeader<Runtime>,
4278
+ TargetMethodDefaultOverrideDescriptor<Runtime>>;
4227
4279
4228
4280
using TrailingObjects =
4229
4281
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4254,6 +4306,10 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4254
4306
using MetadataCachingOnceToken =
4255
4307
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4256
4308
using SingletonMetadataPointer = TargetSingletonMetadataPointer<Runtime>;
4309
+ using DefaultOverrideTableHeader =
4310
+ TargetMethodDefaultOverrideTableHeader<Runtime>;
4311
+ using DefaultOverrideDescriptor =
4312
+ TargetMethodDefaultOverrideDescriptor<Runtime>;
4257
4313
4258
4314
using StoredPointer = typename Runtime::StoredPointer;
4259
4315
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4399,6 +4455,16 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4399
4455
return this ->hasSingletonMetadataPointer () ? 1 : 0 ;
4400
4456
}
4401
4457
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
+
4402
4468
public:
4403
4469
const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
4404
4470
getResilientSuperclass () const {
@@ -4430,6 +4496,10 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4430
4496
return FieldOffsetVectorOffset;
4431
4497
}
4432
4498
4499
+ bool hasDefaultOverrideTable () const {
4500
+ return getTypeContextDescriptorFlags ().class_hasDefaultOverrideTable ();
4501
+ }
4502
+
4433
4503
bool isActor () const {
4434
4504
return this ->getTypeContextDescriptorFlags ().class_isActor ();
4435
4505
}
@@ -4476,6 +4546,20 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
4476
4546
numTrailingObjects (OverloadToken<MethodOverrideDescriptor>{})};
4477
4547
}
4478
4548
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
+
4479
4563
// / Return the bounds of this class's metadata.
4480
4564
TargetClassMetadataBounds<Runtime> getMetadataBounds () const {
4481
4565
if (!hasResilientSuperclass ())
0 commit comments