mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Rollup merge of #79942 - JCTyblaidd:static-mem-init, r=RalfJung
Add post-init hook for static memory for miri. Adds a post-initialization hook to treat memory initialized using the interpreter as if it was initialized in a static context. See: https://github.com/rust-lang/miri/pull/1644 & https://github.com/rust-lang/miri/issues/1643
This commit is contained in:
commit
2b43980ef4
@ -9,6 +9,7 @@ use std::hash::Hash;
|
|||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::ty::{self, Ty};
|
use rustc_middle::ty::{self, Ty};
|
||||||
use rustc_span::def_id::DefId;
|
use rustc_span::def_id::DefId;
|
||||||
|
use rustc_target::abi::Size;
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
AllocId, Allocation, AllocationExtra, CheckInAllocMsg, Frame, ImmTy, InterpCx, InterpResult,
|
AllocId, Allocation, AllocationExtra, CheckInAllocMsg, Frame, ImmTy, InterpCx, InterpResult,
|
||||||
@ -299,6 +300,15 @@ pub trait Machine<'mir, 'tcx>: Sized {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Called after initializing static memory using the interpreter.
|
||||||
|
fn after_static_mem_initialized(
|
||||||
|
_ecx: &mut InterpCx<'mir, 'tcx, Self>,
|
||||||
|
_ptr: Pointer<Self::PointerTag>,
|
||||||
|
_size: Size,
|
||||||
|
) -> InterpResult<'tcx> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Executes a retagging operation
|
/// Executes a retagging operation
|
||||||
#[inline]
|
#[inline]
|
||||||
fn retag(
|
fn retag(
|
||||||
|
@ -56,11 +56,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
// If you touch this code, be sure to also make the corresponding changes to
|
// If you touch this code, be sure to also make the corresponding changes to
|
||||||
// `get_vtable` in `rust_codegen_llvm/meth.rs`.
|
// `get_vtable` in `rust_codegen_llvm/meth.rs`.
|
||||||
// /////////////////////////////////////////////////////////////////////////////////////////
|
// /////////////////////////////////////////////////////////////////////////////////////////
|
||||||
let vtable = self.memory.allocate(
|
let vtable_size = ptr_size * u64::try_from(methods.len()).unwrap().checked_add(3).unwrap();
|
||||||
ptr_size * u64::try_from(methods.len()).unwrap().checked_add(3).unwrap(),
|
let vtable = self.memory.allocate(vtable_size, ptr_align, MemoryKind::Vtable);
|
||||||
ptr_align,
|
|
||||||
MemoryKind::Vtable,
|
|
||||||
);
|
|
||||||
|
|
||||||
let drop = Instance::resolve_drop_in_place(tcx, ty);
|
let drop = Instance::resolve_drop_in_place(tcx, ty);
|
||||||
let drop = self.memory.create_fn_alloc(FnVal::Instance(drop));
|
let drop = self.memory.create_fn_alloc(FnVal::Instance(drop));
|
||||||
@ -93,6 +90,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
M::after_static_mem_initialized(self, vtable, vtable_size)?;
|
||||||
|
|
||||||
self.memory.mark_immutable(vtable.alloc_id)?;
|
self.memory.mark_immutable(vtable.alloc_id)?;
|
||||||
assert!(self.vtables.insert((ty, poly_trait_ref), vtable).is_none());
|
assert!(self.vtables.insert((ty, poly_trait_ref), vtable).is_none());
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user