diff options
| author | Ralf Jung <post@ralfj.de> | 2020-05-02 12:08:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-02 12:08:10 +0200 |
| commit | 6616e2ca27b945773cdb685a4726a1b03ff4afbb (patch) | |
| tree | 6b4b624ddf312c23b61849510ca204617b0ade1e | |
| parent | 72b8a31cae896c6ba145a09172ebc994b79d0bf5 (diff) | |
| parent | 62ee0ea0b6b1fe60044c623066d3ea4169fed814 (diff) | |
| download | rust-6616e2ca27b945773cdb685a4726a1b03ff4afbb.tar.gz rust-6616e2ca27b945773cdb685a4726a1b03ff4afbb.zip | |
Rollup merge of #71738 - RalfJung:pointer-no-alloc-id, r=oli-obk
remove AllocId generalization of Pointer This was only needed for the "snapshot" machinery, which is gone. r? @oli-obk
| -rw-r--r-- | src/librustc_middle/mir/interpret/pointer.rs | 16 | ||||
| -rw-r--r-- | src/librustc_middle/mir/interpret/value.rs | 12 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/eval_context.rs | 10 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/operand.rs | 16 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 20 |
5 files changed, 34 insertions, 40 deletions
diff --git a/src/librustc_middle/mir/interpret/pointer.rs b/src/librustc_middle/mir/interpret/pointer.rs index 19642278b44..0b060056499 100644 --- a/src/librustc_middle/mir/interpret/pointer.rs +++ b/src/librustc_middle/mir/interpret/pointer.rs @@ -75,18 +75,14 @@ pub trait PointerArithmetic: HasDataLayout { impl<T: HasDataLayout> PointerArithmetic for T {} -/// `Pointer` is generic over the type that represents a reference to `Allocation`s, -/// thus making it possible for the most convenient representation to be used in -/// each context. +/// Represents a pointer in the Miri engine. /// -/// Defaults to the index based and loosely coupled `AllocId`. -/// -/// `Pointer` is also generic over the `Tag` associated with each pointer, +/// `Pointer` is generic over the `Tag` associated with each pointer, /// which is used to do provenance tracking during execution. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, RustcEncodable, RustcDecodable, Hash)] #[derive(HashStable)] -pub struct Pointer<Tag = (), Id = AllocId> { - pub alloc_id: Id, +pub struct Pointer<Tag = ()> { + pub alloc_id: AllocId, pub offset: Size, pub tag: Tag, } @@ -97,7 +93,7 @@ static_assert_size!(Pointer, 16); // all the Miri types. // We have to use `Debug` output for the tag, because `()` does not implement // `Display` so we cannot specialize that. -impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for Pointer<Tag, Id> { +impl<Tag: fmt::Debug> fmt::Debug for Pointer<Tag> { default fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if f.alternate() { write!(f, "{:#?}+0x{:x}[{:?}]", self.alloc_id, self.offset.bytes(), self.tag) @@ -107,7 +103,7 @@ impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for Pointer<Tag, Id> { } } // Specialization for no tag -impl<Id: fmt::Debug> fmt::Debug for Pointer<(), Id> { +impl fmt::Debug for Pointer<()> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if f.alternate() { write!(f, "{:#?}+0x{:x}", self.alloc_id, self.offset.bytes()) diff --git a/src/librustc_middle/mir/interpret/value.rs b/src/librustc_middle/mir/interpret/value.rs index 0df8a9aa9b0..ed779d52fb5 100644 --- a/src/librustc_middle/mir/interpret/value.rs +++ b/src/librustc_middle/mir/interpret/value.rs @@ -89,7 +89,7 @@ impl<'tcx> ConstValue<'tcx> { /// of a simple value or a pointer into another `Allocation` #[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, RustcEncodable, RustcDecodable, Hash)] #[derive(HashStable)] -pub enum Scalar<Tag = (), Id = AllocId> { +pub enum Scalar<Tag = ()> { /// The raw bytes of a simple value. Raw { /// The first `size` bytes of `data` are the value. @@ -101,7 +101,7 @@ pub enum Scalar<Tag = (), Id = AllocId> { /// A pointer into an `Allocation`. An `Allocation` in the `memory` module has a list of /// relocations, but a `Scalar` is only large enough to contain one, so we just represent the /// relocation and its associated offset together as a `Pointer` here. - Ptr(Pointer<Tag, Id>), + Ptr(Pointer<Tag>), } #[cfg(target_arch = "x86_64")] @@ -109,7 +109,7 @@ static_assert_size!(Scalar, 24); // We want the `Debug` output to be readable as it is used by `derive(Debug)` for // all the Miri types. -impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for Scalar<Tag, Id> { +impl<Tag: fmt::Debug> fmt::Debug for Scalar<Tag> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Scalar::Ptr(ptr) => write!(f, "{:?}", ptr), @@ -542,8 +542,8 @@ impl<Tag> From<Pointer<Tag>> for Scalar<Tag> { } #[derive(Clone, Copy, Eq, PartialEq, RustcEncodable, RustcDecodable, HashStable, Hash)] -pub enum ScalarMaybeUndef<Tag = (), Id = AllocId> { - Scalar(Scalar<Tag, Id>), +pub enum ScalarMaybeUndef<Tag = ()> { + Scalar(Scalar<Tag>), Undef, } @@ -563,7 +563,7 @@ impl<Tag> From<Pointer<Tag>> for ScalarMaybeUndef<Tag> { // We want the `Debug` output to be readable as it is used by `derive(Debug)` for // all the Miri types. -impl<Tag: fmt::Debug, Id: fmt::Debug> fmt::Debug for ScalarMaybeUndef<Tag, Id> { +impl<Tag: fmt::Debug> fmt::Debug for ScalarMaybeUndef<Tag> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { ScalarMaybeUndef::Undef => write!(f, "<uninitialized>"), diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index 82e1984e462..f668bafe080 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -11,7 +11,7 @@ use rustc_macros::HashStable; use rustc_middle::ich::StableHashingContext; use rustc_middle::mir; use rustc_middle::mir::interpret::{ - sign_extend, truncate, AllocId, FrameInfo, GlobalId, InterpResult, Pointer, Scalar, + sign_extend, truncate, FrameInfo, GlobalId, InterpResult, Pointer, Scalar, }; use rustc_middle::ty::layout::{self, TyAndLayout}; use rustc_middle::ty::{ @@ -103,8 +103,8 @@ pub enum StackPopCleanup { /// State of a local variable including a memoized layout #[derive(Clone, PartialEq, Eq, HashStable)] -pub struct LocalState<'tcx, Tag = (), Id = AllocId> { - pub value: LocalValue<Tag, Id>, +pub struct LocalState<'tcx, Tag = ()> { + pub value: LocalValue<Tag>, /// Don't modify if `Some`, this is only used to prevent computing the layout twice #[stable_hasher(ignore)] pub layout: Cell<Option<TyAndLayout<'tcx>>>, @@ -112,7 +112,7 @@ pub struct LocalState<'tcx, Tag = (), Id = AllocId> { /// Current value of a local variable #[derive(Copy, Clone, PartialEq, Eq, Debug, HashStable)] // Miri debug-prints these -pub enum LocalValue<Tag = (), Id = AllocId> { +pub enum LocalValue<Tag = ()> { /// This local is not currently alive, and cannot be used at all. Dead, /// This local is alive but not yet initialized. It can be written to @@ -125,7 +125,7 @@ pub enum LocalValue<Tag = (), Id = AllocId> { /// This is an optimization over just always having a pointer here; /// we can thus avoid doing an allocation when the local just stores /// immediate values *and* never has its address taken. - Live(Operand<Tag, Id>), + Live(Operand<Tag>), } impl<'tcx, Tag: Copy + 'static> LocalState<'tcx, Tag> { diff --git a/src/librustc_mir/interpret/operand.rs b/src/librustc_mir/interpret/operand.rs index b924f20ce7c..e2fb9de486f 100644 --- a/src/librustc_mir/interpret/operand.rs +++ b/src/librustc_mir/interpret/operand.rs @@ -15,8 +15,8 @@ use rustc_target::abi::{Abi, DiscriminantKind, HasDataLayout, Integer, LayoutOf, use rustc_target::abi::{VariantIdx, Variants}; use super::{ - from_known_layout, sign_extend, truncate, AllocId, ConstValue, GlobalId, InterpCx, - InterpResult, MPlaceTy, Machine, MemPlace, Place, PlaceTy, Pointer, Scalar, ScalarMaybeUndef, + from_known_layout, sign_extend, truncate, ConstValue, GlobalId, InterpCx, InterpResult, + MPlaceTy, Machine, MemPlace, Place, PlaceTy, Pointer, Scalar, ScalarMaybeUndef, }; /// An `Immediate` represents a single immediate self-contained Rust value. @@ -27,9 +27,9 @@ use super::{ /// In particular, thanks to `ScalarPair`, arithmetic operations and casts can be entirely /// defined on `Immediate`, and do not have to work with a `Place`. #[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, Hash)] -pub enum Immediate<Tag = (), Id = AllocId> { - Scalar(ScalarMaybeUndef<Tag, Id>), - ScalarPair(ScalarMaybeUndef<Tag, Id>, ScalarMaybeUndef<Tag, Id>), +pub enum Immediate<Tag = ()> { + Scalar(ScalarMaybeUndef<Tag>), + ScalarPair(ScalarMaybeUndef<Tag>, ScalarMaybeUndef<Tag>), } impl<Tag> From<ScalarMaybeUndef<Tag>> for Immediate<Tag> { @@ -145,9 +145,9 @@ impl<'tcx, Tag> ::std::ops::Deref for ImmTy<'tcx, Tag> { /// or still in memory. The latter is an optimization, to delay reading that chunk of /// memory and to avoid having to store arbitrary-sized data here. #[derive(Copy, Clone, Debug, PartialEq, Eq, HashStable, Hash)] -pub enum Operand<Tag = (), Id = AllocId> { - Immediate(Immediate<Tag, Id>), - Indirect(MemPlace<Tag, Id>), +pub enum Operand<Tag = ()> { + Immediate(Immediate<Tag>), + Indirect(MemPlace<Tag>), } #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index ba17a0b482a..fee9ca0c02e 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -20,9 +20,9 @@ use super::{ #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] /// Information required for the sound usage of a `MemPlace`. -pub enum MemPlaceMeta<Tag = (), Id = AllocId> { +pub enum MemPlaceMeta<Tag = ()> { /// The unsized payload (e.g. length for slices or vtable pointer for trait objects). - Meta(Scalar<Tag, Id>), + Meta(Scalar<Tag>), /// `Sized` types or unsized `extern type` None, /// The address of this place may not be taken. This protects the `MemPlace` from coming from @@ -32,8 +32,8 @@ pub enum MemPlaceMeta<Tag = (), Id = AllocId> { Poison, } -impl<Tag, Id> MemPlaceMeta<Tag, Id> { - pub fn unwrap_meta(self) -> Scalar<Tag, Id> { +impl<Tag> MemPlaceMeta<Tag> { + pub fn unwrap_meta(self) -> Scalar<Tag> { match self { Self::Meta(s) => s, Self::None | Self::Poison => { @@ -47,9 +47,7 @@ impl<Tag, Id> MemPlaceMeta<Tag, Id> { Self::None | Self::Poison => false, } } -} -impl<Tag> MemPlaceMeta<Tag> { pub fn erase_tag(self) -> MemPlaceMeta<()> { match self { Self::Meta(s) => MemPlaceMeta::Meta(s.erase_tag()), @@ -60,22 +58,22 @@ impl<Tag> MemPlaceMeta<Tag> { } #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] -pub struct MemPlace<Tag = (), Id = AllocId> { +pub struct MemPlace<Tag = ()> { /// A place may have an integral pointer for ZSTs, and since it might /// be turned back into a reference before ever being dereferenced. /// However, it may never be undef. - pub ptr: Scalar<Tag, Id>, + pub ptr: Scalar<Tag>, pub align: Align, /// Metadata for unsized places. Interpretation is up to the type. /// Must not be present for sized types, but can be missing for unsized types /// (e.g., `extern type`). - pub meta: MemPlaceMeta<Tag, Id>, + pub meta: MemPlaceMeta<Tag>, } #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] -pub enum Place<Tag = (), Id = AllocId> { +pub enum Place<Tag = ()> { /// A place referring to a value allocated in the `Memory` system. - Ptr(MemPlace<Tag, Id>), + Ptr(MemPlace<Tag>), /// To support alloc-free locals, we are able to write directly to a local. /// (Without that optimization, we'd just always be a `MemPlace`.) |
