Skip to content

Commit 00e143c

Browse files
committed
[Runtime] Add trailing prespecializations to type descriptor.
The attachment of the canonical prespecializations to the generic type will enable runtime functions to look through the canonical prespecializations in order to return them (getGenericMetadata) and register them with the runtime (getSpecializedGenericMetadata).
1 parent 3ad2777 commit 00e143c

File tree

2 files changed

+182
-6
lines changed

2 files changed

+182
-6
lines changed

include/swift/ABI/Metadata.h

Lines changed: 176 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3772,6 +3772,21 @@ struct TargetSingletonMetadataInitialization {
37723772
const TargetTypeContextDescriptor<Runtime> *description) const;
37733773
};
37743774

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+
37753790
template <typename Runtime>
37763791
class TargetTypeContextDescriptor
37773792
: public TargetContextDescriptor<Runtime> {
@@ -3821,6 +3836,10 @@ class TargetTypeContextDescriptor
38213836
return getTypeContextDescriptorFlags().hasForeignMetadataInitialization();
38223837
}
38233838

3839+
bool hasCanonicicalMetadataPrespecializations() const {
3840+
return getTypeContextDescriptorFlags().hasCanonicalMetadataPrespecializations();
3841+
}
3842+
38243843
/// Given that this type has foreign metadata initialization, return the
38253844
/// control structure for it.
38263845
const TargetForeignMetadataInitialization<Runtime> &
@@ -3853,6 +3872,9 @@ class TargetTypeContextDescriptor
38533872
return words + offset;
38543873
}
38553874

