mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Template metadata structures
- Add RuntimeTarget template This will allow for converting between metadata structures for native host and remote target architectures. - Create InProcess and External templates for stored pointers Add a few more types to abstract pointer access in the runtime structures but keep native in-process pointer access the same as that with a plain old pointer type. There is now a notion of a "stored pointer", which is just the raw value of the pointer, and the actual pointer type, which is used for loads. Decoupling these allows us to fork the behavior when looking at metadata in an external process, but keep things the same for the in-process case. There are two basic "runtime targets" that you can use to work with metadata: InProcess: Defines the pointer to be trivially a T* and stored as a uintptr_t. A Metadata * is exactly as it was before, but defined via AbstractMetadata<InProcess>. External: A template that requires a target to specify its pointer size. ExternalPointer: An opaque pointer in another address space that can't (and shouldn't) be indirected with operator* or operator->. The memory reader will fetch the data explicitly.
This commit is contained in:
@@ -2071,7 +2071,7 @@ getExistentialValueWitnesses(ExistentialTypeState &E,
|
||||
}
|
||||
}
|
||||
|
||||
ExistentialTypeRepresentation
|
||||
template<> ExistentialTypeRepresentation
|
||||
ExistentialTypeMetadata::getRepresentation() const {
|
||||
// Some existentials use special containers.
|
||||
switch (Flags.getSpecialProtocol()) {
|
||||
@@ -2088,7 +2088,7 @@ ExistentialTypeMetadata::getRepresentation() const {
|
||||
return ExistentialTypeRepresentation::Opaque;
|
||||
}
|
||||
|
||||
bool
|
||||
template<> bool
|
||||
ExistentialTypeMetadata::mayTakeValue(const OpaqueValue *container) const {
|
||||
switch (getRepresentation()) {
|
||||
// Owning a reference to a class existential is equivalent to owning a
|
||||
@@ -2112,7 +2112,7 @@ ExistentialTypeMetadata::mayTakeValue(const OpaqueValue *container) const {
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
template<> void
|
||||
ExistentialTypeMetadata::deinitExistentialContainer(OpaqueValue *container)
|
||||
const {
|
||||
switch (getRepresentation()) {
|
||||
@@ -2135,7 +2135,7 @@ const {
|
||||
}
|
||||
}
|
||||
|
||||
const OpaqueValue *
|
||||
template<> const OpaqueValue *
|
||||
ExistentialTypeMetadata::projectValue(const OpaqueValue *container) const {
|
||||
switch (getRepresentation()) {
|
||||
case ExistentialTypeRepresentation::Class: {
|
||||
@@ -2161,7 +2161,7 @@ ExistentialTypeMetadata::projectValue(const OpaqueValue *container) const {
|
||||
}
|
||||
}
|
||||
|
||||
const Metadata *
|
||||
template<> const Metadata *
|
||||
ExistentialTypeMetadata::getDynamicType(const OpaqueValue *container) const {
|
||||
switch (getRepresentation()) {
|
||||
case ExistentialTypeRepresentation::Class: {
|
||||
@@ -2183,7 +2183,7 @@ ExistentialTypeMetadata::getDynamicType(const OpaqueValue *container) const {
|
||||
}
|
||||
}
|
||||
|
||||
const WitnessTable *
|
||||
template<> const WitnessTable *
|
||||
ExistentialTypeMetadata::getWitnessTable(const OpaqueValue *container,
|
||||
unsigned i) const {
|
||||
assert(i < Flags.getNumWitnessTables());
|
||||
@@ -2388,37 +2388,7 @@ swift::swift_getForeignTypeMetadata(ForeignTypeMetadata *nonUnique) {
|
||||
|
||||
/*** Other metadata routines ***********************************************/
|
||||
|
||||
const NominalTypeDescriptor *
|
||||
Metadata::getNominalTypeDescriptor() const {
|
||||
switch (getKind()) {
|
||||
case MetadataKind::Class: {
|
||||
const ClassMetadata *cls = static_cast<const ClassMetadata *>(this);
|
||||
if (!cls->isTypeMetadata())
|
||||
return nullptr;
|
||||
if (cls->isArtificialSubclass())
|
||||
return nullptr;
|
||||
return cls->getDescription();
|
||||
}
|
||||
case MetadataKind::Struct:
|
||||
case MetadataKind::Enum:
|
||||
case MetadataKind::Optional:
|
||||
return static_cast<const StructMetadata *>(this)->Description;
|
||||
case MetadataKind::ForeignClass:
|
||||
case MetadataKind::Opaque:
|
||||
case MetadataKind::Tuple:
|
||||
case MetadataKind::Function:
|
||||
case MetadataKind::Existential:
|
||||
case MetadataKind::ExistentialMetatype:
|
||||
case MetadataKind::Metatype:
|
||||
case MetadataKind::ObjCClassWrapper:
|
||||
case MetadataKind::HeapLocalVariable:
|
||||
case MetadataKind::HeapGenericLocalVariable:
|
||||
case MetadataKind::ErrorObject:
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
const GenericMetadata *
|
||||
template<> const GenericMetadata *
|
||||
Metadata::getGenericPattern() const {
|
||||
auto ntd = getNominalTypeDescriptor();
|
||||
if (!ntd)
|
||||
@@ -2426,7 +2396,7 @@ Metadata::getGenericPattern() const {
|
||||
return ntd->getGenericMetadataPattern();
|
||||
}
|
||||
|
||||
const ClassMetadata *
|
||||
template<> const ClassMetadata *
|
||||
Metadata::getClassObject() const {
|
||||
switch (getKind()) {
|
||||
case MetadataKind::Class: {
|
||||
|
||||
Reference in New Issue
Block a user