X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmachine.rs;h=ed9a8a1c46346f320149b1a9e473cbc56e3e124a;hb=068c448832c466e3eb6297125a12e5a83a450e2d;hp=c2e78024105da965a9762c18eb2ffaeef12fba8b;hpb=b269bb07078446c9c153e0f2acaf83bf8f19b935;p=rust.git diff --git a/src/machine.rs b/src/machine.rs index c2e78024105..ed9a8a1c463 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -57,20 +57,19 @@ pub struct MemoryExtra { pub stacked_borrows: stacked_borrows::MemoryExtra, pub intptrcast: intptrcast::MemoryExtra, - /// The random number generator to use if Miri is running in non-deterministic mode and to - /// enable intptrcast - pub(crate) rng: Option>, + /// The random number generator used for resolving non-determinism. + pub(crate) rng: RefCell, /// Whether to enforce the validity invariant. pub(crate) validate: bool, } impl MemoryExtra { - pub fn new(rng: Option, validate: bool) -> Self { + pub fn new(rng: StdRng, validate: bool) -> Self { MemoryExtra { stacked_borrows: Default::default(), intptrcast: Default::default(), - rng: rng.map(RefCell::new), + rng: RefCell::new(rng), validate, } } @@ -94,10 +93,13 @@ pub struct Evaluator<'tcx> { /// TLS state. pub(crate) tls: TlsData<'tcx>, + + /// If enabled, the `env_vars` field is populated with the host env vars during initialization. + pub(crate) communicate: bool, } impl<'tcx> Evaluator<'tcx> { - pub(crate) fn new() -> Self { + pub(crate) fn new(communicate: bool) -> Self { Evaluator { env_vars: HashMap::default(), argc: None, @@ -105,6 +107,7 @@ pub(crate) fn new() -> Self { cmd_line: None, last_error: 0, tls: TlsData::default(), + communicate, } } } @@ -142,6 +145,8 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'tcx> { const STATIC_KIND: Option = Some(MiriMemoryKind::Static); + const CHECK_ALIGN: bool = true; + #[inline(always)] fn enforce_validity(ecx: &InterpCx<'mir, 'tcx, Self>) -> bool { ecx.memory().extra.validate @@ -180,13 +185,13 @@ fn call_intrinsic( } #[inline(always)] - fn ptr_op( + fn binary_ptr_op( ecx: &rustc_mir::interpret::InterpCx<'mir, 'tcx, Self>, bin_op: mir::BinOp, left: ImmTy<'tcx, Tag>, right: ImmTy<'tcx, Tag>, ) -> InterpResult<'tcx, (Scalar, bool)> { - ecx.ptr_op(bin_op, left, right) + ecx.binary_ptr_op(bin_op, left, right) } fn box_alloc( @@ -248,9 +253,7 @@ fn find_foreign_static( let data = vec![0; size.bytes() as usize]; Allocation::from_bytes(&data, tcx.data_layout.pointer_align.abi) } - _ => return err!(Unimplemented( - format!("can't access foreign static: {}", link_name), - )), + _ => throw_unsup_format!("can't access foreign static: {}", link_name), }; Ok(Cow::Owned(alloc)) } @@ -353,28 +356,20 @@ fn stack_pop( Ok(ecx.memory().extra.stacked_borrows.borrow_mut().end_call(extra)) } + #[inline(always)] fn int_to_ptr( memory: &Memory<'mir, 'tcx, Self>, int: u64, ) -> InterpResult<'tcx, Pointer> { - if int == 0 { - err!(InvalidNullPointerUsage) - } else if memory.extra.rng.is_none() { - err!(ReadBytesAsPointer) - } else { - intptrcast::GlobalState::int_to_ptr(int, memory) - } + intptrcast::GlobalState::int_to_ptr(int, memory) } + #[inline(always)] fn ptr_to_int( memory: &Memory<'mir, 'tcx, Self>, ptr: Pointer, ) -> InterpResult<'tcx, u64> { - if memory.extra.rng.is_none() { - err!(ReadPointerAsBytes) - } else { - intptrcast::GlobalState::ptr_to_int(ptr, memory) - } + intptrcast::GlobalState::ptr_to_int(ptr, memory) } }