30
30
#include " llvm/ADT/ArrayRef.h"
31
31
#include " swift/Strings.h"
32
32
#include " swift/Runtime/Config.h"
33
+ #include " swift/Runtime/Once.h"
33
34
#include " swift/ABI/MetadataValues.h"
34
35
#include " swift/ABI/System.h"
35
36
#include " swift/ABI/TrailingObjects.h"
@@ -3787,6 +3788,11 @@ struct TargetCanonicalSpecializedMetadataAccessorsListEntry {
3787
3788
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false > accessor;
3788
3789
};
3789
3790
3791
+ template <typename Runtime>
3792
+ struct TargetCanonicalSpecializedMetadatasCachingOnceToken {
3793
+ TargetRelativeDirectPointer<Runtime, swift_once_t , /* Nullable*/ false > token;
3794
+ };
3795
+
3790
3796
template <typename Runtime>
3791
3797
class TargetTypeContextDescriptor
3792
3798
: public TargetContextDescriptor<Runtime> {
@@ -3873,7 +3879,9 @@ class TargetTypeContextDescriptor
3873
3879
}
3874
3880
3875
3881
const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >>
3876
- getCanonicicalMetadataPrespecializations () const ;
3882
+ getCanonicicalMetadataPrespecializations () const ;
3883
+
3884
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const ;
3877
3885
3878
3886
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
3879
3887
return cd->getKind () >= ContextDescriptorKind::Type_First
@@ -4015,7 +4023,8 @@ class TargetClassDescriptor final
4015
4023
TargetObjCResilientClassStubInfo<Runtime>,
4016
4024
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4017
4025
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4018
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>> {
4026
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4027
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4019
4028
private:
4020
4029
using TrailingGenericContextObjects =
4021
4030
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
@@ -4030,7 +4039,8 @@ class TargetClassDescriptor final
4030
4039
TargetObjCResilientClassStubInfo<Runtime>,
4031
4040
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4032
4041
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4033
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>>;
4042
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4043
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>>;
4034
4044
4035
4045
using TrailingObjects =
4036
4046
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4058,6 +4068,8 @@ class TargetClassDescriptor final
4058
4068
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false >;
4059
4069
using MetadataAccessorListEntry =
4060
4070
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>;
4071
+ using MetadataCachingOnceToken =
4072
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4061
4073
4062
4074
using StoredPointer = typename Runtime::StoredPointer;
4063
4075
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4195,6 +4207,10 @@ class TargetClassDescriptor final
4195
4207
: 0 ;
4196
4208
}
4197
4209
4210
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4211
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4212
+ }
4213
+
4198
4214
public:
4199
4215
const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
4200
4216
getResilientSuperclass () const {
@@ -4358,6 +4374,14 @@ class TargetClassDescriptor final
4358
4374
);
4359
4375
}
4360
4376
4377
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4378
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4379
+ return nullptr ;
4380
+ }
4381
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4382
+ return box->token .get ();
4383
+ }
4384
+
4361
4385
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4362
4386
return cd->getKind () == ContextDescriptorKind::Class;
4363
4387
}
@@ -4385,7 +4409,8 @@ class TargetStructDescriptor final
4385
4409
TargetForeignMetadataInitialization<Runtime>,
4386
4410
TargetSingletonMetadataInitialization<Runtime>,
4387
4411
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4388
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4412
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4413
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4389
4414
public:
4390
4415
using ForeignMetadataInitialization =
4391
4416
TargetForeignMetadataInitialization<Runtime>;
@@ -4397,6 +4422,8 @@ class TargetStructDescriptor final
4397
4422
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4398
4423
using MetadataListEntry =
4399
4424
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4425
+ using MetadataCachingOnceToken =
4426
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4400
4427
4401
4428
private:
4402
4429
using TrailingGenericContextObjects =
@@ -4405,7 +4432,8 @@ class TargetStructDescriptor final
4405
4432
ForeignMetadataInitialization,
4406
4433
SingletonMetadataInitialization,
4407
4434
MetadataListCount,
4408
- MetadataListEntry>;
4435
+ MetadataListEntry,
4436
+ MetadataCachingOnceToken>;
4409
4437
4410
4438
using TrailingObjects =
4411
4439
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4435,6 +4463,10 @@ class TargetStructDescriptor final
4435
4463
: 0 ;
4436
4464
}
4437
4465
4466
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4467
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4468
+ }
4469
+
4438
4470
public:
4439
4471
using TrailingGenericContextObjects::getGenericContext;
4440
4472
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4480,6 +4512,14 @@ class TargetStructDescriptor final
4480
4512
);
4481
4513
}
4482
4514
4515
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4516
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4517
+ return nullptr ;
4518
+ }
4519
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4520
+ return box->token .get ();
4521
+ }
4522
+
4483
4523
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4484
4524
return cd->getKind () == ContextDescriptorKind::Struct;
4485
4525
}
@@ -4496,7 +4536,8 @@ class TargetEnumDescriptor final
4496
4536
TargetForeignMetadataInitialization<Runtime>,
4497
4537
TargetSingletonMetadataInitialization<Runtime>,
4498
4538
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4499
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4539
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4540
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4500
4541
public:
4501
4542
using SingletonMetadataInitialization =
4502
4543
TargetSingletonMetadataInitialization<Runtime>;
@@ -4508,6 +4549,8 @@ class TargetEnumDescriptor final
4508
4549
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4509
4550
using MetadataListEntry =
4510
4551
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4552
+ using MetadataCachingOnceToken =
4553
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4511
4554
4512
4555
private:
4513
4556
using TrailingGenericContextObjects =
@@ -4516,7 +4559,8 @@ class TargetEnumDescriptor final
4516
4559
ForeignMetadataInitialization,
4517
4560
SingletonMetadataInitialization,
4518
4561
MetadataListCount,
4519
- MetadataListEntry>;
4562
+ MetadataListEntry,
4563
+ MetadataCachingOnceToken>;
4520
4564
4521
4565
using TrailingObjects =
4522
4566
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4546,6 +4590,10 @@ class TargetEnumDescriptor final
4546
4590
: 0 ;
4547
4591
}
4548
4592
4593
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4594
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4595
+ }
4596
+
4549
4597
public:
4550
4598
using TrailingGenericContextObjects::getGenericContext;
4551
4599
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4605,6 +4653,14 @@ class TargetEnumDescriptor final
4605
4653
);
4606
4654
}
4607
4655
4656
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4657
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4658
+ return nullptr ;
4659
+ }
4660
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4661
+ return box->token .get ();
4662
+ }
4663
+
4608
4664
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4609
4665
return cd->getKind () == ContextDescriptorKind::Enum;
4610
4666
}
@@ -4757,6 +4813,24 @@ TargetTypeContextDescriptor<Runtime>::getCanonicicalMetadataPrespecializations()
4757
4813
}
4758
4814
}
4759
4815
4816
+ template <typename Runtime>
4817
+ inline swift_once_t *TargetTypeContextDescriptor<
4818
+ Runtime>::getCanonicalMetadataPrespecializationCachingOnceToken() const {
4819
+ switch (this ->getKind ()) {
4820
+ case ContextDescriptorKind::Enum:
4821
+ return llvm::cast<TargetEnumDescriptor<Runtime>>(this )
4822
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4823
+ case ContextDescriptorKind::Struct:
4824
+ return llvm::cast<TargetStructDescriptor<Runtime>>(this )
4825
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4826
+ case ContextDescriptorKind::Class:
4827
+ return llvm::cast<TargetClassDescriptor<Runtime>>(this )
4828
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4829
+ default :
4830
+ swift_unreachable (" Not a type context descriptor." );
4831
+ }
4832
+ }
4833
+
4760
4834
// / An entry in the chain of dynamic replacement functions.
4761
4835
struct DynamicReplacementChainEntry {
4762
4836
void *implementationFunction;
0 commit comments