mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Merge pull request #79302 from mikeash/singleton-metadata-pointer
[IRGen] Emit a pointer from nominal type descriptor to concrete metadata.
This commit is contained in:
@@ -3879,6 +3879,13 @@ struct TargetCanonicalSpecializedMetadatasCachingOnceToken {
|
||||
TargetRelativeDirectPointer<Runtime, swift_once_t, /*Nullable*/ false> token;
|
||||
};
|
||||
|
||||
template <typename Runtime>
|
||||
struct TargetSingletonMetadataPointer {
|
||||
TargetRelativeDirectPointer<Runtime, TargetMetadata<Runtime>,
|
||||
/*Nullable*/ false>
|
||||
metadata;
|
||||
};
|
||||
|
||||
template <typename Runtime>
|
||||
class swift_ptrauth_struct_context_descriptor(TypeContextDescriptor)
|
||||
TargetTypeContextDescriptor : public TargetContextDescriptor<Runtime> {
|
||||
@@ -3931,7 +3938,15 @@ public:
|
||||
}
|
||||
|
||||
bool hasCanonicalMetadataPrespecializations() const {
|
||||
return getTypeContextDescriptorFlags().hasCanonicalMetadataPrespecializations();
|
||||
return this->isGeneric() &&
|
||||
getTypeContextDescriptorFlags()
|
||||
.hasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer();
|
||||
}
|
||||
|
||||
bool hasSingletonMetadataPointer() const {
|
||||
return !this->isGeneric() &&
|
||||
getTypeContextDescriptorFlags()
|
||||
.hasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer();
|
||||
}
|
||||
|
||||
bool hasLayoutString() const {
|
||||
@@ -4123,7 +4138,8 @@ class swift_ptrauth_struct_context_descriptor(ClassDescriptor)
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
|
||||
InvertibleProtocolSet> {
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>> {
|
||||
private:
|
||||
using TrailingGenericContextObjects =
|
||||
swift::TrailingGenericContextObjects<TargetClassDescriptor<Runtime>,
|
||||
@@ -4140,7 +4156,8 @@ private:
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
|
||||
InvertibleProtocolSet>;
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>>;
|
||||
|
||||
using TrailingObjects =
|
||||
typename TrailingGenericContextObjects::TrailingObjects;
|
||||
@@ -4170,6 +4187,7 @@ public:
|
||||
TargetCanonicalSpecializedMetadataAccessorsListEntry<Runtime>;
|
||||
using MetadataCachingOnceToken =
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
|
||||
using SingletonMetadataPointer = TargetSingletonMetadataPointer<Runtime>;
|
||||
|
||||
using StoredPointer = typename Runtime::StoredPointer;
|
||||
using StoredPointerDifference = typename Runtime::StoredPointerDifference;
|
||||
@@ -4311,6 +4329,10 @@ private:
|
||||
return this->hasCanonicalMetadataPrespecializations() ? 1 : 0;
|
||||
}
|
||||
|
||||
size_t numTrailingObjects(OverloadToken<SingletonMetadataPointer>) const {
|
||||
return this->hasSingletonMetadataPointer() ? 1 : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
const TargetRelativeDirectPointer<Runtime, const void, /*nullable*/true> &
|
||||
getResilientSuperclass() const {
|
||||
@@ -4490,6 +4512,14 @@ public:
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
TargetMetadata<Runtime> *getSingletonMetadata() const {
|
||||
if (!this->hasSingletonMetadataInitialization())
|
||||
return nullptr;
|
||||
|
||||
auto box = this->template getTrailingObjects<SingletonMetadataPointer>();
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
/// Retrieve the set of protocols that are inverted by this type's
|
||||
/// primary definition.
|
||||
///
|
||||
@@ -4537,7 +4567,8 @@ class swift_ptrauth_struct_context_descriptor(StructDescriptor)
|
||||
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
|
||||
InvertibleProtocolSet> {
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>> {
|
||||
public:
|
||||
using ForeignMetadataInitialization =
|
||||
TargetForeignMetadataInitialization<Runtime>;
|
||||
@@ -4551,6 +4582,7 @@ public:
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
|
||||
using MetadataCachingOnceToken =
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
|
||||
using SingletonMetadataPointer = TargetSingletonMetadataPointer<Runtime>;
|
||||
|
||||
private:
|
||||
using TrailingGenericContextObjects =
|
||||
@@ -4561,7 +4593,8 @@ private:
|
||||
MetadataListCount,
|
||||
MetadataListEntry,
|
||||
MetadataCachingOnceToken,
|
||||
InvertibleProtocolSet>;
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>>;
|
||||
|
||||
using TrailingObjects =
|
||||
typename TrailingGenericContextObjects::TrailingObjects;
|
||||
@@ -4595,6 +4628,10 @@ private:
|
||||
return this->hasCanonicalMetadataPrespecializations() ? 1 : 0;
|
||||
}
|
||||
|
||||
size_t numTrailingObjects(OverloadToken<SingletonMetadataPointer>) const {
|
||||
return this->hasSingletonMetadataPointer() ? 1 : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
using TrailingGenericContextObjects::getGenericContext;
|
||||
using TrailingGenericContextObjects::getGenericContextHeader;
|
||||
@@ -4648,6 +4685,14 @@ public:
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
TargetMetadata<Runtime> *getSingletonMetadata() const {
|
||||
if (!this->hasSingletonMetadataInitialization())
|
||||
return nullptr;
|
||||
|
||||
auto box = this->template getTrailingObjects<SingletonMetadataPointer>();
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
/// Retrieve the set of protocols that are inverted by this type's
|
||||
/// primary definition.
|
||||
///
|
||||
@@ -4684,7 +4729,8 @@ class swift_ptrauth_struct_context_descriptor(EnumDescriptor)
|
||||
TargetCanonicalSpecializedMetadatasListCount<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>,
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>,
|
||||
InvertibleProtocolSet> {
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>> {
|
||||
public:
|
||||
using SingletonMetadataInitialization =
|
||||
TargetSingletonMetadataInitialization<Runtime>;
|
||||
@@ -4698,6 +4744,7 @@ public:
|
||||
TargetCanonicalSpecializedMetadatasListEntry<Runtime>;
|
||||
using MetadataCachingOnceToken =
|
||||
TargetCanonicalSpecializedMetadatasCachingOnceToken<Runtime>;
|
||||
using SingletonMetadataPointer = TargetSingletonMetadataPointer<Runtime>;
|
||||
|
||||
private:
|
||||
using TrailingGenericContextObjects =
|
||||
@@ -4708,7 +4755,8 @@ private:
|
||||
MetadataListCount,
|
||||
MetadataListEntry,
|
||||
MetadataCachingOnceToken,
|
||||
InvertibleProtocolSet>;
|
||||
InvertibleProtocolSet,
|
||||
TargetSingletonMetadataPointer<Runtime>>;
|
||||
|
||||
using TrailingObjects =
|
||||
typename TrailingGenericContextObjects::TrailingObjects;
|
||||
@@ -4742,6 +4790,10 @@ private:
|
||||
return this->hasCanonicalMetadataPrespecializations() ? 1 : 0;
|
||||
}
|
||||
|
||||
size_t numTrailingObjects(OverloadToken<SingletonMetadataPointer>) const {
|
||||
return this->hasSingletonMetadataPointer() ? 1 : 0;
|
||||
}
|
||||
|
||||
public:
|
||||
using TrailingGenericContextObjects::getGenericContext;
|
||||
using TrailingGenericContextObjects::getGenericContextHeader;
|
||||
@@ -4809,6 +4861,14 @@ public:
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
TargetMetadata<Runtime> *getSingletonMetadata() const {
|
||||
if (!this->hasSingletonMetadataInitialization())
|
||||
return nullptr;
|
||||
|
||||
auto box = this->template getTrailingObjects<SingletonMetadataPointer>();
|
||||
return box->token.get();
|
||||
}
|
||||
|
||||
/// Retrieve the set of protocols that are inverted by this type's
|
||||
/// primary definition.
|
||||
///
|
||||
|
||||
@@ -1872,9 +1872,10 @@ class TypeContextDescriptorFlags : public FlagSet<uint16_t> {
|
||||
/// Meaningful for all type-descriptor kinds.
|
||||
HasImportInfo = 2,
|
||||
|
||||
/// Set if the type descriptor has a pointer to a list of canonical
|
||||
/// prespecializations.
|
||||
HasCanonicalMetadataPrespecializations = 3,
|
||||
/// Set if the generic type descriptor has a pointer to a list of canonical
|
||||
/// prespecializations, or the non-generic type descriptor has a pointer to
|
||||
/// its singleton metadata.
|
||||
HasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer = 3,
|
||||
|
||||
/// Set if the metadata contains a pointer to a layout string
|
||||
HasLayoutString = 4,
|
||||
@@ -1959,7 +1960,10 @@ public:
|
||||
|
||||
FLAGSET_DEFINE_FLAG_ACCESSORS(HasImportInfo, hasImportInfo, setHasImportInfo)
|
||||
|
||||
FLAGSET_DEFINE_FLAG_ACCESSORS(HasCanonicalMetadataPrespecializations, hasCanonicalMetadataPrespecializations, setHasCanonicalMetadataPrespecializations)
|
||||
FLAGSET_DEFINE_FLAG_ACCESSORS(
|
||||
HasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer,
|
||||
hasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer,
|
||||
setHasCanonicalMetadataPrespecializationsOrSingletonMetadataPointer)
|
||||
|
||||
FLAGSET_DEFINE_FLAG_ACCESSORS(HasLayoutString,
|
||||
hasLayoutString,
|
||||
|
||||
@@ -406,6 +406,10 @@ public:
|
||||
/// arguments.
|
||||
unsigned PrespecializeGenericMetadata : 1;
|
||||
|
||||
/// Emit pointers to the corresponding type metadata in non-public non-generic
|
||||
/// type descriptors.
|
||||
unsigned EmitSingletonMetadataPointers : 1;
|
||||
|
||||
/// The path to load legacy type layouts from.
|
||||
StringRef ReadLegacyTypeInfoPath;
|
||||
|
||||
@@ -597,7 +601,8 @@ public:
|
||||
LazyInitializeProtocolConformances(false),
|
||||
IndirectAsyncFunctionPointer(false), IndirectCoroFunctionPointer(false),
|
||||
CompactAbsoluteFunctionPointer(false), DisableLegacyTypeInfo(false),
|
||||
PrespecializeGenericMetadata(false), UseIncrementalLLVMCodeGen(true),
|
||||
PrespecializeGenericMetadata(false),
|
||||
EmitSingletonMetadataPointers(false), UseIncrementalLLVMCodeGen(true),
|
||||
UseTypeLayoutValueHandling(true), ForceStructTypeLayouts(false),
|
||||
EnableLargeLoadableTypesReg2Mem(true),
|
||||
EnableLayoutStringValueWitnesses(false),
|
||||
|
||||
@@ -1116,6 +1116,10 @@ def prespecialize_generic_metadata : Flag<["-"], "prespecialize-generic-metadata
|
||||
HelpText<"Statically specialize metadata for generic types at types that "
|
||||
"are known to be used in source.">;
|
||||
|
||||
def emit_singleton_metadata_pointer : Flag<["-"], "emit-singleton-metadata-pointer">,
|
||||
HelpText<"Emit a pointer to the corresponding type metadata into non-public "
|
||||
"non-generic type descriptors.">;
|
||||
|
||||
def read_legacy_type_info_path_EQ : Joined<["-"], "read-legacy-type-info-path=">,
|
||||
HelpText<"Read legacy type layout from the given path instead of default path">;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user