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"
@@ -3796,6 +3797,11 @@ struct TargetCanonicalSpecializedMetadataAccessorsListEntry {
3796
3797
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false > accessor;
3797
3798
};
3798
3799
3800
+ template <typename Runtime>
3801
+ struct TargetCanonicalSpecializedMetadatasCachingOnceToken {
3802
+ TargetRelativeDirectPointer<Runtime, swift_once_t , /* Nullable*/ false > token;
3803
+ };
3804
+
3799
3805
template <typename Runtime>
3800
3806
class TargetTypeContextDescriptor
3801
3807
: public TargetContextDescriptor<Runtime> {
@@ -3882,7 +3888,9 @@ class TargetTypeContextDescriptor
3882
3888
}
3883
3889
3884
3890
const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /* Nullable*/ false >>
3885
- getCanonicicalMetadataPrespecializations () const ;
3891
+ getCanonicicalMetadataPrespecializations () const ;
3892
+
3893
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const ;
3886
3894
3887
3895
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
3888
3896
return cd->getKind () >= ContextDescriptorKind::Type_First
@@ -4024,7 +4032,8 @@ class TargetClassDescriptor final
4024
4032
TargetObjCResilientClassStubInfo<Runtime>,
4025
4033
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4026
4034
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4027
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>> {
4035
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4036
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4028
4037
private:
4029
4038
using TrailingGenericContextObjects =
4030
4039
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
@@ -4039,7 +4048,8 @@ class TargetClassDescriptor final
4039
4048
TargetObjCResilientClassStubInfo<Runtime>,
4040
4049
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4041
4050
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4042
- TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>>;
4051
+ TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
4052
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>>;
4043
4053
4044
4054
using TrailingObjects =
4045
4055
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4067,6 +4077,8 @@ class TargetClassDescriptor final
4067
4077
TargetRelativeDirectPointer<Runtime, MetadataResponse(MetadataRequest), /* Nullable*/ false >;
4068
4078
using MetadataAccessorListEntry =
4069
4079
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>;
4080
+ using MetadataCachingOnceToken =
4081
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4070
4082
4071
4083
using StoredPointer = typename Runtime::StoredPointer;
4072
4084
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4204,6 +4216,10 @@ class TargetClassDescriptor final
4204
4216
: 0 ;
4205
4217
}
4206
4218
4219
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4220
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4221
+ }
4222
+
4207
4223
public:
4208
4224
const TargetRelativeDirectPointer<Runtime, const void , /* nullable*/ true > &
4209
4225
getResilientSuperclass () const {
@@ -4367,6 +4383,14 @@ class TargetClassDescriptor final
4367
4383
);
4368
4384
}
4369
4385
4386
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4387
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4388
+ return nullptr ;
4389
+ }
4390
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4391
+ return box->token .get ();
4392
+ }
4393
+
4370
4394
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4371
4395
return cd->getKind () == ContextDescriptorKind::Class;
4372
4396
}
@@ -4394,7 +4418,8 @@ class TargetStructDescriptor final
4394
4418
TargetForeignMetadataInitialization<Runtime>,
4395
4419
TargetSingletonMetadataInitialization<Runtime>,
4396
4420
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4397
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4421
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4422
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4398
4423
public:
4399
4424
using ForeignMetadataInitialization =
4400
4425
TargetForeignMetadataInitialization<Runtime>;
@@ -4406,6 +4431,8 @@ class TargetStructDescriptor final
4406
4431
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4407
4432
using MetadataListEntry =
4408
4433
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4434
+ using MetadataCachingOnceToken =
4435
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4409
4436
4410
4437
private:
4411
4438
using TrailingGenericContextObjects =
@@ -4414,7 +4441,8 @@ class TargetStructDescriptor final
4414
4441
ForeignMetadataInitialization,
4415
4442
SingletonMetadataInitialization,
4416
4443
MetadataListCount,
4417
- MetadataListEntry>;
4444
+ MetadataListEntry,
4445
+ MetadataCachingOnceToken>;
4418
4446
4419
4447
using TrailingObjects =
4420
4448
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4444,6 +4472,10 @@ class TargetStructDescriptor final
4444
4472
: 0 ;
4445
4473
}
4446
4474
4475
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4476
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4477
+ }
4478
+
4447
4479
public:
4448
4480
using TrailingGenericContextObjects::getGenericContext;
4449
4481
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4489,6 +4521,14 @@ class TargetStructDescriptor final
4489
4521
);
4490
4522
}
4491
4523
4524
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4525
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4526
+ return nullptr ;
4527
+ }
4528
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4529
+ return box->token .get ();
4530
+ }
4531
+
4492
4532
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4493
4533
return cd->getKind () == ContextDescriptorKind::Struct;
4494
4534
}
@@ -4505,7 +4545,8 @@ class TargetEnumDescriptor final
4505
4545
TargetForeignMetadataInitialization<Runtime>,
4506
4546
TargetSingletonMetadataInitialization<Runtime>,
4507
4547
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4508
- TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
4548
+ TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4549
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>> {
4509
4550
public:
4510
4551
using SingletonMetadataInitialization =
4511
4552
TargetSingletonMetadataInitialization<Runtime>;
@@ -4517,6 +4558,8 @@ class TargetEnumDescriptor final
4517
4558
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4518
4559
using MetadataListEntry =
4519
4560
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
4561
+ using MetadataCachingOnceToken =
4562
+ TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
4520
4563
4521
4564
private:
4522
4565
using TrailingGenericContextObjects =
@@ -4525,7 +4568,8 @@ class TargetEnumDescriptor final
4525
4568
ForeignMetadataInitialization,
4526
4569
SingletonMetadataInitialization,
4527
4570
MetadataListCount,
4528
- MetadataListEntry>;
4571
+ MetadataListEntry,
4572
+ MetadataCachingOnceToken>;
4529
4573
4530
4574
using TrailingObjects =
4531
4575
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4555,6 +4599,10 @@ class TargetEnumDescriptor final
4555
4599
: 0 ;
4556
4600
}
4557
4601
4602
+ size_t numTrailingObjects (OverloadToken<MetadataCachingOnceToken>) const {
4603
+ return this ->hasCanonicicalMetadataPrespecializations () ? 1 : 0 ;
4604
+ }
4605
+
4558
4606
public:
4559
4607
using TrailingGenericContextObjects::getGenericContext;
4560
4608
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4614,6 +4662,14 @@ class TargetEnumDescriptor final
4614
4662
);
4615
4663
}
4616
4664
4665
+ swift_once_t *getCanonicalMetadataPrespecializationCachingOnceToken () const {
4666
+ if (!this ->hasCanonicicalMetadataPrespecializations ()) {
4667
+ return nullptr ;
4668
+ }
4669
+ auto box = this ->template getTrailingObjects <MetadataCachingOnceToken>();
4670
+ return box->token .get ();
4671
+ }
4672
+
4617
4673
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
4618
4674
return cd->getKind () == ContextDescriptorKind::Enum;
4619
4675
}
@@ -4766,6 +4822,24 @@ TargetTypeContextDescriptor<Runtime>::getCanonicicalMetadataPrespecializations()
4766
4822
}
4767
4823
}
4768
4824
4825
+ template <typename Runtime>
4826
+ inline swift_once_t *TargetTypeContextDescriptor<
4827
+ Runtime>::getCanonicalMetadataPrespecializationCachingOnceToken() const {
4828
+ switch (this ->getKind ()) {
4829
+ case ContextDescriptorKind::Enum:
4830
+ return llvm::cast<TargetEnumDescriptor<Runtime>>(this )
4831
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4832
+ case ContextDescriptorKind::Struct:
4833
+ return llvm::cast<TargetStructDescriptor<Runtime>>(this )
4834
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4835
+ case ContextDescriptorKind::Class:
4836
+ return llvm::cast<TargetClassDescriptor<Runtime>>(this )
4837
+ ->getCanonicalMetadataPrespecializationCachingOnceToken ();
4838
+ default :
4839
+ swift_unreachable (" Not a type context descriptor." );
4840
+ }
4841
+ }
4842
+
4769
4843
// / An entry in the chain of dynamic replacement functions.
4770
4844
struct DynamicReplacementChainEntry {
4771
4845
void *implementationFunction;
0 commit comments