summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_transmute/src/layout
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /compiler/rustc_transmute/src/layout
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_transmute/src/layout')
-rw-r--r--compiler/rustc_transmute/src/layout/mod.rs42
-rw-r--r--compiler/rustc_transmute/src/layout/tree.rs23
2 files changed, 46 insertions, 19 deletions
diff --git a/compiler/rustc_transmute/src/layout/mod.rs b/compiler/rustc_transmute/src/layout/mod.rs
index f8d05bc89..76d97e0e6 100644
--- a/compiler/rustc_transmute/src/layout/mod.rs
+++ b/compiler/rustc_transmute/src/layout/mod.rs
@@ -30,33 +30,49 @@ impl fmt::Debug for Byte {
}
pub(crate) trait Def: Debug + Hash + Eq + PartialEq + Copy + Clone {}
-pub trait Ref: Debug + Hash + Eq + PartialEq + Copy + Clone {}
+pub trait Ref: Debug + Hash + Eq + PartialEq + Copy + Clone {
+ fn min_align(&self) -> usize;
+
+ fn is_mutable(&self) -> bool;
+}
impl Def for ! {}
-impl Ref for ! {}
+impl Ref for ! {
+ fn min_align(&self) -> usize {
+ unreachable!()
+ }
+ fn is_mutable(&self) -> bool {
+ unreachable!()
+ }
+}
#[cfg(feature = "rustc")]
-pub(crate) mod rustc {
+pub mod rustc {
use rustc_middle::mir::Mutability;
- use rustc_middle::ty;
- use rustc_middle::ty::Region;
- use rustc_middle::ty::Ty;
+ use rustc_middle::ty::{self, Ty};
/// A reference in the layout.
#[derive(Debug, Hash, Eq, PartialEq, PartialOrd, Ord, Clone, Copy)]
pub struct Ref<'tcx> {
- lifetime: Region<'tcx>,
- ty: Ty<'tcx>,
- mutability: Mutability,
+ pub lifetime: ty::Region<'tcx>,
+ pub ty: Ty<'tcx>,
+ pub mutability: Mutability,
+ pub align: usize,
}
- impl<'tcx> super::Ref for Ref<'tcx> {}
+ impl<'tcx> super::Ref for Ref<'tcx> {
+ fn min_align(&self) -> usize {
+ self.align
+ }
- impl<'tcx> Ref<'tcx> {
- pub fn min_align(&self) -> usize {
- todo!()
+ fn is_mutable(&self) -> bool {
+ match self.mutability {
+ Mutability::Mut => true,
+ Mutability::Not => false,
+ }
}
}
+ impl<'tcx> Ref<'tcx> {}
/// A visibility node in the layout.
#[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)]
diff --git a/compiler/rustc_transmute/src/layout/tree.rs b/compiler/rustc_transmute/src/layout/tree.rs
index a6d88b134..be434eb7d 100644
--- a/compiler/rustc_transmute/src/layout/tree.rs
+++ b/compiler/rustc_transmute/src/layout/tree.rs
@@ -188,14 +188,14 @@ pub(crate) mod rustc {
/// The layout of the type is unspecified.
Unspecified,
/// This error will be surfaced elsewhere by rustc, so don't surface it.
- Unknown,
+ UnknownLayout,
TypeError(ErrorGuaranteed),
}
- impl<'tcx> From<LayoutError<'tcx>> for Err {
- fn from(err: LayoutError<'tcx>) -> Self {
+ impl<'tcx> From<&LayoutError<'tcx>> for Err {
+ fn from(err: &LayoutError<'tcx>) -> Self {
match err {
- LayoutError::Unknown(..) => Self::Unknown,
+ LayoutError::Unknown(..) => Self::UnknownLayout,
err => unimplemented!("{:?}", err),
}
}
@@ -221,7 +221,7 @@ pub(crate) mod rustc {
}
impl LayoutSummary {
- fn from_ty<'tcx>(ty: Ty<'tcx>, ctx: TyCtxt<'tcx>) -> Result<Self, LayoutError<'tcx>> {
+ fn from_ty<'tcx>(ty: Ty<'tcx>, ctx: TyCtxt<'tcx>) -> Result<Self, &'tcx LayoutError<'tcx>> {
use rustc_middle::ty::ParamEnvAnd;
use rustc_target::abi::{TyAndLayout, Variants};
@@ -365,6 +365,17 @@ pub(crate) mod rustc {
}
}))
}
+
+ ty::Ref(lifetime, ty, mutability) => {
+ let align = layout_of(tcx, *ty)?.align();
+ Ok(Tree::Ref(Ref {
+ lifetime: *lifetime,
+ ty: *ty,
+ mutability: *mutability,
+ align,
+ }))
+ }
+
_ => Err(Err::Unspecified),
}
}
@@ -471,7 +482,7 @@ pub(crate) mod rustc {
fn layout_of<'tcx>(
ctx: TyCtxt<'tcx>,
ty: Ty<'tcx>,
- ) -> Result<alloc::Layout, LayoutError<'tcx>> {
+ ) -> Result<alloc::Layout, &'tcx LayoutError<'tcx>> {
use rustc_middle::ty::ParamEnvAnd;
use rustc_target::abi::TyAndLayout;