From b81302f42d2dfb3b36c91d9b0c5ab2c465214ead Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 19 Sep 2018 09:40:30 +0200 Subject: [PATCH] for now, just use NULL ptr for unsized locals --- src/librustc/mir/interpret/mod.rs | 10 +++++----- src/librustc_mir/interpret/place.rs | 20 ++++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/librustc/mir/interpret/mod.rs b/src/librustc/mir/interpret/mod.rs index 40a4b8b375a..9ef123d2daf 100644 --- a/src/librustc/mir/interpret/mod.rs +++ b/src/librustc/mir/interpret/mod.rs @@ -176,7 +176,7 @@ impl<'tcx, Tag> Pointer { Pointer { alloc_id, offset, tag } } - pub fn wrapping_signed_offset(self, i: i64, cx: C) -> Self { + pub fn wrapping_signed_offset(self, i: i64, cx: impl HasDataLayout) -> Self { Pointer::new_with_tag( self.alloc_id, Size::from_bytes(cx.data_layout().wrapping_signed_offset(self.offset.bytes(), i)), @@ -184,12 +184,12 @@ impl<'tcx, Tag> Pointer { ) } - pub fn overflowing_signed_offset(self, i: i128, cx: C) -> (Self, bool) { + pub fn overflowing_signed_offset(self, i: i128, cx: impl HasDataLayout) -> (Self, bool) { let (res, over) = cx.data_layout().overflowing_signed_offset(self.offset.bytes(), i); (Pointer::new_with_tag(self.alloc_id, Size::from_bytes(res), self.tag), over) } - pub fn signed_offset(self, i: i64, cx: C) -> EvalResult<'tcx, Self> { + pub fn signed_offset(self, i: i64, cx: impl HasDataLayout) -> EvalResult<'tcx, Self> { Ok(Pointer::new_with_tag( self.alloc_id, Size::from_bytes(cx.data_layout().signed_offset(self.offset.bytes(), i)?), @@ -197,12 +197,12 @@ impl<'tcx, Tag> Pointer { )) } - pub fn overflowing_offset(self, i: Size, cx: C) -> (Self, bool) { + pub fn overflowing_offset(self, i: Size, cx: impl HasDataLayout) -> (Self, bool) { let (res, over) = cx.data_layout().overflowing_offset(self.offset.bytes(), i.bytes()); (Pointer::new_with_tag(self.alloc_id, Size::from_bytes(res), self.tag), over) } - pub fn offset(self, i: Size, cx: C) -> EvalResult<'tcx, Self> { + pub fn offset(self, i: Size, cx: impl HasDataLayout) -> EvalResult<'tcx, Self> { Ok(Pointer::new_with_tag( self.alloc_id, Size::from_bytes(cx.data_layout().offset(self.offset.bytes(), i.bytes())?), diff --git a/src/librustc_mir/interpret/place.rs b/src/librustc_mir/interpret/place.rs index b7bc4867307..4fa08e8c311 100644 --- a/src/librustc_mir/interpret/place.rs +++ b/src/librustc_mir/interpret/place.rs @@ -125,6 +125,12 @@ impl MemPlace { } } + /// Produces a Place that will error if attempted to be read from or written to + #[inline(always)] + pub fn null(cx: impl HasDataLayout) -> Self { + Self::from_scalar_ptr(Scalar::ptr_null(cx), Align::from_bytes(1, 1).unwrap()) + } + #[inline(always)] pub fn from_ptr(ptr: Pointer, align: Align) -> Self { Self::from_scalar_ptr(ptr.into(), align) @@ -209,17 +215,17 @@ impl<'tcx, Tag: ::std::fmt::Debug> OpTy<'tcx, Tag> { impl<'tcx, Tag: ::std::fmt::Debug> Place { /// Produces a Place that will error if attempted to be read from or written to - #[inline] + #[inline(always)] pub fn null(cx: impl HasDataLayout) -> Self { - Self::from_scalar_ptr(Scalar::ptr_null(cx), Align::from_bytes(1, 1).unwrap()) + Place::Ptr(MemPlace::null(cx)) } - #[inline] + #[inline(always)] pub fn from_scalar_ptr(ptr: Scalar, align: Align) -> Self { Place::Ptr(MemPlace::from_scalar_ptr(ptr, align)) } - #[inline] + #[inline(always)] pub fn from_ptr(ptr: Pointer, align: Align) -> Self { Place::Ptr(MemPlace::from_ptr(ptr, align)) } @@ -882,10 +888,8 @@ where ) -> EvalResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { if layout.is_unsized() { assert!(self.tcx.features().unsized_locals, "cannot alloc memory for unsized type"); - // allocate a fat pointer slot instead - let fat = self.tcx.mk_mut_ptr(layout.ty); - let fat = self.layout_of(fat)?; - self.allocate(fat, kind) + // FIXME: What should we do here? + Ok(MPlaceTy::dangling(layout, &self)) } else { let ptr = self.memory.allocate(layout.size, layout.align, kind)?; Ok(MPlaceTy::from_aligned_ptr(ptr, layout))