diff --git a/src/tools/miri/README.md b/src/tools/miri/README.md index 5eb8c0fa7c99e..63756624677ef 100644 --- a/src/tools/miri/README.md +++ b/src/tools/miri/README.md @@ -318,8 +318,8 @@ environment variable. We first document the most relevant and most commonly used and `warn-nobacktrace` are the supported actions. The default is to `abort`, which halts the machine. Some (but not all) operations also support continuing execution with a "permission denied" error being returned to the program. - `warn` prints a full backtrace when that happens; `warn-nobacktrace` is less - verbose. `hide` hides the warning entirely. + `warn` prints a full backtrace each time that happens; `warn-nobacktrace` is less + verbose and shown at most once per operation. `hide` hides the warning entirely. * `-Zmiri-num-cpus` states the number of available CPUs to be reported by miri. By default, the number of available CPUs is `1`. Note that this flag does not affect how miri handles threads in any way. diff --git a/src/tools/miri/src/helpers.rs b/src/tools/miri/src/helpers.rs index 65260254ae25f..c3f4deb7c2eef 100644 --- a/src/tools/miri/src/helpers.rs +++ b/src/tools/miri/src/helpers.rs @@ -1,6 +1,8 @@ use std::cmp; +use std::collections::BTreeSet; use std::iter; use std::num::NonZero; +use std::sync::Mutex; use std::time::Duration; use rustc_apfloat::ieee::{Double, Single}; @@ -603,9 +605,18 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { match reject_with { RejectOpWith::Abort => isolation_abort_error(op_name), RejectOpWith::WarningWithoutBacktrace => { - this.tcx - .dcx() - .warn(format!("{op_name} was made to return an error due to isolation")); + // This exists to reduce verbosity; make sure we emit the warning at most once per + // operation. + static EMITTED_WARNINGS: Mutex> = Mutex::new(BTreeSet::new()); + + let mut emitted_warnings = EMITTED_WARNINGS.lock().unwrap(); + if !emitted_warnings.contains(op_name) { + // First time we are seeing this. + emitted_warnings.insert(op_name.to_owned()); + this.tcx + .dcx() + .warn(format!("{op_name} was made to return an error due to isolation")); + } Ok(()) } RejectOpWith::Warning => { diff --git a/src/tools/miri/src/lib.rs b/src/tools/miri/src/lib.rs index e1d0bc1c18386..c0d1afa8023e2 100644 --- a/src/tools/miri/src/lib.rs +++ b/src/tools/miri/src/lib.rs @@ -143,4 +143,7 @@ pub const MIRI_DEFAULT_ARGS: &[&str] = &[ "-Zmir-keep-place-mention", "-Zmir-opt-level=0", "-Zmir-enable-passes=-CheckAlignment", + // Deduplicating diagnostics means we miss events when tracking what happens during an + // execution. Let's not do that. + "-Zdeduplicate-diagnostics=no", ]; diff --git a/src/tools/miri/tests/fail/const-ub-checks.stderr b/src/tools/miri/tests/fail/const-ub-checks.stderr index 700a96a9062af..f6ac480f069be 100644 --- a/src/tools/miri/tests/fail/const-ub-checks.stderr +++ b/src/tools/miri/tests/fail/const-ub-checks.stderr @@ -10,6 +10,14 @@ note: erroneous constant encountered LL | let _x = UNALIGNED_READ; | ^^^^^^^^^^^^^^ +note: erroneous constant encountered + --> $DIR/const-ub-checks.rs:LL:CC + | +LL | let _x = UNALIGNED_READ; + | ^^^^^^^^^^^^^^ + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` + error: aborting due to 1 previous error For more information about this error, try `rustc --explain E0080`. diff --git a/src/tools/miri/tests/fail/erroneous_const2.stderr b/src/tools/miri/tests/fail/erroneous_const2.stderr index 47b06fa8aaa08..2227436707482 100644 --- a/src/tools/miri/tests/fail/erroneous_const2.stderr +++ b/src/tools/miri/tests/fail/erroneous_const2.stderr @@ -10,6 +10,14 @@ note: erroneous constant encountered LL | println!("{}", FOO); | ^^^ +note: erroneous constant encountered + --> $DIR/erroneous_const2.rs:LL:CC + | +LL | println!("{}", FOO); + | ^^^ + | + = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no` + note: erroneous constant encountered --> $DIR/erroneous_const2.rs:LL:CC | diff --git a/src/tools/miri/tests/pass-dep/concurrency/linux-futex.rs b/src/tools/miri/tests/pass-dep/concurrency/linux-futex.rs index 648c004c97cc0..d21f953672dee 100644 --- a/src/tools/miri/tests/pass-dep/concurrency/linux-futex.rs +++ b/src/tools/miri/tests/pass-dep/concurrency/linux-futex.rs @@ -219,6 +219,7 @@ fn wait_wake_bitset() { t.join().unwrap(); } +// Crucial test which relies on the SeqCst fences in futex wait/wake. fn concurrent_wait_wake() { const FREE: i32 = 0; const HELD: i32 = 1;