@@ -3772,6 +3772,21 @@ struct TargetSingletonMetadataInitialization {
3772
3772
const TargetTypeContextDescriptor<Runtime> *description) const ;
3773
3773
};
3774
3774
3775
+ template <typename Runtime>
3776
+ struct TargetCanonicalSpecializedMetadatasListCount {
3777
+ uint32_t count;
3778
+ };
3779
+
3780
+ template <typename Runtime>
3781
+ struct TargetCanonicalSpecializedMetadatasListEntry {
3782
+ TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false > metadata;
3783
+ };
3784
+
3785
+ template <typename Runtime>
3786
+ struct TargetCanonicalSpecializedMetadataAccessorsListEntry {
3787
+ TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false > accessor;
3788
+ };
3789
+
3775
3790
template <typename Runtime>
3776
3791
class TargetTypeContextDescriptor
3777
3792
: public TargetContextDescriptor<Runtime> {
@@ -3821,6 +3836,10 @@ class TargetTypeContextDescriptor
3821
3836
return getTypeContextDescriptorFlags ().hasForeignMetadataInitialization ();
3822
3837
}
3823
3838
3839
+ bool hasCanonicicalMetadataPrespecializations () const {
3840
+ return getTypeContextDescriptorFlags ().hasCanonicalMetadataPrespecializations ();
3841
+ }
3842
+
3824
3843
// / Given that this type has foreign metadata initialization, return the
3825
3844
// / control structure for it.
3826
3845
const TargetForeignMetadataInitialization<Runtime> &
@@ -3853,6 +3872,9 @@ class TargetTypeContextDescriptor
3853
3872
return words + offset;
3854
3873
}
3855
3874
3875
+ const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >>
3876
+ getCanonicicalMetadataPrespecializations () const ;
3877
+
3856
3878
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
3857
3879
return cd->getKind () >= ContextDescriptorKind::Type_First
3858
3880
&& cd->getKind () <= ContextDescriptorKind::Type_Last;
@@ -3990,7 +4012,10 @@ class TargetClassDescriptor final
3990
4012
TargetMethodDescriptor<Runtime>,
3991
4013
TargetOverrideTableHeader<Runtime>,
3992
4014
TargetMethodOverrideDescriptor<Runtime>,
3993
- TargetObjCResilientClassStubInfo<Runtime>> {
4015
+ TargetObjCResilientClassStubInfo<Runtime>,
4016
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4017
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4018
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>> {
3994
4019
private:
3995
4020
using TrailingGenericContextObjects =
3996
4021
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
@@ -4002,7 +4027,10 @@ class TargetClassDescriptor final
4002
4027
TargetMethodDescriptor<Runtime>,
4003
4028
TargetOverrideTableHeader<Runtime>,
4004
4029
TargetMethodOverrideDescriptor<Runtime>,
4005
- TargetObjCResilientClassStubInfo<Runtime>>;
4030
+ TargetObjCResilientClassStubInfo<Runtime>,
4031
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4032
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4033
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>>;
4006
4034
4007
4035
using TrailingObjects =
4008
4036
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4020,6 +4048,16 @@ class TargetClassDescriptor final
4020
4048
TargetSingletonMetadataInitialization<Runtime>;
4021
4049
using ObjCResilientClassStubInfo =
4022
4050
TargetObjCResilientClassStubInfo<Runtime>;
4051
+ using Metadata =
4052
+ TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >;
4053
+ using MetadataListCount =
4054
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4055
+ using MetadataListEntry =
4056
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4057
+ using MetadataAccessor =
4058
+ TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false >;
4059
+ using MetadataAccessorListEntry =
4060
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>;
4023
4061
4024
4062
using StoredPointer = typename Runtime::StoredPointer;
4025
4063
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4139,6 +4177,24 @@ class TargetClassDescriptor final
4139
4177
return hasObjCResilientClassStub () ? 1 : 0 ;
4140
4178
}
4141
4179
4180
+ size_t numTrailingObjects (OverloadToken<MetadataListCount>) const {
4181
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4182
+ 1
4183
+ : 0 ;
4184
+ }
4185
+
4186
+ size_t numTrailingObjects (OverloadToken<MetadataListEntry>) const {
4187
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4188
+ this ->template getTrailingObjects <MetadataListCount>()->count
4189
+ : 0 ;
4190
+ }
4191
+
4192
+ size_t numTrailingObjects (OverloadToken<MetadataAccessorListEntry>) const {
4193
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4194
+ this ->template getTrailingObjects <MetadataListCount>()->count
4195
+ : 0 ;
4196
+ }
4197
+
4142
4198
public:
4143
4199
const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
4144
4200
getResilientSuperclass () const {
@@ -4276,6 +4332,32 @@ class TargetClassDescriptor final
4276
4332
->Stub .get ();
4277
4333
}
4278
4334
4335
+ llvm::ArrayRef<Metadata> getCanonicicalMetadataPrespecializations () const {
4336
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4337
+ return {};
4338
+ }
4339
+
4340
+ auto *listCount = this ->template getTrailingObjects <MetadataListCount>();
4341
+ auto *list = this ->template getTrailingObjects <MetadataListEntry>();
4342
+ return llvm::ArrayRef<Metadata>(
4343
+ reinterpret_cast <const Metadata *>(list),
4344
+ listCount->count
4345
+ );
4346
+ }
4347
+
4348
+ llvm::ArrayRef<MetadataAccessor> getCanonicalMetadataPrespecializationAccessors () const {
4349
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4350
+ return {};
4351
+ }
4352
+
4353
+ auto *listCount = this ->template getTrailingObjects <MetadataListCount>();
4354
+ auto *list = this ->template getTrailingObjects <MetadataAccessorListEntry>();
4355
+ return llvm::ArrayRef<MetadataAccessor>(
4356
+ reinterpret_cast <const MetadataAccessor *>(list),
4357
+ listCount->count
4358
+ );
4359
+ }
4360
+
4279
4361
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4280
4362
return cd->getKind () == ContextDescriptorKind::Class;
4281
4363
}
@@ -4301,19 +4383,29 @@ class TargetStructDescriptor final
4301
4383
TargetTypeGenericContextDescriptorHeader,
4302
4384
/* additional trailing objects*/
4303
4385
TargetForeignMetadataInitialization<Runtime>,
4304
- TargetSingletonMetadataInitialization<Runtime>> {
4386
+ TargetSingletonMetadataInitialization<Runtime>,
4387
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4388
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4305
4389
public:
4306
4390
using ForeignMetadataInitialization =
4307
4391
TargetForeignMetadataInitialization<Runtime>;
4308
4392
using SingletonMetadataInitialization =
4309
4393
TargetSingletonMetadataInitialization<Runtime>;
4394
+ using Metadata =
4395
+ TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >;
4396
+ using MetadataListCount =
4397
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4398
+ using MetadataListEntry =
4399
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4310
4400
4311
4401
private:
4312
4402
using TrailingGenericContextObjects =
4313
4403
swift::TrailingGenericContextObjects<TargetStructDescriptor<Runtime>,
4314
4404
TargetTypeGenericContextDescriptorHeader,
4315
4405
ForeignMetadataInitialization,
4316
- SingletonMetadataInitialization>;
4406
+ SingletonMetadataInitialization,
4407
+ MetadataListCount,
4408
+ MetadataListEntry>;
4317
4409
4318
4410
using TrailingObjects =
4319
4411
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4331,6 +4423,18 @@ class TargetStructDescriptor final
4331
4423
return this ->hasSingletonMetadataInitialization () ? 1 : 0 ;
4332
4424
}
4333
4425
4426
+ size_t numTrailingObjects (OverloadToken<MetadataListCount>) const {
4427
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4428
+ 1
4429
+ : 0 ;
4430
+ }
4431
+
4432
+ size_t numTrailingObjects (OverloadToken<MetadataListEntry>) const {
4433
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4434
+ this ->template getTrailingObjects <MetadataListCount>()->count
4435
+ : 0 ;
4436
+ }
4437
+
4334
4438
public:
4335
4439
using TrailingGenericContextObjects::getGenericContext;
4336
4440
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4363,6 +4467,19 @@ class TargetStructDescriptor final
4363
4467
return TargetStructMetadata<Runtime>::getGenericArgumentOffset ();
4364
4468
}
4365
4469
4470
+ llvm::ArrayRef<Metadata> getCanonicicalMetadataPrespecializations () const {
4471
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4472
+ return {};
4473
+ }
4474
+
4475
+ auto *listCount = this ->template getTrailingObjects <MetadataListCount>();
4476
+ auto *list = this ->template getTrailingObjects <MetadataListEntry>();
4477
+ return llvm::ArrayRef<Metadata>(
4478
+ reinterpret_cast <const Metadata *>(list),
4479
+ listCount->count
4480
+ );
4481
+ }
4482
+
4366
4483
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4367
4484
return cd->getKind () == ContextDescriptorKind::Struct;
4368
4485
}
@@ -4377,19 +4494,29 @@ class TargetEnumDescriptor final
4377
4494
TargetTypeGenericContextDescriptorHeader,
4378
4495
/* additional trailing objects*/
4379
4496
TargetForeignMetadataInitialization<Runtime>,
4380
- TargetSingletonMetadataInitialization<Runtime>> {
4497
+ TargetSingletonMetadataInitialization<Runtime>,
4498
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4499
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4381
4500
public:
4382
4501
using SingletonMetadataInitialization =
4383
4502
TargetSingletonMetadataInitialization<Runtime>;
4384
4503
using ForeignMetadataInitialization =
4385
4504
TargetForeignMetadataInitialization<Runtime>;
4505
+ using Metadata =
4506
+ TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >;
4507
+ using MetadataListCount =
4508
+ TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4509
+ using MetadataListEntry =
4510
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4386
4511
4387
4512
private:
4388
4513
using TrailingGenericContextObjects =
4389
4514
swift::TrailingGenericContextObjects<TargetEnumDescriptor<Runtime>,
4390
4515
TargetTypeGenericContextDescriptorHeader,
4391
4516
ForeignMetadataInitialization,
4392
- SingletonMetadataInitialization>;
4517
+ SingletonMetadataInitialization,
4518
+ MetadataListCount,
4519
+ MetadataListEntry>;
4393
4520
4394
4521
using TrailingObjects =
4395
4522
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4407,6 +4534,18 @@ class TargetEnumDescriptor final
4407
4534
return this ->hasSingletonMetadataInitialization () ? 1 : 0 ;
4408
4535
}
4409
4536
4537
+ size_t numTrailingObjects (OverloadToken<MetadataListCount>) const {
4538
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4539
+ 1
4540
+ : 0 ;
4541
+ }
4542
+
4543
+ size_t numTrailingObjects (OverloadToken<MetadataListEntry>) const {
4544
+ return this ->hasCanonicicalMetadataPrespecializations () ?
4545
+ this ->template getTrailingObjects <MetadataListCount>()->count
4546
+ : 0 ;
4547
+ }
4548
+
4410
4549
public:
4411
4550
using TrailingGenericContextObjects::getGenericContext;
4412
4551
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4453,6 +4592,19 @@ class TargetEnumDescriptor final
4453
4592
return *this ->template getTrailingObjects <SingletonMetadataInitialization>();
4454
4593
}
4455
4594
4595
+ llvm::ArrayRef<Metadata> getCanonicicalMetadataPrespecializations () const {
4596
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4597
+ return {};
4598
+ }
4599
+
4600
+ auto *listCount = this ->template getTrailingObjects <MetadataListCount>();
4601
+ auto *list = this ->template getTrailingObjects <MetadataListEntry>();
4602
+ return llvm::ArrayRef<Metadata>(
4603
+ reinterpret_cast <const Metadata *>(list),
4604
+ listCount->count
4605
+ );
4606
+ }
4607
+
4456
4608
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4457
4609
return cd->getKind () == ContextDescriptorKind::Enum;
4458
4610
}
@@ -4587,6 +4739,24 @@ TargetTypeContextDescriptor<Runtime>::getSingletonMetadataInitialization() const
4587
4739
}
4588
4740
}
4589
4741
4742
+ template <typename Runtime>
4743
+ inline const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >>
4744
+ TargetTypeContextDescriptor<Runtime>::getCanonicicalMetadataPrespecializations() const {
4745
+ switch (this ->getKind ()) {
4746
+ case ContextDescriptorKind::Enum:
4747
+ return llvm::cast<TargetEnumDescriptor<Runtime>>(this )
4748
+ ->getCanonicicalMetadataPrespecializations ();
4749
+ case ContextDescriptorKind::Struct:
4750
+ return llvm::cast<TargetStructDescriptor<Runtime>>(this )
4751
+ ->getCanonicicalMetadataPrespecializations ();
4752
+ case ContextDescriptorKind::Class:
4753
+ return llvm::cast<TargetClassDescriptor<Runtime>>(this )
4754
+ ->getCanonicicalMetadataPrespecializations ();
4755
+ default :
4756
+ swift_runtime_unreachable (" Not a type context descriptor." );
4757
+ }
4758
+ }
4759
+
4590
4760
// / An entry in the chain of dynamic replacement functions.
4591
4761
struct DynamicReplacementChainEntry {
4592
4762
void *implementationFunction;
0 commit comments