From 3bd1734ea28b837238806dc0970a52c7148112cc Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Wed, 12 Jun 2019 12:49:46 -0500 Subject: [PATCH] Add force_bits and force_ptr methods --- src/librustc_mir/interpret/eval_context.rs | 13 +++++++++++++ src/librustc_mir/interpret/machine.rs | 17 ++++++++++++++++- src/librustc_mir/interpret/memory.rs | 17 +++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs index f985c6000b5..1908f45704e 100644 --- a/src/librustc_mir/interpret/eval_context.rs +++ b/src/librustc_mir/interpret/eval_context.rs @@ -765,4 +765,17 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpretCx<'mir, 'tcx, M> { pub fn truncate(&self, value: u128, ty: TyLayout<'_>) -> u128 { truncate(value, ty.size) } + + #[inline(always)] + pub fn force_ptr( + &self, + scalar: Scalar, + ) -> InterpResult<'tcx, Pointer> { + self.memory.force_ptr(scalar) + } + + #[inline(always)] + pub fn force_bits(&self, scalar: Scalar) -> InterpResult<'tcx, u128> { + self.memory.force_bits(scalar) + } } diff --git a/src/librustc_mir/interpret/machine.rs b/src/librustc_mir/interpret/machine.rs index 58ee952879d..8eb891cf90a 100644 --- a/src/librustc_mir/interpret/machine.rs +++ b/src/librustc_mir/interpret/machine.rs @@ -11,7 +11,8 @@ use rustc::ty::{self, query::TyCtxtAt}; use super::{ Allocation, AllocId, InterpResult, Scalar, AllocationExtra, - InterpretCx, PlaceTy, OpTy, ImmTy, MemoryKind, + InterpretCx, PlaceTy, OpTy, ImmTy, MemoryKind, Pointer, + InterpErrorInfo, InterpError }; /// Whether this kind of memory is allowed to leak @@ -208,4 +209,18 @@ pub trait Machine<'mir, 'tcx>: Sized { ecx: &mut InterpretCx<'mir, 'tcx, Self>, extra: Self::FrameExtra, ) -> InterpResult<'tcx>; + + fn int_to_ptr( + _int: u64, + _extra: &Self::MemoryExtra, + ) -> InterpResult<'tcx, Pointer> { + Err(InterpErrorInfo::from(InterpError::ReadBytesAsPointer)) + } + + fn ptr_to_int( + _ptr: Pointer, + _extra: &Self::MemoryExtra, + ) -> InterpResult<'tcx, u64> { + Err(InterpErrorInfo::from(InterpError::ReadPointerAsBytes)) + } } diff --git a/src/librustc_mir/interpret/memory.rs b/src/librustc_mir/interpret/memory.rs index e724c377df7..790ee72fe53 100644 --- a/src/librustc_mir/interpret/memory.rs +++ b/src/librustc_mir/interpret/memory.rs @@ -874,4 +874,21 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { } Ok(()) } + + pub fn force_ptr( + &self, + scalar: Scalar, + ) -> InterpResult<'tcx, Pointer> { + match scalar { + Scalar::Ptr(ptr) => Ok(ptr), + _ => M::int_to_ptr(scalar.to_usize(self)?, &self.extra) + } + } + + pub fn force_bits(&self, scalar: Scalar) -> InterpResult<'tcx, u128> { + match scalar.to_bits_or_ptr(self.pointer_size(), self) { + Ok(bits) => Ok(bits), + Err(ptr) => Ok(M::ptr_to_int(ptr, &self.extra)? as u128) + } + } }