Skip to content

Commit 6dddf96

Browse files
Merge pull request #33442 from nate-chandler/generic-metadata-prespecialization-components/record-canonical-prespecializations
[metadata prespecialization] Add canonical prespecialization to end of type descriptors.
2 parents aa5195a + b140802 commit 6dddf96

17 files changed

+899
-135
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)