3875+
const llvm::ArrayRef<TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /*Nullable*/ false>>
3876+
getCanonicicalMetadataPrespecializations() const;
3877+
38563878
static bool classof(const TargetContextDescriptor<Runtime> *cd) {
38573879
return cd->getKind() >= ContextDescriptorKind::Type_First
38583880
&& cd->getKind() <= ContextDescriptorKind::Type_Last;
@@ -3990,7 +4012,10 @@ class TargetClassDescriptor final
39904012
TargetMethodDescriptor<Runtime>,
39914013
TargetOverrideTableHeader<Runtime>,
39924014
TargetMethodOverrideDescriptor<Runtime>,
3993-
TargetObjCResilientClassStubInfo<Runtime>> {
4015+
TargetObjCResilientClassStubInfo<Runtime>,
4016+
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4017+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4018+
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>> {
39944019
private:
39954020
using TrailingGenericContextObjects =
39964021
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
@@ -4002,7 +4027,10 @@ class TargetClassDescriptor final
40024027
TargetMethodDescriptor<Runtime>,
40034028
TargetOverrideTableHeader<Runtime>,
40044029
TargetMethodOverrideDescriptor<Runtime>,
4005-
TargetObjCResilientClassStubInfo<Runtime>>;
4030+
TargetObjCResilientClassStubInfo<Runtime>,
4031+
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4032+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
4033+
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>>;
40064034

40074035
using TrailingObjects =
40084036
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4020,6 +4048,16 @@ class TargetClassDescriptor final
40204048
TargetSingletonMetadataInitialization<Runtime>;
40214049
using ObjCResilientClassStubInfo =
40224050
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>;
40234061

40244062
using StoredPointer = typename Runtime::StoredPointer;
40254063
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
@@ -4139,6 +4177,24 @@ class TargetClassDescriptor final
41394177
return hasObjCResilientClassStub() ? 1 : 0;
41404178
}
41414179

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+
41424198
public:
41434199
const TargetRelativeDirectPointer<Runtime, const void, /*nullable*/true> &
41444200
getResilientSuperclass() const {
@@ -4276,6 +4332,32 @@ class TargetClassDescriptor final
42764332
->Stub.get();
42774333
}
42784334

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+
42794361
static bool classof(const TargetContextDescriptor<Runtime> *cd) {
42804362
return cd->getKind() == ContextDescriptorKind::Class;
42814363
}
@@ -4301,19 +4383,29 @@ class TargetStructDescriptor final
43014383
TargetTypeGenericContextDescriptorHeader,
43024384
/*additional trailing objects*/
43034385
TargetForeignMetadataInitialization<Runtime>,
4304-
TargetSingletonMetadataInitialization<Runtime>> {
4386+
TargetSingletonMetadataInitialization<Runtime>,
4387+
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4388+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
43054389
public:
43064390
using ForeignMetadataInitialization =
43074391
TargetForeignMetadataInitialization<Runtime>;
43084392
using SingletonMetadataInitialization =
43094393
TargetSingletonMetadataInitialization<Runtime>;
4394+
using Metadata =
4395+
TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /*Nullable*/ false>;
4396+
using MetadataListCount =
4397+
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4398+
using MetadataListEntry =
4399+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
43104400

43114401
private:
43124402
using TrailingGenericContextObjects =
43134403
swift::TrailingGenericContextObjects<TargetStructDescriptor<Runtime>,
43144404
TargetTypeGenericContextDescriptorHeader,
43154405
ForeignMetadataInitialization,
4316-
SingletonMetadataInitialization>;
4406+
SingletonMetadataInitialization,
4407+
MetadataListCount,
4408+
MetadataListEntry>;
43174409

43184410
using TrailingObjects =
43194411
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4331,6 +4423,18 @@ class TargetStructDescriptor final
43314423
return this->hasSingletonMetadataInitialization() ? 1 : 0;
43324424
}
43334425

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+
43344438
public:
43354439
using TrailingGenericContextObjects::getGenericContext;
43364440
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4363,6 +4467,19 @@ class TargetStructDescriptor final
43634467
return TargetStructMetadata<Runtime>::getGenericArgumentOffset();
43644468
}
43654469

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+
43664483
static bool classof(const TargetContextDescriptor<Runtime> *cd) {
43674484
return cd->getKind() == ContextDescriptorKind::Struct;
43684485
}
@@ -4377,19 +4494,29 @@ class TargetEnumDescriptor final
43774494
TargetTypeGenericContextDescriptorHeader,
43784495
/*additional trailing objects*/
43794496
TargetForeignMetadataInitialization<Runtime>,
4380-
TargetSingletonMetadataInitialization<Runtime>> {
4497+
TargetSingletonMetadataInitialization<Runtime>,
4498+
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
4499+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>> {
43814500
public:
43824501
using SingletonMetadataInitialization =
43834502
TargetSingletonMetadataInitialization<Runtime>;
43844503
using ForeignMetadataInitialization =
43854504
TargetForeignMetadataInitialization<Runtime>;
4505+
using Metadata =
4506+
TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>, /*Nullable*/ false>;
4507+
using MetadataListCount =
4508+
TargetCanonicalSpecializedMetadatasListCount<Runtime>;
4509+
using MetadataListEntry =
4510+
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
43864511

43874512
private:
43884513
using TrailingGenericContextObjects =
43894514
swift::TrailingGenericContextObjects<TargetEnumDescriptor<Runtime>,
43904515
TargetTypeGenericContextDescriptorHeader,
43914516
ForeignMetadataInitialization,
4392-
SingletonMetadataInitialization>;
4517+
SingletonMetadataInitialization,
4518+
MetadataListCount,
4519+
MetadataListEntry>;
43934520

43944521
using TrailingObjects =
43954522
typename TrailingGenericContextObjects::TrailingObjects;
@@ -4407,6 +4534,18 @@ class TargetEnumDescriptor final
44074534
return this->hasSingletonMetadataInitialization() ? 1 : 0;
44084535
}
44094536

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+
44104549
public:
44114550
using TrailingGenericContextObjects::getGenericContext;
44124551
using TrailingGenericContextObjects::getGenericContextHeader;
@@ -4453,6 +4592,19 @@ class TargetEnumDescriptor final
44534592
return *this->template getTrailingObjects<SingletonMetadataInitialization>();
44544593
}
44554594

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+
44564608
static bool classof(const TargetContextDescriptor<Runtime> *cd) {
44574609
return cd->getKind() == ContextDescriptorKind::Enum;
44584610
}
@@ -4587,6 +4739,24 @@ TargetTypeContextDescriptor<Runtime>::getSingletonMetadataInitialization() const
45874739
}
45884740
}
45894741

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+
45904760
/// An entry in the chain of dynamic replacement functions.
45914761
struct DynamicReplacementChainEntry {
45924762
void *implementationFunction;

include/swift/ABI/MetadataValues.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,10 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
13261326
/// Meaningful for all type-descriptor kinds.
13271327
HasImportInfo = 2,
13281328

1329+
/// Set if the type descriptor has a pointer to a list of canonical
1330+
/// prespecializations.
1331+
HasCanonicalMetadataPrespecializations = 3,
1332+
13291333
// Type-specific flags:
13301334

13311335
/// The kind of reference that this class makes to its resilient superclass
@@ -1393,6 +1397,8 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
13931397

13941398
FLAGSET_DEFINE_FLAG_ACCESSORS(HasImportInfo, hasImportInfo, setHasImportInfo)
13951399

1400+
FLAGSET_DEFINE_FLAG_ACCESSORS(HasCanonicalMetadataPrespecializations, hasCanonicalMetadataPrespecializations, setHasCanonicalMetadataPrespecializations)
1401+
13961402
FLAGSET_DEFINE_FLAG_ACCESSORS(Class_HasVTable,
13971403
class_hasVTable,
13981404
class_setHasVTable)

0 commit comments

Comments
 (0)