Rollup merge of #56981 - RalfJung:miri-infallible-alloc, r=oli-obk
miri: allocation is infallible
This commit is contained in:
commit
40dc787474
7 changed files with 18 additions and 18 deletions
|
|
@ -187,7 +187,7 @@ fn eval_body_using_ecx<'mir, 'tcx>(
|
|||
}
|
||||
let layout = ecx.layout_of(mir.return_ty().subst(tcx, cid.instance.substs))?;
|
||||
assert!(!layout.is_unsized());
|
||||
let ret = ecx.allocate(layout, MemoryKind::Stack)?;
|
||||
let ret = ecx.allocate(layout, MemoryKind::Stack);
|
||||
|
||||
let name = ty::tls::with(|tcx| tcx.item_path_str(cid.instance.def_id()));
|
||||
let prom = cid.promoted.map_or(String::new(), |p| format!("::promoted[{:?}]", p));
|
||||
|
|
@ -490,8 +490,8 @@ impl<'a, 'mir, 'tcx> interpret::Machine<'a, 'mir, 'tcx>
|
|||
_ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
|
||||
ptr: Pointer,
|
||||
_kind: MemoryKind<Self::MemoryKinds>,
|
||||
) -> EvalResult<'tcx, Pointer> {
|
||||
Ok(ptr)
|
||||
) -> Pointer {
|
||||
ptr
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ pub trait Machine<'a, 'mir, 'tcx>: Sized {
|
|||
ecx: &mut EvalContext<'a, 'mir, 'tcx, Self>,
|
||||
ptr: Pointer,
|
||||
kind: MemoryKind<Self::MemoryKinds>,
|
||||
) -> EvalResult<'tcx, Pointer<Self::PointerTag>>;
|
||||
) -> Pointer<Self::PointerTag>;
|
||||
|
||||
/// Executed when evaluating the `*` operator: Following a reference.
|
||||
/// This has the chance to adjust the tag. It should not change anything else!
|
||||
|
|
|
|||
|
|
@ -131,10 +131,10 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
|
|||
&mut self,
|
||||
alloc: Allocation<M::PointerTag, M::AllocExtra>,
|
||||
kind: MemoryKind<M::MemoryKinds>,
|
||||
) -> EvalResult<'tcx, AllocId> {
|
||||
) -> AllocId {
|
||||
let id = self.tcx.alloc_map.lock().reserve();
|
||||
self.alloc_map.insert(id, (kind, alloc));
|
||||
Ok(id)
|
||||
id
|
||||
}
|
||||
|
||||
pub fn allocate(
|
||||
|
|
@ -142,9 +142,9 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
|
|||
size: Size,
|
||||
align: Align,
|
||||
kind: MemoryKind<M::MemoryKinds>,
|
||||
) -> EvalResult<'tcx, Pointer> {
|
||||
) -> Pointer {
|
||||
let extra = AllocationExtra::memory_allocated(size, &self.extra);
|
||||
Ok(Pointer::from(self.allocate_with(Allocation::undef(size, align, extra), kind)?))
|
||||
Pointer::from(self.allocate_with(Allocation::undef(size, align, extra), kind))
|
||||
}
|
||||
|
||||
pub fn reallocate(
|
||||
|
|
@ -162,7 +162,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> Memory<'a, 'mir, 'tcx, M> {
|
|||
|
||||
// For simplicities' sake, we implement reallocate as "alloc, copy, dealloc".
|
||||
// This happens so rarely, the perf advantage is outweighed by the maintenance cost.
|
||||
let new_ptr = self.allocate(new_size, new_align, kind)?;
|
||||
let new_ptr = self.allocate(new_size, new_align, kind);
|
||||
self.copy(
|
||||
ptr.into(),
|
||||
old_align,
|
||||
|
|
|
|||
|
|
@ -382,7 +382,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
|
|||
_ => {
|
||||
trace!("Forcing allocation for local of type {:?}", layout.ty);
|
||||
Operand::Indirect(
|
||||
*self.allocate(layout, MemoryKind::Stack)?
|
||||
*self.allocate(layout, MemoryKind::Stack)
|
||||
)
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -911,7 +911,7 @@ where
|
|||
// that might e.g., be an inner field of a struct with `Scalar` layout,
|
||||
// that has different alignment than the outer field.
|
||||
let local_layout = self.layout_of_local(&self.stack[frame], local)?;
|
||||
let ptr = self.allocate(local_layout, MemoryKind::Stack)?;
|
||||
let ptr = self.allocate(local_layout, MemoryKind::Stack);
|
||||
// We don't have to validate as we can assume the local
|
||||
// was already valid for its type.
|
||||
self.write_immediate_to_mplace_no_validate(value, ptr)?;
|
||||
|
|
@ -933,15 +933,15 @@ where
|
|||
&mut self,
|
||||
layout: TyLayout<'tcx>,
|
||||
kind: MemoryKind<M::MemoryKinds>,
|
||||
) -> EvalResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> {
|
||||
) -> MPlaceTy<'tcx, M::PointerTag> {
|
||||
if layout.is_unsized() {
|
||||
assert!(self.tcx.features().unsized_locals, "cannot alloc memory for unsized type");
|
||||
// FIXME: What should we do here? We should definitely also tag!
|
||||
Ok(MPlaceTy::dangling(layout, self))
|
||||
MPlaceTy::dangling(layout, self)
|
||||
} else {
|
||||
let ptr = self.memory.allocate(layout.size, layout.align.abi, kind)?;
|
||||
let ptr = M::tag_new_allocation(self, ptr, kind)?;
|
||||
Ok(MPlaceTy::from_aligned_ptr(ptr, layout))
|
||||
let ptr = self.memory.allocate(layout.size, layout.align.abi, kind);
|
||||
let ptr = M::tag_new_allocation(self, ptr, kind);
|
||||
MPlaceTy::from_aligned_ptr(ptr, layout)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
|
|||
ptr_size * (3 + methods.len() as u64),
|
||||
ptr_align,
|
||||
MemoryKind::Vtable,
|
||||
)?.with_default_tag();
|
||||
).with_default_tag();
|
||||
let tcx = &*self.tcx;
|
||||
|
||||
let drop = ::monomorphize::resolve_drop_in_place(*tcx, ty);
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ impl<'a, 'mir, 'tcx> ConstPropagator<'a, 'mir, 'tcx> {
|
|||
Rvalue::Cast(kind, ref operand, _) => {
|
||||
let (op, span) = self.eval_operand(operand, source_info)?;
|
||||
self.use_ecx(source_info, |this| {
|
||||
let dest = this.ecx.allocate(place_layout, MemoryKind::Stack)?;
|
||||
let dest = this.ecx.allocate(place_layout, MemoryKind::Stack);
|
||||
this.ecx.cast(op, kind, dest.into())?;
|
||||
Ok((dest.into(), span))
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue