@@ -3304,7 +3304,7 @@ struct TargetForeignMetadataInitialization {
3304
3304
// / The cache structure for non-trivial initialization of singleton value
3305
3305
// / metadata.
3306
3306
template <typename Runtime>
3307
- struct TargetInPlaceValueMetadataCache {
3307
+ struct TargetSingletonMetadataCache {
3308
3308
// / The metadata pointer. Clients can do dependency-ordered loads
3309
3309
// / from this, and if they see a non-zero value, it's a Complete
3310
3310
// / metadata.
@@ -3313,24 +3313,32 @@ struct TargetInPlaceValueMetadataCache {
3313
3313
// / The private cache data.
3314
3314
std::atomic<TargetPointer<Runtime, void >> Private;
3315
3315
};
3316
- using InPlaceValueMetadataCache =
3317
- TargetInPlaceValueMetadataCache <InProcess>;
3316
+ using SingletonMetadataCache =
3317
+ TargetSingletonMetadataCache <InProcess>;
3318
3318
3319
3319
template <typename Runtime>
3320
3320
struct TargetResilientClassMetadataPattern ;
3321
3321
3322
- // / An instantiation pattern for non-generic resilient class metadata.
3323
- // / Used in conjunction with InPlaceValueMetadataInitialization .
3322
+ // / A function for allocating metadata for a resilient class, calculating
3323
+ // / the correct metadata size at runtime .
3324
3324
using MetadataRelocator =
3325
3325
Metadata *(const TargetTypeContextDescriptor<InProcess> *type,
3326
3326
const TargetResilientClassMetadataPattern<InProcess> *pattern);
3327
3327
3328
3328
// / An instantiation pattern for non-generic resilient class metadata.
3329
+ // /
3330
+ // / Used for classes with resilient ancestry, that is, where at least one
3331
+ // / ancestor is defined in a different resilience domain.
3332
+ // /
3333
+ // / The hasResilientSuperclass() flag in the class context descriptor is
3334
+ // / set in this case, and hasSingletonMetadataInitialization() must be
3335
+ // / set as well.
3336
+ // /
3337
+ // / The pattern is referenced from the SingletonMetadataInitialization
3338
+ // / record in the class context descriptor.
3329
3339
template <typename Runtime>
3330
3340
struct TargetResilientClassMetadataPattern {
3331
- // / If the class descriptor's hasResilientSuperclass() flag is set,
3332
- // / this field instead points at a function that allocates metadata
3333
- // / with the correct size at runtime.
3341
+ // / A function that allocates metadata with the correct size at runtime.
3334
3342
TargetRelativeDirectPointer<Runtime, MetadataRelocator> RelocationFunction;
3335
3343
3336
3344
// / The heap-destructor function.
@@ -3358,10 +3366,10 @@ using ResilientClassMetadataPattern =
3358
3366
// / singleton value metadata, which is required when e.g. a non-generic
3359
3367
// / value type has a resilient component type.
3360
3368
template <typename Runtime>
3361
- struct TargetInPlaceValueMetadataInitialization {
3369
+ struct TargetSingletonMetadataInitialization {
3362
3370
// / The initialization cache. Out-of-line because mutable.
3363
3371
TargetRelativeDirectPointer<Runtime,
3364
- TargetInPlaceValueMetadataCache <Runtime>>
3372
+ TargetSingletonMetadataCache <Runtime>>
3365
3373
InitializationCache;
3366
3374
3367
3375
union {
@@ -3371,17 +3379,19 @@ struct TargetInPlaceValueMetadataInitialization {
3371
3379
IncompleteMetadata;
3372
3380
3373
3381
// / If the class descriptor's hasResilientSuperclass() flag is set,
3374
- // / this field instead points at a function that allocates metadata
3375
- // / with the correct size at runtime.
3382
+ // / this field instead points at a pattern used to allocate and
3383
+ // / initialize metadata for this class, since it's size and contents
3384
+ // / is not known at compile time.
3376
3385
TargetRelativeDirectPointer<Runtime, TargetResilientClassMetadataPattern<Runtime>>
3377
3386
ResilientPattern;
3378
3387
};
3379
3388
3380
- // / The completion function. The pattern will always be null.
3389
+ // / The completion function. The pattern will always be null, even
3390
+ // / for a resilient class.
3381
3391
TargetRelativeDirectPointer<Runtime, MetadataCompleter>
3382
3392
CompletionFunction;
3383
3393
3384
- bool hasRelocationFunction (
3394
+ bool hasResilientClassPattern (
3385
3395
const TargetTypeContextDescriptor<Runtime> *description) const {
3386
3396
auto *classDescription =
3387
3397
dyn_cast<TargetClassDescriptor<Runtime>>(description);
@@ -3391,7 +3401,7 @@ struct TargetInPlaceValueMetadataInitialization {
3391
3401
3392
3402
TargetMetadata<Runtime> *allocate (
3393
3403
const TargetTypeContextDescriptor<Runtime> *description) const {
3394
- if (hasRelocationFunction (description)) {
3404
+ if (hasResilientClassPattern (description)) {
3395
3405
return ResilientPattern->RelocationFunction (description,
3396
3406
ResilientPattern.get ());
3397
3407
}
@@ -3435,12 +3445,12 @@ class TargetTypeContextDescriptor
3435
3445
return getTypeContextDescriptorFlags ().getMetadataInitialization ();
3436
3446
}
3437
3447
3438
- // / Does this type have non-trivial "in place " metadata initialization?
3448
+ // / Does this type have non-trivial "singleton " metadata initialization?
3439
3449
// /
3440
3450
// / The type of the initialization-control structure differs by subclass,
3441
3451
// / so it doesn't appear here.
3442
- bool hasInPlaceMetadataInitialization () const {
3443
- return getTypeContextDescriptorFlags ().hasInPlaceMetadataInitialization ();
3452
+ bool hasSingletonMetadataInitialization () const {
3453
+ return getTypeContextDescriptorFlags ().hasSingletonMetadataInitialization ();
3444
3454
}
3445
3455
3446
3456
// / Does this type have "foreign" metadata initialiation?
@@ -3453,8 +3463,8 @@ class TargetTypeContextDescriptor
3453
3463
const TargetForeignMetadataInitialization<Runtime> &
3454
3464
getForeignMetadataInitialization () const ;
3455
3465
3456
- const TargetInPlaceValueMetadataInitialization <Runtime> &
3457
- getInPlaceMetadataInitialization () const ;
3466
+ const TargetSingletonMetadataInitialization <Runtime> &
3467
+ getSingletonMetadataInitialization () const ;
3458
3468
3459
3469
const TargetTypeGenericContextDescriptorHeader<Runtime> &
3460
3470
getFullGenericContextHeader () const ;
@@ -3580,15 +3590,15 @@ class TargetClassDescriptor final
3580
3590
TargetTypeGenericContextDescriptorHeader,
3581
3591
/* additional trailing objects:*/
3582
3592
TargetForeignMetadataInitialization<Runtime>,
3583
- TargetInPlaceValueMetadataInitialization <Runtime>,
3593
+ TargetSingletonMetadataInitialization <Runtime>,
3584
3594
TargetVTableDescriptorHeader<Runtime>,
3585
3595
TargetMethodDescriptor<Runtime>> {
3586
3596
private:
3587
3597
using TrailingGenericContextObjects =
3588
3598
TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
3589
3599
TargetTypeGenericContextDescriptorHeader,
3590
3600
TargetForeignMetadataInitialization<Runtime>,
3591
- TargetInPlaceValueMetadataInitialization <Runtime>,
3601
+ TargetSingletonMetadataInitialization <Runtime>,
3592
3602
TargetVTableDescriptorHeader<Runtime>,
3593
3603
TargetMethodDescriptor<Runtime>>;
3594
3604
@@ -3601,8 +3611,8 @@ class TargetClassDescriptor final
3601
3611
using VTableDescriptorHeader = TargetVTableDescriptorHeader<Runtime>;
3602
3612
using ForeignMetadataInitialization =
3603
3613
TargetForeignMetadataInitialization<Runtime>;
3604
- using InPlaceMetadataInitialization =
3605
- TargetInPlaceValueMetadataInitialization <Runtime>;
3614
+ using SingletonMetadataInitialization =
3615
+ TargetSingletonMetadataInitialization <Runtime>;
3606
3616
3607
3617
using StoredPointer = typename Runtime::StoredPointer;
3608
3618
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -3694,8 +3704,8 @@ class TargetClassDescriptor final
3694
3704
return this ->hasForeignMetadataInitialization () ? 1 : 0 ;
3695
3705
}
3696
3706
3697
- size_t numTrailingObjects (OverloadToken<InPlaceMetadataInitialization >) const {
3698
- return this ->hasInPlaceMetadataInitialization () ? 1 : 0 ;
3707
+ size_t numTrailingObjects (OverloadToken<SingletonMetadataInitialization >) const {
3708
+ return this ->hasSingletonMetadataInitialization () ? 1 : 0 ;
3699
3709
}
3700
3710
3701
3711
size_t numTrailingObjects (OverloadToken<VTableDescriptorHeader>) const {
@@ -3715,9 +3725,9 @@ class TargetClassDescriptor final
3715
3725
return *this ->template getTrailingObjects <ForeignMetadataInitialization>();
3716
3726
}
3717
3727
3718
- const InPlaceMetadataInitialization & getInPlaceMetadataInitialization () const {
3719
- assert (this ->hasInPlaceMetadataInitialization ());
3720
- return *this ->template getTrailingObjects <InPlaceMetadataInitialization >();
3728
+ const SingletonMetadataInitialization & getSingletonMetadataInitialization () const {
3729
+ assert (this ->hasSingletonMetadataInitialization ());
3730
+ return *this ->template getTrailingObjects <SingletonMetadataInitialization >();
3721
3731
}
3722
3732
3723
3733
// / True if metadata records for this type have a field offset vector for
@@ -3830,19 +3840,19 @@ class TargetStructDescriptor final
3830
3840
TargetTypeGenericContextDescriptorHeader,
3831
3841
/* additional trailing objects*/
3832
3842
TargetForeignMetadataInitialization<Runtime>,
3833
- TargetInPlaceValueMetadataInitialization <Runtime>> {
3843
+ TargetSingletonMetadataInitialization <Runtime>> {
3834
3844
public:
3835
3845
using ForeignMetadataInitialization =
3836
3846
TargetForeignMetadataInitialization<Runtime>;
3837
- using InPlaceMetadataInitialization =
3838
- TargetInPlaceValueMetadataInitialization <Runtime>;
3847
+ using SingletonMetadataInitialization =
3848
+ TargetSingletonMetadataInitialization <Runtime>;
3839
3849
3840
3850
private:
3841
3851
using TrailingGenericContextObjects =
3842
3852
TrailingGenericContextObjects<TargetStructDescriptor<Runtime>,
3843
3853
TargetTypeGenericContextDescriptorHeader,
3844
3854
ForeignMetadataInitialization,
3845
- InPlaceMetadataInitialization >;
3855
+ SingletonMetadataInitialization >;
3846
3856
3847
3857
using TrailingObjects =
3848
3858
typename TrailingGenericContextObjects::TrailingObjects;
@@ -3856,8 +3866,8 @@ class TargetStructDescriptor final
3856
3866
return this ->hasForeignMetadataInitialization () ? 1 : 0 ;
3857
3867
}
3858
3868
3859
- size_t numTrailingObjects (OverloadToken<InPlaceMetadataInitialization >) const {
3860
- return this ->hasInPlaceMetadataInitialization () ? 1 : 0 ;
3869
+ size_t numTrailingObjects (OverloadToken<SingletonMetadataInitialization >) const {
3870
+ return this ->hasSingletonMetadataInitialization () ? 1 : 0 ;
3861
3871
}
3862
3872
3863
3873
public:
@@ -3883,9 +3893,9 @@ class TargetStructDescriptor final
3883
3893
return *this ->template getTrailingObjects <ForeignMetadataInitialization>();
3884
3894
}
3885
3895
3886
- const InPlaceMetadataInitialization & getInPlaceMetadataInitialization () const {
3887
- assert (this ->hasInPlaceMetadataInitialization ());
3888
- return *this ->template getTrailingObjects <InPlaceMetadataInitialization >();
3896
+ const SingletonMetadataInitialization & getSingletonMetadataInitialization () const {
3897
+ assert (this ->hasSingletonMetadataInitialization ());
3898
+ return *this ->template getTrailingObjects <SingletonMetadataInitialization >();
3889
3899
}
3890
3900
3891
3901
static constexpr int32_t getGenericArgumentOffset () {
@@ -3906,10 +3916,10 @@ class TargetEnumDescriptor final
3906
3916
TargetTypeGenericContextDescriptorHeader,
3907
3917
/* additional trailing objects*/
3908
3918
TargetForeignMetadataInitialization<Runtime>,
3909
- TargetInPlaceValueMetadataInitialization <Runtime>> {
3919
+ TargetSingletonMetadataInitialization <Runtime>> {
3910
3920
public:
3911
- using InPlaceMetadataInitialization =
3912
- TargetInPlaceValueMetadataInitialization <Runtime>;
3921
+ using SingletonMetadataInitialization =
3922
+ TargetSingletonMetadataInitialization <Runtime>;
3913
3923
using ForeignMetadataInitialization =
3914
3924
TargetForeignMetadataInitialization<Runtime>;
3915
3925
@@ -3918,7 +3928,7 @@ class TargetEnumDescriptor final
3918
3928
TrailingGenericContextObjects<TargetEnumDescriptor<Runtime>,
3919
3929
TargetTypeGenericContextDescriptorHeader,
3920
3930
ForeignMetadataInitialization,
3921
- InPlaceMetadataInitialization >;
3931
+ SingletonMetadataInitialization >;
3922
3932
3923
3933
using TrailingObjects =
3924
3934
typename TrailingGenericContextObjects::TrailingObjects;
@@ -3932,8 +3942,8 @@ class TargetEnumDescriptor final
3932
3942
return this ->hasForeignMetadataInitialization () ? 1 : 0 ;
3933
3943
}
3934
3944
3935
- size_t numTrailingObjects (OverloadToken<InPlaceMetadataInitialization >) const {
3936
- return this ->hasInPlaceMetadataInitialization () ? 1 : 0 ;
3945
+ size_t numTrailingObjects (OverloadToken<SingletonMetadataInitialization >) const {
3946
+ return this ->hasSingletonMetadataInitialization () ? 1 : 0 ;
3937
3947
}
3938
3948
3939
3949
public:
@@ -3977,9 +3987,9 @@ class TargetEnumDescriptor final
3977
3987
return *this ->template getTrailingObjects <ForeignMetadataInitialization>();
3978
3988
}
3979
3989
3980
- const InPlaceMetadataInitialization & getInPlaceMetadataInitialization () const {
3981
- assert (this ->hasInPlaceMetadataInitialization ());
3982
- return *this ->template getTrailingObjects <InPlaceMetadataInitialization >();
3990
+ const SingletonMetadataInitialization & getSingletonMetadataInitialization () const {
3991
+ assert (this ->hasSingletonMetadataInitialization ());
3992
+ return *this ->template getTrailingObjects <SingletonMetadataInitialization >();
3983
3993
}
3984
3994
3985
3995
static bool classof (const TargetContextDescriptor<Runtime> *cd) {
@@ -4089,18 +4099,18 @@ TargetTypeContextDescriptor<Runtime>::getForeignMetadataInitialization() const {
4089
4099
}
4090
4100
4091
4101
template <typename Runtime>
4092
- inline const TargetInPlaceValueMetadataInitialization <Runtime> &
4093
- TargetTypeContextDescriptor<Runtime>::getInPlaceMetadataInitialization () const {
4102
+ inline const TargetSingletonMetadataInitialization <Runtime> &
4103
+ TargetTypeContextDescriptor<Runtime>::getSingletonMetadataInitialization () const {
4094
4104
switch (this ->getKind ()) {
4095
4105
case ContextDescriptorKind::Enum:
4096
4106
return llvm::cast<TargetEnumDescriptor<Runtime>>(this )
4097
- ->getInPlaceMetadataInitialization ();
4107
+ ->getSingletonMetadataInitialization ();
4098
4108
case ContextDescriptorKind::Struct:
4099
4109
return llvm::cast<TargetStructDescriptor<Runtime>>(this )
4100
- ->getInPlaceMetadataInitialization ();
4110
+ ->getSingletonMetadataInitialization ();
4101
4111
case ContextDescriptorKind::Class:
4102
4112
return llvm::cast<TargetClassDescriptor<Runtime>>(this )
4103
- ->getInPlaceMetadataInitialization ();
4113
+ ->getSingletonMetadataInitialization ();
4104
4114
default :
4105
4115
swift_runtime_unreachable (" Not a enum, struct or class type descriptor." );
4106
4116
}
0 commit comments