Move FieldIdx and Layout to rustc_target
This commit is contained in:
parent
b47ad3b744
commit
f14b7c9443
@ -4473,6 +4473,7 @@ dependencies = [
|
|||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
"rustc_feature",
|
"rustc_feature",
|
||||||
"rustc_fs_util",
|
"rustc_fs_util",
|
||||||
|
"rustc_index",
|
||||||
"rustc_macros",
|
"rustc_macros",
|
||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
|
@ -1105,32 +1105,6 @@ impl Scalar {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rustc_index::newtype_index! {
|
|
||||||
/// The *source-order* index of a field in a variant.
|
|
||||||
///
|
|
||||||
/// This is how most code after type checking refers to fields, rather than
|
|
||||||
/// using names (as names have hygiene complications and more complex lookup).
|
|
||||||
///
|
|
||||||
/// Particularly for `repr(Rust)` types, this may not be the same as *layout* order.
|
|
||||||
/// (It is for `repr(C)` `struct`s, however.)
|
|
||||||
///
|
|
||||||
/// For example, in the following types,
|
|
||||||
/// ```rust
|
|
||||||
/// # enum Never {}
|
|
||||||
/// # #[repr(u16)]
|
|
||||||
/// enum Demo1 {
|
|
||||||
/// Variant0 { a: Never, b: i32 } = 100,
|
|
||||||
/// Variant1 { c: u8, d: u64 } = 10,
|
|
||||||
/// }
|
|
||||||
/// struct Demo2 { e: u8, f: u16, g: u8 }
|
|
||||||
/// ```
|
|
||||||
/// `b` is `FieldIdx(1)` in `VariantIdx(0)`,
|
|
||||||
/// `d` is `FieldIdx(1)` in `VariantIdx(1)`, and
|
|
||||||
/// `f` is `FieldIdx(1)` in `VariantIdx(0)`.
|
|
||||||
#[derive(HashStable_Generic)]
|
|
||||||
pub struct FieldIdx {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Describes how the fields of a type are located in memory.
|
/// Describes how the fields of a type are located in memory.
|
||||||
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
|
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
|
||||||
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
|
#[cfg_attr(feature = "nightly", derive(HashStable_Generic))]
|
||||||
@ -1624,61 +1598,6 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, HashStable_Generic)]
|
|
||||||
#[rustc_pass_by_value]
|
|
||||||
pub struct Layout<'a>(pub Interned<'a, LayoutS<FieldIdx>>);
|
|
||||||
|
|
||||||
impl<'a> fmt::Debug for Layout<'a> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
// See comment on `<LayoutS as Debug>::fmt` above.
|
|
||||||
self.0.0.fmt(f)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> Layout<'a> {
|
|
||||||
pub fn fields(self) -> &'a FieldsShape<FieldIdx> {
|
|
||||||
&self.0.0.fields
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn variants(self) -> &'a Variants<FieldIdx> {
|
|
||||||
&self.0.0.variants
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn abi(self) -> Abi {
|
|
||||||
self.0.0.abi
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn largest_niche(self) -> Option<Niche> {
|
|
||||||
self.0.0.largest_niche
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn align(self) -> AbiAndPrefAlign {
|
|
||||||
self.0.0.align
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn size(self) -> Size {
|
|
||||||
self.0.0.size
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn max_repr_align(self) -> Option<Align> {
|
|
||||||
self.0.0.max_repr_align
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn unadjusted_abi_align(self) -> Align {
|
|
||||||
self.0.0.unadjusted_abi_align
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Whether the layout is from a type that implements [`std::marker::PointerLike`].
|
|
||||||
///
|
|
||||||
/// Currently, that means that the type is pointer-sized, pointer-aligned,
|
|
||||||
/// and has a scalar ABI.
|
|
||||||
pub fn is_pointer_like(self, data_layout: &TargetDataLayout) -> bool {
|
|
||||||
self.size() == data_layout.pointer_size
|
|
||||||
&& self.align().abi == data_layout.pointer_align.abi
|
|
||||||
&& matches!(self.abi(), Abi::Scalar(..))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
|
||||||
pub enum PointerKind {
|
pub enum PointerKind {
|
||||||
/// Shared reference. `frozen` indicates the absence of any `UnsafeCell`.
|
/// Shared reference. `frozen` indicates the absence of any `UnsafeCell`.
|
||||||
|
@ -14,6 +14,7 @@ rustc_feature = { path = "../rustc_feature" }
|
|||||||
rustc_macros = { path = "../rustc_macros" }
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
rustc_serialize = { path = "../rustc_serialize" }
|
rustc_serialize = { path = "../rustc_serialize" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
|
rustc_index = { path = "../rustc_index" }
|
||||||
|
|
||||||
[dependencies.object]
|
[dependencies.object]
|
||||||
version = "0.32.0"
|
version = "0.32.0"
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use rustc_data_structures::intern::Interned;
|
||||||
pub use Integer::*;
|
pub use Integer::*;
|
||||||
pub use Primitive::*;
|
pub use Primitive::*;
|
||||||
|
|
||||||
@ -18,6 +19,87 @@ impl ToJson for Endian {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rustc_index::newtype_index! {
|
||||||
|
/// The *source-order* index of a field in a variant.
|
||||||
|
///
|
||||||
|
/// This is how most code after type checking refers to fields, rather than
|
||||||
|
/// using names (as names have hygiene complications and more complex lookup).
|
||||||
|
///
|
||||||
|
/// Particularly for `repr(Rust)` types, this may not be the same as *layout* order.
|
||||||
|
/// (It is for `repr(C)` `struct`s, however.)
|
||||||
|
///
|
||||||
|
/// For example, in the following types,
|
||||||
|
/// ```rust
|
||||||
|
/// # enum Never {}
|
||||||
|
/// # #[repr(u16)]
|
||||||
|
/// enum Demo1 {
|
||||||
|
/// Variant0 { a: Never, b: i32 } = 100,
|
||||||
|
/// Variant1 { c: u8, d: u64 } = 10,
|
||||||
|
/// }
|
||||||
|
/// struct Demo2 { e: u8, f: u16, g: u8 }
|
||||||
|
/// ```
|
||||||
|
/// `b` is `FieldIdx(1)` in `VariantIdx(0)`,
|
||||||
|
/// `d` is `FieldIdx(1)` in `VariantIdx(1)`, and
|
||||||
|
/// `f` is `FieldIdx(1)` in `VariantIdx(0)`.
|
||||||
|
#[derive(HashStable_Generic)]
|
||||||
|
pub struct FieldIdx {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Eq, Hash, HashStable_Generic)]
|
||||||
|
#[rustc_pass_by_value]
|
||||||
|
pub struct Layout<'a>(pub Interned<'a, LayoutS<FieldIdx>>);
|
||||||
|
|
||||||
|
impl<'a> fmt::Debug for Layout<'a> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
// See comment on `<LayoutS as Debug>::fmt` above.
|
||||||
|
self.0.0.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Layout<'a> {
|
||||||
|
pub fn fields(self) -> &'a FieldsShape<FieldIdx> {
|
||||||
|
&self.0.0.fields
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn variants(self) -> &'a Variants<FieldIdx> {
|
||||||
|
&self.0.0.variants
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn abi(self) -> Abi {
|
||||||
|
self.0.0.abi
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn largest_niche(self) -> Option<Niche> {
|
||||||
|
self.0.0.largest_niche
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn align(self) -> AbiAndPrefAlign {
|
||||||
|
self.0.0.align
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn size(self) -> Size {
|
||||||
|
self.0.0.size
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn max_repr_align(self) -> Option<Align> {
|
||||||
|
self.0.0.max_repr_align
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn unadjusted_abi_align(self) -> Align {
|
||||||
|
self.0.0.unadjusted_abi_align
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether the layout is from a type that implements [`std::marker::PointerLike`].
|
||||||
|
///
|
||||||
|
/// Currently, that means that the type is pointer-sized, pointer-aligned,
|
||||||
|
/// and has a scalar ABI.
|
||||||
|
pub fn is_pointer_like(self, data_layout: &TargetDataLayout) -> bool {
|
||||||
|
self.size() == data_layout.pointer_size
|
||||||
|
&& self.align().abi == data_layout.pointer_align.abi
|
||||||
|
&& matches!(self.abi(), Abi::Scalar(..))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The layout of a type, alongside the type itself.
|
/// The layout of a type, alongside the type itself.
|
||||||
/// Provides various type traversal APIs (e.g., recursing into fields).
|
/// Provides various type traversal APIs (e.g., recursing into fields).
|
||||||
///
|
///
|
||||||
|
Loading…
x
Reference in New Issue
Block a user