mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
109 lines
2.9 KiB
C++
109 lines
2.9 KiB
C++
//===--- MetadataSource.h - structure for the source of metadata *- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_IRGEN_METADATA_SOURCE_H
|
|
#define SWIFT_IRGEN_METADATA_SOURCE_H
|
|
|
|
#include "swift/AST/Types.h"
|
|
|
|
namespace swift {
|
|
namespace irgen {
|
|
|
|
class MetadataSource {
|
|
public:
|
|
enum class Kind {
|
|
/// Metadata is derived from a source class pointer.
|
|
ClassPointer,
|
|
|
|
/// Metadata is derived from a type metadata pointer.
|
|
Metadata,
|
|
|
|
/// Metadata is derived from the origin type parameter.
|
|
GenericLValueMetadata,
|
|
|
|
/// Metadata is obtained directly from the from a Self metadata
|
|
/// parameter passed via the WitnessMethod convention.
|
|
SelfMetadata,
|
|
|
|
/// Metadata is derived from the Self witness table parameter
|
|
/// passed via the WitnessMethod convention.
|
|
SelfWitnessTable,
|
|
|
|
/// Metadata is obtained directly from the FixedType indicated. Used with
|
|
/// Objective-C generics, where the actual argument is erased at runtime
|
|
/// and its existential bound is used instead.
|
|
ErasedTypeMetadata,
|
|
};
|
|
|
|
static bool requiresSourceIndex(Kind kind) {
|
|
return (kind == Kind::ClassPointer ||
|
|
kind == Kind::Metadata ||
|
|
kind == Kind::GenericLValueMetadata);
|
|
}
|
|
|
|
static bool requiresFixedType(Kind kind) {
|
|
return (kind == Kind::ErasedTypeMetadata);
|
|
}
|
|
|
|
enum : unsigned { InvalidSourceIndex = ~0U };
|
|
|
|
private:
|
|
/// The kind of source this is.
|
|
Kind TheKind;
|
|
|
|
/// For ClassPointer, Metadata, and GenericLValueMetadata, the source index;
|
|
/// for ErasedTypeMetadata, the type; for others, Index should be set to
|
|
/// InvalidSourceIndex.
|
|
union {
|
|
unsigned Index;
|
|
CanType FixedType;
|
|
};
|
|
|
|
public:
|
|
CanType Type;
|
|
|
|
MetadataSource(Kind kind, CanType type)
|
|
: TheKind(kind), Index(InvalidSourceIndex), Type(type)
|
|
{
|
|
assert(!requiresSourceIndex(kind) && !requiresFixedType(kind));
|
|
}
|
|
|
|
|
|
MetadataSource(Kind kind, CanType type, unsigned index)
|
|
: TheKind(kind), Index(index), Type(type) {
|
|
assert(requiresSourceIndex(kind));
|
|
assert(index != InvalidSourceIndex);
|
|
}
|
|
|
|
MetadataSource(Kind kind, CanType type, CanType fixedType)
|
|
: TheKind(kind), FixedType(fixedType), Type(type) {
|
|
assert(requiresFixedType(kind));
|
|
}
|
|
|
|
Kind getKind() const { return TheKind; }
|
|
|
|
unsigned getParamIndex() const {
|
|
assert(requiresSourceIndex(getKind()));
|
|
return Index;
|
|
}
|
|
|
|
CanType getFixedType() const {
|
|
assert(requiresFixedType(getKind()));
|
|
return FixedType;
|
|
}
|
|
};
|
|
|
|
} // end namespace irgen
|
|
} // end namespace swift
|
|
|
|
#endif
|