Skip to content

Commit 574b7f4

Browse files
authored
Merge pull request swiftlang#18949 from slavapestov/class-resilience-cleanup
Class resilience cleanup
2 parents d27765e + 1a5c002 commit 574b7f4

23 files changed

+239
-301
lines changed

include/swift/ABI/Metadata.h

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3304,7 +3304,7 @@ struct TargetForeignMetadataInitialization {
33043304
/// The cache structure for non-trivial initialization of singleton value
33053305
/// metadata.
33063306
template <typename Runtime>
3307-
struct TargetInPlaceValueMetadataCache {
3307+
struct TargetSingletonMetadataCache {
33083308
/// The metadata pointer. Clients can do dependency-ordered loads
33093309
/// from this, and if they see a non-zero value, it's a Complete
33103310
/// metadata.
@@ -3313,24 +3313,32 @@ struct TargetInPlaceValueMetadataCache {
33133313
/// The private cache data.
33143314
std::atomic<TargetPointer<Runtime, void>> Private;
33153315
};
3316-
using InPlaceValueMetadataCache =
3317-
TargetInPlaceValueMetadataCache<InProcess>;
3316+
using SingletonMetadataCache =
3317+
TargetSingletonMetadataCache<InProcess>;
33183318

33193319
template <typename Runtime>
33203320
struct TargetResilientClassMetadataPattern;
33213321

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.
33243324
using MetadataRelocator =
33253325
Metadata *(const TargetTypeContextDescriptor<InProcess> *type,
33263326
const TargetResilientClassMetadataPattern<InProcess> *pattern);
33273327

33283328
/// 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.
33293339
template <typename Runtime>
33303340
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.
33343342
TargetRelativeDirectPointer<Runtime, MetadataRelocator> RelocationFunction;
33353343

33363344
/// The heap-destructor function.
@@ -3358,10 +3366,10 @@ using ResilientClassMetadataPattern =
33583366
/// singleton value metadata, which is required when e.g. a non-generic
33593367
/// value type has a resilient component type.
33603368
template <typename Runtime>
3361-
struct TargetInPlaceValueMetadataInitialization {
3369+
struct TargetSingletonMetadataInitialization {
33623370
/// The initialization cache. Out-of-line because mutable.
33633371
TargetRelativeDirectPointer<Runtime,
3364-
TargetInPlaceValueMetadataCache<Runtime>>
3372+
TargetSingletonMetadataCache<Runtime>>
33653373
InitializationCache;
33663374

33673375
union {
@@ -3371,17 +3379,19 @@ struct TargetInPlaceValueMetadataInitialization {
33713379
IncompleteMetadata;
33723380

33733381
/// 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.
33763385
TargetRelativeDirectPointer<Runtime, TargetResilientClassMetadataPattern<Runtime>>
33773386
ResilientPattern;
33783387
};
33793388

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.
33813391
TargetRelativeDirectPointer<Runtime, MetadataCompleter>
33823392
CompletionFunction;
33833393

3384-
bool hasRelocationFunction(
3394+
bool hasResilientClassPattern(
33853395
const TargetTypeContextDescriptor<Runtime> *description) const {
33863396
auto *classDescription =
33873397
dyn_cast<TargetClassDescriptor<Runtime>>(description);
@@ -3391,7 +3401,7 @@ struct TargetInPlaceValueMetadataInitialization {
33913401

33923402
TargetMetadata<Runtime> *allocate(
33933403
const TargetTypeContextDescriptor<Runtime> *description) const {
3394-
if (hasRelocationFunction(description)) {
3404+
if (hasResilientClassPattern(description)) {
33953405
return ResilientPattern->RelocationFunction(description,
33963406
ResilientPattern.get());
33973407
}
@@ -3435,12 +3445,12 @@ class TargetTypeContextDescriptor
34353445
return getTypeContextDescriptorFlags().getMetadataInitialization();
34363446
}
34373447

3438-
/// Does this type have non-trivial "in place" metadata initialization?
3448+
/// Does this type have non-trivial "singleton" metadata initialization?
34393449
///
34403450
/// The type of the initialization-control structure differs by subclass,
34413451
/// so it doesn't appear here.
3442-
bool hasInPlaceMetadataInitialization() const {
3443-
return getTypeContextDescriptorFlags().hasInPlaceMetadataInitialization();
3452+
bool hasSingletonMetadataInitialization() const {
3453+
return getTypeContextDescriptorFlags().hasSingletonMetadataInitialization();
34443454
}
34453455

34463456
/// Does this type have "foreign" metadata initialiation?
@@ -3453,8 +3463,8 @@ class TargetTypeContextDescriptor
34533463
const TargetForeignMetadataInitialization<Runtime> &
34543464
getForeignMetadataInitialization() const;
34553465

3456-
const TargetInPlaceValueMetadataInitialization<Runtime> &
3457-
getInPlaceMetadataInitialization() const;
3466+
const TargetSingletonMetadataInitialization<Runtime> &
3467+
getSingletonMetadataInitialization() const;
34583468

34593469
const TargetTypeGenericContextDescriptorHeader<Runtime> &
34603470
getFullGenericContextHeader() const;
@@ -3580,15 +3590,15 @@ class TargetClassDescriptor final
35803590
TargetTypeGenericContextDescriptorHeader,
35813591
/*additional trailing objects:*/
35823592
TargetForeignMetadataInitialization<Runtime>,
3583-
TargetInPlaceValueMetadataInitialization<Runtime>,
3593+
TargetSingletonMetadataInitialization<Runtime>,
35843594
TargetVTableDescriptorHeader<Runtime>,
35853595
TargetMethodDescriptor<Runtime>> {
35863596
private:
35873597
using TrailingGenericContextObjects =
35883598
TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
35893599
TargetTypeGenericContextDescriptorHeader,
35903600
TargetForeignMetadataInitialization<Runtime>,
3591-
TargetInPlaceValueMetadataInitialization<Runtime>,
3601+
TargetSingletonMetadataInitialization<Runtime>,
35923602
TargetVTableDescriptorHeader<Runtime>,
35933603
TargetMethodDescriptor<Runtime>>;
35943604

@@ -3601,8 +3611,8 @@ class TargetClassDescriptor final
36013611
using VTableDescriptorHeader = TargetVTableDescriptorHeader<Runtime>;
36023612
using ForeignMetadataInitialization =
36033613
TargetForeignMetadataInitialization<Runtime>;
3604-
using InPlaceMetadataInitialization =
3605-
TargetInPlaceValueMetadataInitialization<Runtime>;
3614+
using SingletonMetadataInitialization =
3615+
TargetSingletonMetadataInitialization<Runtime>;
36063616

36073617
using StoredPointer = typename Runtime::StoredPointer;
36083618
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -3694,8 +3704,8 @@ class TargetClassDescriptor final
36943704
return this->hasForeignMetadataInitialization() ? 1 : 0;
36953705
}
36963706

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;
36993709
}
37003710

37013711
size_t numTrailingObjects(OverloadToken<VTableDescriptorHeader>) const {
@@ -3715,9 +3725,9 @@ class TargetClassDescriptor final
37153725
return *this->template getTrailingObjects<ForeignMetadataInitialization>();
37163726
}
37173727

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>();
37213731
}
37223732

37233733
/// True if metadata records for this type have a field offset vector for
@@ -3830,19 +3840,19 @@ class TargetStructDescriptor final
38303840
TargetTypeGenericContextDescriptorHeader,
38313841
/*additional trailing objects*/
38323842
TargetForeignMetadataInitialization<Runtime>,
3833-
TargetInPlaceValueMetadataInitialization<Runtime>> {
3843+
TargetSingletonMetadataInitialization<Runtime>> {
38343844
public:
38353845
using ForeignMetadataInitialization =
38363846
TargetForeignMetadataInitialization<Runtime>;
3837-
using InPlaceMetadataInitialization =
3838-
TargetInPlaceValueMetadataInitialization<Runtime>;
3847+
using SingletonMetadataInitialization =
3848+
TargetSingletonMetadataInitialization<Runtime>;
38393849

38403850
private:
38413851
using TrailingGenericContextObjects =
38423852
TrailingGenericContextObjects<TargetStructDescriptor<Runtime>,
38433853
TargetTypeGenericContextDescriptorHeader,
38443854
ForeignMetadataInitialization,
3845-
InPlaceMetadataInitialization>;
3855+
SingletonMetadataInitialization>;
38463856

38473857
using TrailingObjects =
38483858
typename TrailingGenericContextObjects::TrailingObjects;
@@ -3856,8 +3866,8 @@ class TargetStructDescriptor final
38563866
return this->hasForeignMetadataInitialization() ? 1 : 0;
38573867
}
38583868

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;
38613871
}
38623872

38633873
public:
@@ -3883,9 +3893,9 @@ class TargetStructDescriptor final
38833893
return *this->template getTrailingObjects<ForeignMetadataInitialization>();
38843894
}
38853895

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>();
38893899
}
38903900

38913901
static constexpr int32_t getGenericArgumentOffset() {
@@ -3906,10 +3916,10 @@ class TargetEnumDescriptor final
39063916
TargetTypeGenericContextDescriptorHeader,
39073917
/*additional trailing objects*/
39083918
TargetForeignMetadataInitialization<Runtime>,
3909-
TargetInPlaceValueMetadataInitialization<Runtime>> {
3919+
TargetSingletonMetadataInitialization<Runtime>> {
39103920
public:
3911-
using InPlaceMetadataInitialization =
3912-
TargetInPlaceValueMetadataInitialization<Runtime>;
3921+
using SingletonMetadataInitialization =
3922+
TargetSingletonMetadataInitialization<Runtime>;
39133923
using ForeignMetadataInitialization =
39143924
TargetForeignMetadataInitialization<Runtime>;
39153925

@@ -3918,7 +3928,7 @@ class TargetEnumDescriptor final
39183928
TrailingGenericContextObjects<TargetEnumDescriptor<Runtime>,
39193929
TargetTypeGenericContextDescriptorHeader,
39203930
ForeignMetadataInitialization,
3921-
InPlaceMetadataInitialization>;
3931+
SingletonMetadataInitialization>;
39223932

39233933
using TrailingObjects =
39243934
typename TrailingGenericContextObjects::TrailingObjects;
@@ -3932,8 +3942,8 @@ class TargetEnumDescriptor final
39323942
return this->hasForeignMetadataInitialization() ? 1 : 0;
39333943
}
39343944

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;
39373947
}
39383948

39393949
public:
@@ -3977,9 +3987,9 @@ class TargetEnumDescriptor final
39773987
return *this->template getTrailingObjects<ForeignMetadataInitialization>();
39783988
}
39793989

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>();
39833993
}
39843994

39853995
static bool classof(const TargetContextDescriptor<Runtime> *cd) {
@@ -4089,18 +4099,18 @@ TargetTypeContextDescriptor<Runtime>::getForeignMetadataInitialization() const {
40894099
}
40904100

40914101
template<typename Runtime>
4092-
inline const TargetInPlaceValueMetadataInitialization<Runtime> &
4093-
TargetTypeContextDescriptor<Runtime>::getInPlaceMetadataInitialization() const {
4102+
inline const TargetSingletonMetadataInitialization<Runtime> &
4103+
TargetTypeContextDescriptor<Runtime>::getSingletonMetadataInitialization() const {
40944104
switch (this->getKind()) {
40954105
case ContextDescriptorKind::Enum:
40964106
return llvm::cast<TargetEnumDescriptor<Runtime>>(this)
4097-
->getInPlaceMetadataInitialization();
4107+
->getSingletonMetadataInitialization();
40984108
case ContextDescriptorKind::Struct:
40994109
return llvm::cast<TargetStructDescriptor<Runtime>>(this)
4100-
->getInPlaceMetadataInitialization();
4110+
->getSingletonMetadataInitialization();
41014111
case ContextDescriptorKind::Class:
41024112
return llvm::cast<TargetClassDescriptor<Runtime>>(this)
4103-
->getInPlaceMetadataInitialization();
4113+
->getSingletonMetadataInitialization();
41044114
default:
41054115
swift_runtime_unreachable("Not a enum, struct or class type descriptor.");
41064116
}

include/swift/ABI/MetadataValues.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,7 +1271,7 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
12711271

12721272
/// The type requires non-trivial singleton initialization using the
12731273
/// "in-place" code pattern.
1274-
InPlaceMetadataInitialization = 1,
1274+
SingletonMetadataInitialization = 1,
12751275

12761276
/// The type requires non-trivial singleton initialization using the
12771277
/// "foreign" code pattern.
@@ -1287,8 +1287,8 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
12871287
getMetadataInitialization,
12881288
setMetadataInitialization)
12891289

1290-
bool hasInPlaceMetadataInitialization() const {
1291-
return getMetadataInitialization() == InPlaceMetadataInitialization;
1290+
bool hasSingletonMetadataInitialization() const {
1291+
return getMetadataInitialization() == SingletonMetadataInitialization;
12921292
}
12931293

12941294
bool hasForeignMetadataInitialization() const {

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ NODE(TypeMetadataAccessFunction)
184184
NODE(TypeMetadataCompletionFunction)
185185
NODE(TypeMetadataInstantiationCache)
186186
NODE(TypeMetadataInstantiationFunction)
187-
NODE(TypeMetadataInPlaceInitializationCache)
187+
NODE(TypeMetadataSingletonInitializationCache)
188188
NODE(TypeMetadataLazyCache)
189189
NODE(UncurriedFunctionType)
190190
#define REF_STORAGE(Name, ...) NODE(Name)

include/swift/IRGen/Linking.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class LinkEntity {
165165

166166
/// The in-place initialization cache for a generic nominal type.
167167
/// The pointer is a NominalTypeDecl*.
168-
TypeMetadataInPlaceInitializationCache,
168+
TypeMetadataSingletonInitializationCache,
169169

170170
/// The completion function for a generic or resilient nominal type.
171171
/// The pointer is a NominalTypeDecl*.
@@ -513,10 +513,10 @@ class LinkEntity {
513513
return entity;
514514
}
515515

516-
static LinkEntity forTypeMetadataInPlaceInitializationCache(
516+
static LinkEntity forTypeMetadataSingletonInitializationCache(
517517
NominalTypeDecl *decl) {
518518
LinkEntity entity;
519-
entity.setForDecl(Kind::TypeMetadataInPlaceInitializationCache, decl);
519+
entity.setForDecl(Kind::TypeMetadataSingletonInitializationCache, decl);
520520
return entity;
521521
}
522522

include/swift/Remote/MetadataReader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,9 +1204,9 @@ class MetadataReader {
12041204
switch (typeFlags.getMetadataInitialization()) {
12051205
case TypeContextDescriptorFlags::NoMetadataInitialization:
12061206
return 0;
1207-
case TypeContextDescriptorFlags::InPlaceMetadataInitialization:
1207+
case TypeContextDescriptorFlags::SingletonMetadataInitialization:
12081208
// FIXME: classes
1209-
return sizeof(TargetInPlaceValueMetadataInitialization<Runtime>);
1209+
return sizeof(TargetSingletonMetadataInitialization<Runtime>);
12101210
case TypeContextDescriptorFlags::ForeignMetadataInitialization:
12111211
return sizeof(TargetForeignMetadataInitialization<Runtime>);
12121212
}

include/swift/Runtime/Metadata.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,11 +330,11 @@ ClassMetadataBounds getResilientMetadataBounds(
330330
int32_t getResilientImmediateMembersOffset(const ClassDescriptor *descriptor);
331331

332332
/// \brief Fetch a uniqued metadata object for a nominal type which requires
333-
/// in-place metadata initialization.
333+
/// singleton metadata initialization.
334334
SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
335335
MetadataResponse
336-
swift_getInPlaceMetadata(MetadataRequest request,
337-
const TypeContextDescriptor *description);
336+
swift_getSingletonMetadata(MetadataRequest request,
337+
const TypeContextDescriptor *description);
338338

339339
/// \brief Fetch a uniqued metadata object for a generic nominal type.
340340
SWIFT_RUNTIME_EXPORT SWIFT_CC(swift)
@@ -577,6 +577,9 @@ void swift_initStructMetadata(StructMetadata *self,
577577
/// Allocate the metadata for a class and copy fields from the given pattern.
578578
/// The final size of the metadata is calculated at runtime from the metadata
579579
/// bounds in the class descriptor.
580+
///
581+
/// This function is only intended to be called from the relocation function
582+
/// of a resilient class pattern.
580583
SWIFT_RUNTIME_EXPORT
581584
ClassMetadata *
582585
swift_relocateClassMetadata(ClassDescriptor *descriptor,

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -653,9 +653,9 @@ FUNCTION(GetForeignWitnessTable, swift_getForeignWitnessTable, C_CC,
653653
ProtocolDescriptorPtrTy),
654654
ATTRS(NoUnwind, ReadNone))
655655

656-
// MetadataResponse swift_getInPlaceMetadata(MetadataRequest request,
657-
// TypeContextDescriptor *type);
658-
FUNCTION(GetInPlaceMetadata, swift_getInPlaceMetadata, SwiftCC,
656+
// MetadataResponse swift_getSingletonMetadata(MetadataRequest request,
657+
// TypeContextDescriptor *type);
658+
FUNCTION(GetSingletonMetadata, swift_getSingletonMetadata, SwiftCC,
659659
RETURNS(TypeMetadataResponseTy),
660660
ARGS(SizeTy, TypeContextDescriptorPtrTy),
661661
ATTRS(NoUnwind, ReadNone))

0 commit comments

Comments
 (0)