diff --git a/README.md b/README.md index 32cbc4f1e45..4681a3d3821 100644 --- a/README.md +++ b/README.md @@ -65,9 +65,9 @@ in your program, and cannot run all programs: not support networking. System API support varies between targets; if you run on Windows it is a good idea to use `--target x86_64-unknown-linux-gnu` to get better support. -* Weak memory emulation may produce weak behaivours unobservable by compiled - programs running on real hardware when `SeqCst` fences are used, and it cannot - produce all behaviors possibly observable on real hardware. +* Weak memory emulation may [produce weak behaivours](https://github.com/rust-lang/miri/issues/2301) + unobservable by compiled programs running on real hardware when `SeqCst` fences are used, and it + cannot produce all behaviors possibly observable on real hardware. [rust]: https://www.rust-lang.org/ [mir]: https://github.com/rust-lang/rfcs/blob/master/text/1211-mir.md @@ -192,8 +192,9 @@ randomness that is used to determine allocation base addresses. The following snippet calls Miri in a loop with different values for the seed: ``` -for seed in $({ echo obase=16; seq 0 255; } | bc); do - MIRIFLAGS=-Zmiri-seed=$seed cargo miri test || { echo "Last seed: $seed"; break; }; +for SEED in $({ echo obase=16; seq 0 255; } | bc); do + echo "Trying seed: $SEED" + MIRIFLAGS=-Zmiri-seed=$SEED cargo miri test || { echo "Failing seed: $SEED"; break; }; done ``` diff --git a/src/machine.rs b/src/machine.rs index 1b7fc4ffb96..716d4bd5b90 100644 --- a/src/machine.rs +++ b/src/machine.rs @@ -930,7 +930,10 @@ impl<'mir, 'tcx> Machine<'mir, 'tcx> for Evaluator<'mir, 'tcx> { unwinding: bool, ) -> InterpResult<'tcx, StackPopJump> { let timing = frame.extra.timing.take(); - let res = ecx.handle_stack_pop(frame.extra, unwinding); + if let Some(stacked_borrows) = &ecx.machine.stacked_borrows { + stacked_borrows.borrow_mut().end_call(frame.extra.call_id); + } + let res = ecx.handle_stack_pop_unwind(frame.extra, unwinding); if let Some(profiler) = ecx.machine.profiler.as_ref() { profiler.finish_recording_interval_event(timing.unwrap()); } diff --git a/src/shims/panic.rs b/src/shims/panic.rs index ed6e72591dd..2ef0a741d52 100644 --- a/src/shims/panic.rs +++ b/src/shims/panic.rs @@ -115,17 +115,13 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx Ok(()) } - fn handle_stack_pop( + fn handle_stack_pop_unwind( &mut self, mut extra: FrameData<'tcx>, unwinding: bool, ) -> InterpResult<'tcx, StackPopJump> { let this = self.eval_context_mut(); - - trace!("handle_stack_pop(extra = {:?}, unwinding = {})", extra, unwinding); - if let Some(stacked_borrows) = &this.machine.stacked_borrows { - stacked_borrows.borrow_mut().end_call(extra.call_id); - } + trace!("handle_stack_pop_unwind(extra = {:?}, unwinding = {})", extra, unwinding); // We only care about `catch_panic` if we're unwinding - if we're doing a normal // return, then we don't need to do anything special.