diff options
| author | Ralf Jung <post@ralfj.de> | 2018-10-16 17:00:39 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-10-18 12:08:23 +0200 |
| commit | d61db93c15105561b5105f03837ddf0ac3dbee4e (patch) | |
| tree | 2620efafb5027d06fc97a47a1dffc6b4a7f2ec30 /src/librustc_mir/interpret | |
| parent | 5f20b16934373228b7d2ecae6dda708ae820b055 (diff) | |
| download | rust-d61db93c15105561b5105f03837ddf0ac3dbee4e.tar.gz rust-d61db93c15105561b5105f03837ddf0ac3dbee4e.zip | |
also hook dereferencing
Diffstat (limited to 'src/librustc_mir/interpret')
| -rw-r--r-- | src/librustc_mir/interpret/machine.rs | 19 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/place.rs | 23 |
2 files changed, 32 insertions, 10 deletions
diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs index e30874ce7b3..5dd33ec551d 100644 --- a/src/librustc_mir/interpret/machine.rs +++ b/src/librustc_mir/interpret/machine.rs @@ -17,11 +17,11 @@ use std::hash::Hash; use rustc::hir::def_id::DefId; use rustc::mir; -use rustc::ty::{self, layout::{Size, TyLayout}, query::TyCtxtAt}; +use rustc::ty::{self, Ty, layout::{Size, TyLayout}, query::TyCtxtAt}; use super::{ Allocation, AllocId, EvalResult, Scalar, - EvalContext, PlaceTy, OpTy, MPlaceTy, Pointer, MemoryKind, + EvalContext, PlaceTy, OpTy, Pointer, MemoryKind, }; /// Classifying memory accesses @@ -199,14 +199,23 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized { } /// Executed when evaluating the `&` operator: Creating a new reference. - /// This has the chance to adjust the tag. It is only ever called if the - /// pointer in `place` is really a pointer, not another scalar. + /// This has the chance to adjust the tag. fn tag_reference( ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>, - place: MPlaceTy<'tcx, Self::PointerTag>, + ptr: Pointer<Self::PointerTag>, + pointee_ty: Ty<'tcx>, + pointee_size: Size, borrow_kind: mir::BorrowKind, ) -> EvalResult<'tcx, Self::PointerTag>; + /// Executed when evaluating the `*` operator: Following a reference. + /// This has the change to adjust the tag. + fn tag_dereference( + ecx: &EvalContext<'a, 'mir, 'tcx, Self>, + ptr: Pointer<Self::PointerTag>, + ptr_ty: Ty<'tcx>, + ) -> EvalResult<'tcx, Self::PointerTag>; + /// Execute a validation operation #[inline] fn validation_op( diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index 51406a686bc..1b319b01297 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -264,14 +264,24 @@ where &self, val: ValTy<'tcx, M::PointerTag>, ) -> EvalResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { + let ptr = match val.to_scalar_ptr()? { + Scalar::Ptr(ptr) => { + // Machine might want to track the `*` operator + let tag = M::tag_dereference(self, ptr, val.layout.ty)?; + Scalar::Ptr(Pointer::new_with_tag(ptr.alloc_id, ptr.offset, tag)) + } + scalar @ Scalar::Bits { .. } => scalar, + }; + let pointee_type = val.layout.ty.builtin_deref(true).unwrap().ty; let layout = self.layout_of(pointee_type)?; let align = layout.align; + let mplace = match *val { - Value::Scalar(ptr) => - MemPlace { ptr: ptr.not_undef()?, align, meta: None }, - Value::ScalarPair(ptr, meta) => - MemPlace { ptr: ptr.not_undef()?, align, meta: Some(meta.not_undef()?) }, + Value::Scalar(_) => + MemPlace { ptr, align, meta: None }, + Value::ScalarPair(_, meta) => + MemPlace { ptr, align, meta: Some(meta.not_undef()?) }, }; Ok(MPlaceTy { mplace, layout }) } @@ -285,7 +295,10 @@ where ) -> EvalResult<'tcx, Value<M::PointerTag>> { let ptr = match place.ptr { Scalar::Ptr(ptr) => { - let tag = M::tag_reference(self, place, borrow_kind)?; + // Machine might want to track the `&` operator + let (size, _) = self.size_and_align_of_mplace(place)? + .expect("create_ref cannot determine size"); + let tag = M::tag_reference(self, ptr, place.layout.ty, size, borrow_kind)?; Scalar::Ptr(Pointer::new_with_tag(ptr.alloc_id, ptr.offset, tag)) }, scalar @ Scalar::Bits { .. } => scalar, |
