From 1293a6a28100ac51153293882735d3c637fdcb35 Mon Sep 17 00:00:00 2001 From: The Miri Conjob Bot Date: Mon, 27 Nov 2023 04:56:43 +0000 Subject: [PATCH 01/13] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index ecebb8a331b97..0006bbc97fea2 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -3668a8af1b81447c4afa1f82f60d7b94b71a549f +48cfbe0cdfbc812a9bd8ce0b3bf6ca003bd12e6a From 8344dae33356b92a4e38c130e3ac656501a80d21 Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Mon, 27 Nov 2023 16:49:16 -0500 Subject: [PATCH 02/13] Remove Stacked Borrows GC heuristics --- .../src/borrow_tracker/stacked_borrows/mod.rs | 15 +++------------ .../tests/pass/stacked-borrows/stack-printing.rs | 5 ++++- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/tools/miri/src/borrow_tracker/stacked_borrows/mod.rs b/src/tools/miri/src/borrow_tracker/stacked_borrows/mod.rs index 91d924976f78f..1df2b1b8391b0 100644 --- a/src/tools/miri/src/borrow_tracker/stacked_borrows/mod.rs +++ b/src/tools/miri/src/borrow_tracker/stacked_borrows/mod.rs @@ -37,8 +37,6 @@ pub struct Stacks { history: AllocHistory, /// The set of tags that have been exposed inside this allocation. exposed_tags: FxHashSet, - /// Whether this memory has been modified since the last time the tag GC ran - modified_since_last_gc: bool, } /// Indicates which permissions to grant to the retagged pointer. @@ -450,15 +448,10 @@ impl<'tcx> Stack { /// Integration with the BorTag garbage collector impl Stacks { pub fn remove_unreachable_tags(&mut self, live_tags: &FxHashSet) { - if self.modified_since_last_gc { - for (_stack_range, stack) in self.stacks.iter_mut_all() { - if stack.len() > 64 { - stack.retain(live_tags); - } - } - self.history.retain(live_tags); - self.modified_since_last_gc = false; + for (_stack_range, stack) in self.stacks.iter_mut_all() { + stack.retain(live_tags); } + self.history.retain(live_tags); } } @@ -488,7 +481,6 @@ impl<'tcx> Stacks { stacks: RangeMap::new(size, stack), history: AllocHistory::new(id, item, machine), exposed_tags: FxHashSet::default(), - modified_since_last_gc: false, } } @@ -503,7 +495,6 @@ impl<'tcx> Stacks { &mut FxHashSet, ) -> InterpResult<'tcx>, ) -> InterpResult<'tcx> { - self.modified_since_last_gc = true; for (stack_range, stack) in self.stacks.iter_mut(range.start, range.size) { let mut dcx = dcx_builder.build(&mut self.history, Size::from_bytes(stack_range.start)); f(stack, &mut dcx, &mut self.exposed_tags)?; diff --git a/src/tools/miri/tests/pass/stacked-borrows/stack-printing.rs b/src/tools/miri/tests/pass/stacked-borrows/stack-printing.rs index 74761a89cb94a..9c9db4d1b3b53 100644 --- a/src/tools/miri/tests/pass/stacked-borrows/stack-printing.rs +++ b/src/tools/miri/tests/pass/stacked-borrows/stack-printing.rs @@ -1,4 +1,7 @@ -//@compile-flags: -Zmiri-permissive-provenance +// We disable the GC for this test because it would change what is printed. We are testing the +// printing, not how it interacts with the GC. +//@compile-flags: -Zmiri-permissive-provenance -Zmiri-provenance-gc=0 + #![feature(strict_provenance)] use std::{ alloc::{self, Layout}, From 1620865d7885dde9f0862ebe1c101c3f3ad461ee Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Wed, 29 Nov 2023 07:43:48 +0100 Subject: [PATCH 03/13] explain tests that disable the provenance GC --- .../tests/fail/tree_borrows/reserved/cell-protected-write.rs | 1 + .../miri/tests/fail/tree_borrows/reserved/int-protected-write.rs | 1 + src/tools/miri/tests/pass/tree_borrows/cell-alternate-writes.rs | 1 + src/tools/miri/tests/pass/tree_borrows/end-of-protector.rs | 1 + src/tools/miri/tests/pass/tree_borrows/formatting.rs | 1 + src/tools/miri/tests/pass/tree_borrows/reborrow-is-read.rs | 1 + src/tools/miri/tests/pass/tree_borrows/reserved.rs | 1 + src/tools/miri/tests/pass/tree_borrows/unique.rs | 1 + src/tools/miri/tests/pass/tree_borrows/vec_unique.rs | 1 + 9 files changed, 9 insertions(+) diff --git a/src/tools/miri/tests/fail/tree_borrows/reserved/cell-protected-write.rs b/src/tools/miri/tests/fail/tree_borrows/reserved/cell-protected-write.rs index 3769575765e95..7af1a7636fad7 100644 --- a/src/tools/miri/tests/fail/tree_borrows/reserved/cell-protected-write.rs +++ b/src/tools/miri/tests/fail/tree_borrows/reserved/cell-protected-write.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 // Check how a Reserved with interior mutability diff --git a/src/tools/miri/tests/fail/tree_borrows/reserved/int-protected-write.rs b/src/tools/miri/tests/fail/tree_borrows/reserved/int-protected-write.rs index e2956759d0b36..e23fe56534415 100644 --- a/src/tools/miri/tests/fail/tree_borrows/reserved/int-protected-write.rs +++ b/src/tools/miri/tests/fail/tree_borrows/reserved/int-protected-write.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 #[path = "../../../utils/mod.rs"] diff --git a/src/tools/miri/tests/pass/tree_borrows/cell-alternate-writes.rs b/src/tools/miri/tests/pass/tree_borrows/cell-alternate-writes.rs index e6310f8eda646..3269acb511938 100644 --- a/src/tools/miri/tests/pass/tree_borrows/cell-alternate-writes.rs +++ b/src/tools/miri/tests/pass/tree_borrows/cell-alternate-writes.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 #[path = "../../utils/mod.rs"] #[macro_use] diff --git a/src/tools/miri/tests/pass/tree_borrows/end-of-protector.rs b/src/tools/miri/tests/pass/tree_borrows/end-of-protector.rs index 4d941850e5415..261419b225b7d 100644 --- a/src/tools/miri/tests/pass/tree_borrows/end-of-protector.rs +++ b/src/tools/miri/tests/pass/tree_borrows/end-of-protector.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 // Check that a protector goes back to normal behavior when the function diff --git a/src/tools/miri/tests/pass/tree_borrows/formatting.rs b/src/tools/miri/tests/pass/tree_borrows/formatting.rs index c4360f0dbb9a4..8898205bfb9ac 100644 --- a/src/tools/miri/tests/pass/tree_borrows/formatting.rs +++ b/src/tools/miri/tests/pass/tree_borrows/formatting.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 #[path = "../../utils/mod.rs"] diff --git a/src/tools/miri/tests/pass/tree_borrows/reborrow-is-read.rs b/src/tools/miri/tests/pass/tree_borrows/reborrow-is-read.rs index 7a5fd395c7fd8..4fbccef2367d5 100644 --- a/src/tools/miri/tests/pass/tree_borrows/reborrow-is-read.rs +++ b/src/tools/miri/tests/pass/tree_borrows/reborrow-is-read.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 #[path = "../../utils/mod.rs"] diff --git a/src/tools/miri/tests/pass/tree_borrows/reserved.rs b/src/tools/miri/tests/pass/tree_borrows/reserved.rs index ef47d30e2efca..87ce91a809f22 100644 --- a/src/tools/miri/tests/pass/tree_borrows/reserved.rs +++ b/src/tools/miri/tests/pass/tree_borrows/reserved.rs @@ -1,3 +1,4 @@ +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 #[path = "../../utils/mod.rs"] diff --git a/src/tools/miri/tests/pass/tree_borrows/unique.rs b/src/tools/miri/tests/pass/tree_borrows/unique.rs index 6c5ed9efceeaa..f1ca1b51aa857 100644 --- a/src/tools/miri/tests/pass/tree_borrows/unique.rs +++ b/src/tools/miri/tests/pass/tree_borrows/unique.rs @@ -1,4 +1,5 @@ //@revisions: default uniq +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 //@[uniq]compile-flags: -Zmiri-unique-is-unique diff --git a/src/tools/miri/tests/pass/tree_borrows/vec_unique.rs b/src/tools/miri/tests/pass/tree_borrows/vec_unique.rs index 8d0f4bd0fe79c..05090d685ab2e 100644 --- a/src/tools/miri/tests/pass/tree_borrows/vec_unique.rs +++ b/src/tools/miri/tests/pass/tree_borrows/vec_unique.rs @@ -1,4 +1,5 @@ //@revisions: default uniq +// We disable the GC for this test because it would change what is printed. //@compile-flags: -Zmiri-tree-borrows -Zmiri-provenance-gc=0 //@[uniq]compile-flags: -Zmiri-unique-is-unique From 76ec47782ad310262598c21b618225d718cefbea Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 Nov 2023 11:02:08 +0100 Subject: [PATCH 04/13] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index 0006bbc97fea2..542c0c6cee90b 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -48cfbe0cdfbc812a9bd8ce0b3bf6ca003bd12e6a +c52b8763bf36027f24baabe1f97cab3d3571c9e5 From 64fb96f17e51317f58edc2da565853686e2d097b Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 Nov 2023 13:09:37 +0100 Subject: [PATCH 05/13] move 'uninit' tests into common directory --- .../tests/fail/{ => uninit}/uninit-after-aggregate-assign.rs | 0 .../fail/{ => uninit}/uninit-after-aggregate-assign.stderr | 0 .../{uninit_buffer.rs => uninit/uninit_alloc_diagnostic.rs} | 1 + .../uninit_alloc_diagnostic.stderr} | 2 +- .../uninit_alloc_diagnostic_with_provenance.rs} | 1 + .../uninit_alloc_diagnostic_with_provenance.stderr} | 2 +- src/tools/miri/tests/fail/{ => uninit}/uninit_byte_read.rs | 0 src/tools/miri/tests/fail/{ => uninit}/uninit_byte_read.stderr | 0 8 files changed, 4 insertions(+), 2 deletions(-) rename src/tools/miri/tests/fail/{ => uninit}/uninit-after-aggregate-assign.rs (100%) rename src/tools/miri/tests/fail/{ => uninit}/uninit-after-aggregate-assign.stderr (100%) rename src/tools/miri/tests/fail/{uninit_buffer.rs => uninit/uninit_alloc_diagnostic.rs} (93%) rename src/tools/miri/tests/fail/{uninit_buffer.stderr => uninit/uninit_alloc_diagnostic.stderr} (97%) rename src/tools/miri/tests/fail/{uninit_buffer_with_provenance.rs => uninit/uninit_alloc_diagnostic_with_provenance.rs} (96%) rename src/tools/miri/tests/fail/{uninit_buffer_with_provenance.stderr => uninit/uninit_alloc_diagnostic_with_provenance.stderr} (96%) rename src/tools/miri/tests/fail/{ => uninit}/uninit_byte_read.rs (100%) rename src/tools/miri/tests/fail/{ => uninit}/uninit_byte_read.stderr (100%) diff --git a/src/tools/miri/tests/fail/uninit-after-aggregate-assign.rs b/src/tools/miri/tests/fail/uninit/uninit-after-aggregate-assign.rs similarity index 100% rename from src/tools/miri/tests/fail/uninit-after-aggregate-assign.rs rename to src/tools/miri/tests/fail/uninit/uninit-after-aggregate-assign.rs diff --git a/src/tools/miri/tests/fail/uninit-after-aggregate-assign.stderr b/src/tools/miri/tests/fail/uninit/uninit-after-aggregate-assign.stderr similarity index 100% rename from src/tools/miri/tests/fail/uninit-after-aggregate-assign.stderr rename to src/tools/miri/tests/fail/uninit/uninit-after-aggregate-assign.stderr diff --git a/src/tools/miri/tests/fail/uninit_buffer.rs b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.rs similarity index 93% rename from src/tools/miri/tests/fail/uninit_buffer.rs rename to src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.rs index d622b2fa7d812..8deaa30d50ff2 100644 --- a/src/tools/miri/tests/fail/uninit_buffer.rs +++ b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.rs @@ -1,3 +1,4 @@ +//@compile-flags: -Zmiri-disable-validation //@error-in-other-file: memory is uninitialized at [0x4..0x10] #![allow(dropping_copy_types)] diff --git a/src/tools/miri/tests/fail/uninit_buffer.stderr b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.stderr similarity index 97% rename from src/tools/miri/tests/fail/uninit_buffer.stderr rename to src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.stderr index 2d04c0f9be2fa..cca17a07ec208 100644 --- a/src/tools/miri/tests/fail/uninit_buffer.stderr +++ b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic.stderr @@ -10,7 +10,7 @@ LL | let mut order = unsafe { compare_bytes(left.as_ptr(), right.as_ptr( = note: inside `::compare` at RUSTLIB/core/src/slice/cmp.rs:LL:CC = note: inside `core::slice::cmp::::cmp` at RUSTLIB/core/src/slice/cmp.rs:LL:CC note: inside `main` - --> $DIR/uninit_buffer.rs:LL:CC + --> $DIR/uninit_alloc_diagnostic.rs:LL:CC | LL | drop(slice1.cmp(slice2)); | ^^^^^^^^^^^^^^^^^^ diff --git a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.rs similarity index 96% rename from src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs rename to src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.rs index ca825901372c5..adabff4a2cea2 100644 --- a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.rs +++ b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.rs @@ -1,3 +1,4 @@ +//@compile-flags: -Zmiri-disable-validation //@error-in-other-file: memory is uninitialized at [0x4..0x8] //@normalize-stderr-test: "a[0-9]+" -> "ALLOC" #![feature(strict_provenance)] diff --git a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.stderr b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.stderr similarity index 96% rename from src/tools/miri/tests/fail/uninit_buffer_with_provenance.stderr rename to src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.stderr index cd842f0eba538..4dc2d27ead433 100644 --- a/src/tools/miri/tests/fail/uninit_buffer_with_provenance.stderr +++ b/src/tools/miri/tests/fail/uninit/uninit_alloc_diagnostic_with_provenance.stderr @@ -10,7 +10,7 @@ LL | let mut order = unsafe { compare_bytes(left.as_ptr(), right.as_ptr( = note: inside `::compare` at RUSTLIB/core/src/slice/cmp.rs:LL:CC = note: inside `core::slice::cmp::::cmp` at RUSTLIB/core/src/slice/cmp.rs:LL:CC note: inside `main` - --> $DIR/uninit_buffer_with_provenance.rs:LL:CC + --> $DIR/uninit_alloc_diagnostic_with_provenance.rs:LL:CC | LL | drop(slice1.cmp(slice2)); | ^^^^^^^^^^^^^^^^^^ diff --git a/src/tools/miri/tests/fail/uninit_byte_read.rs b/src/tools/miri/tests/fail/uninit/uninit_byte_read.rs similarity index 100% rename from src/tools/miri/tests/fail/uninit_byte_read.rs rename to src/tools/miri/tests/fail/uninit/uninit_byte_read.rs diff --git a/src/tools/miri/tests/fail/uninit_byte_read.stderr b/src/tools/miri/tests/fail/uninit/uninit_byte_read.stderr similarity index 100% rename from src/tools/miri/tests/fail/uninit_byte_read.stderr rename to src/tools/miri/tests/fail/uninit/uninit_byte_read.stderr From a0c8b09cf887ade10bcc5b2a06b32304af3cebbe Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 Nov 2023 13:11:17 +0100 Subject: [PATCH 06/13] move some validity-related tests into subdir --- .../fail/{invalid_bool.rs => validity/invalid_bool_op.rs} | 0 .../{invalid_bool.stderr => validity/invalid_bool_op.stderr} | 4 ++-- .../fail/{invalid_char.rs => validity/invalid_char_op.rs} | 0 .../{invalid_char.stderr => validity/invalid_char_op.stderr} | 4 ++-- .../fail/{invalid_enum_tag.rs => validity/invalid_enum_op.rs} | 0 .../invalid_enum_op.stderr} | 4 ++-- .../tests/fail/{invalid_int.rs => validity/invalid_int_op.rs} | 0 .../{invalid_int.stderr => validity/invalid_int_op.stderr} | 4 ++-- 8 files changed, 8 insertions(+), 8 deletions(-) rename src/tools/miri/tests/fail/{invalid_bool.rs => validity/invalid_bool_op.rs} (100%) rename src/tools/miri/tests/fail/{invalid_bool.stderr => validity/invalid_bool_op.stderr} (87%) rename src/tools/miri/tests/fail/{invalid_char.rs => validity/invalid_char_op.rs} (100%) rename src/tools/miri/tests/fail/{invalid_char.stderr => validity/invalid_char_op.stderr} (86%) rename src/tools/miri/tests/fail/{invalid_enum_tag.rs => validity/invalid_enum_op.rs} (100%) rename src/tools/miri/tests/fail/{invalid_enum_tag.stderr => validity/invalid_enum_op.stderr} (85%) rename src/tools/miri/tests/fail/{invalid_int.rs => validity/invalid_int_op.rs} (100%) rename src/tools/miri/tests/fail/{invalid_int.stderr => validity/invalid_int_op.stderr} (88%) diff --git a/src/tools/miri/tests/fail/invalid_bool.rs b/src/tools/miri/tests/fail/validity/invalid_bool_op.rs similarity index 100% rename from src/tools/miri/tests/fail/invalid_bool.rs rename to src/tools/miri/tests/fail/validity/invalid_bool_op.rs diff --git a/src/tools/miri/tests/fail/invalid_bool.stderr b/src/tools/miri/tests/fail/validity/invalid_bool_op.stderr similarity index 87% rename from src/tools/miri/tests/fail/invalid_bool.stderr rename to src/tools/miri/tests/fail/validity/invalid_bool_op.stderr index fd1ea5087b2e0..b938d29e760ad 100644 --- a/src/tools/miri/tests/fail/invalid_bool.stderr +++ b/src/tools/miri/tests/fail/validity/invalid_bool_op.stderr @@ -1,5 +1,5 @@ error: Undefined Behavior: interpreting an invalid 8-bit value as a bool: 0x02 - --> $DIR/invalid_bool.rs:LL:CC + --> $DIR/invalid_bool_op.rs:LL:CC | LL | let _x = b == std::hint::black_box(true); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ interpreting an invalid 8-bit value as a bool: 0x02 @@ -7,7 +7,7 @@ LL | let _x = b == std::hint::black_box(true); = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information = note: BACKTRACE: - = note: inside `main` at $DIR/invalid_bool.rs:LL:CC + = note: inside `main` at $DIR/invalid_bool_op.rs:LL:CC note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/invalid_char.rs b/src/tools/miri/tests/fail/validity/invalid_char_op.rs similarity index 100% rename from src/tools/miri/tests/fail/invalid_char.rs rename to src/tools/miri/tests/fail/validity/invalid_char_op.rs diff --git a/src/tools/miri/tests/fail/invalid_char.stderr b/src/tools/miri/tests/fail/validity/invalid_char_op.stderr similarity index 86% rename from src/tools/miri/tests/fail/invalid_char.stderr rename to src/tools/miri/tests/fail/validity/invalid_char_op.stderr index 81d6cdad15728..113eecd9cf7aa 100644 --- a/src/tools/miri/tests/fail/invalid_char.stderr +++ b/src/tools/miri/tests/fail/validity/invalid_char_op.stderr @@ -1,5 +1,5 @@ error: Undefined Behavior: interpreting an invalid 32-bit value as a char: $HEX - --> $DIR/invalid_char.rs:LL:CC + --> $DIR/invalid_char_op.rs:LL:CC | LL | let _x = c == 'x'; | ^^^^^^^^ interpreting an invalid 32-bit value as a char: $HEX @@ -7,7 +7,7 @@ LL | let _x = c == 'x'; = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information = note: BACKTRACE: - = note: inside `main` at $DIR/invalid_char.rs:LL:CC + = note: inside `main` at $DIR/invalid_char_op.rs:LL:CC note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/invalid_enum_tag.rs b/src/tools/miri/tests/fail/validity/invalid_enum_op.rs similarity index 100% rename from src/tools/miri/tests/fail/invalid_enum_tag.rs rename to src/tools/miri/tests/fail/validity/invalid_enum_op.rs diff --git a/src/tools/miri/tests/fail/invalid_enum_tag.stderr b/src/tools/miri/tests/fail/validity/invalid_enum_op.stderr similarity index 85% rename from src/tools/miri/tests/fail/invalid_enum_tag.stderr rename to src/tools/miri/tests/fail/validity/invalid_enum_op.stderr index 5a446bb2a56fd..e7997689c51c0 100644 --- a/src/tools/miri/tests/fail/invalid_enum_tag.stderr +++ b/src/tools/miri/tests/fail/validity/invalid_enum_op.stderr @@ -1,5 +1,5 @@ error: Undefined Behavior: enum value has invalid tag: $HEX - --> $DIR/invalid_enum_tag.rs:LL:CC + --> $DIR/invalid_enum_op.rs:LL:CC | LL | let _val = mem::discriminant(&f); | ^^^^^^^^^^^^^^^^^^^^^ enum value has invalid tag: $HEX @@ -7,7 +7,7 @@ LL | let _val = mem::discriminant(&f); = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information = note: BACKTRACE: - = note: inside `main` at $DIR/invalid_enum_tag.rs:LL:CC + = note: inside `main` at $DIR/invalid_enum_op.rs:LL:CC note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace diff --git a/src/tools/miri/tests/fail/invalid_int.rs b/src/tools/miri/tests/fail/validity/invalid_int_op.rs similarity index 100% rename from src/tools/miri/tests/fail/invalid_int.rs rename to src/tools/miri/tests/fail/validity/invalid_int_op.rs diff --git a/src/tools/miri/tests/fail/invalid_int.stderr b/src/tools/miri/tests/fail/validity/invalid_int_op.stderr similarity index 88% rename from src/tools/miri/tests/fail/invalid_int.stderr rename to src/tools/miri/tests/fail/validity/invalid_int_op.stderr index a450b9393846c..df344311b7577 100644 --- a/src/tools/miri/tests/fail/invalid_int.stderr +++ b/src/tools/miri/tests/fail/validity/invalid_int_op.stderr @@ -1,5 +1,5 @@ error: Undefined Behavior: using uninitialized data, but this operation requires initialized memory - --> $DIR/invalid_int.rs:LL:CC + --> $DIR/invalid_int_op.rs:LL:CC | LL | let i = unsafe { std::mem::MaybeUninit::::uninit().assume_init() }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ using uninitialized data, but this operation requires initialized memory @@ -7,7 +7,7 @@ LL | let i = unsafe { std::mem::MaybeUninit::::uninit().assume_init() } = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information = note: BACKTRACE: - = note: inside `main` at $DIR/invalid_int.rs:LL:CC + = note: inside `main` at $DIR/invalid_int_op.rs:LL:CC note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace From cd124409335f8830becb7f7ec7de1c6aa8a504e3 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Thu, 30 Nov 2023 14:29:54 +0100 Subject: [PATCH 07/13] give macOS some extra time, it needs that --- src/tools/miri/tests/pass/concurrency/sync.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/tests/pass/concurrency/sync.rs b/src/tools/miri/tests/pass/concurrency/sync.rs index dccc9d104dd0e..e93e617fd2620 100644 --- a/src/tools/miri/tests/pass/concurrency/sync.rs +++ b/src/tools/miri/tests/pass/concurrency/sync.rs @@ -83,7 +83,7 @@ fn check_conditional_variables_timed_wait_notimeout() { cvar.notify_one(); }); - let (_guard, timeout) = cvar.wait_timeout(guard, Duration::from_millis(500)).unwrap(); + let (_guard, timeout) = cvar.wait_timeout(guard, Duration::from_millis(1000)).unwrap(); assert!(!timeout.timed_out()); handle.join().unwrap(); } From fce04efed2a97a79fb4a9133cc22f60401212674 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 2 Dec 2023 10:37:45 +0100 Subject: [PATCH 08/13] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index 542c0c6cee90b..d538a0c9ff5d4 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -c52b8763bf36027f24baabe1f97cab3d3571c9e5 +0919ad18381f6f4fcaddc809e786553e028bbde0 From 48176d44472e557d9db38f96903784c151b88cd7 Mon Sep 17 00:00:00 2001 From: The Miri Conjob Bot Date: Sun, 3 Dec 2023 05:04:26 +0000 Subject: [PATCH 09/13] Preparing for merge from rustc --- src/tools/miri/rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/miri/rust-version b/src/tools/miri/rust-version index d538a0c9ff5d4..a7ae20c1a35ab 100644 --- a/src/tools/miri/rust-version +++ b/src/tools/miri/rust-version @@ -1 +1 @@ -0919ad18381f6f4fcaddc809e786553e028bbde0 +225e36cff9809948d6567ab16f75d7b087ea83a7 From 323ca94d921834bc02bb960dc0473aa8250fa49d Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 3 Dec 2023 10:45:10 +0100 Subject: [PATCH 10/13] new trophy case entry --- src/tools/miri/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/miri/README.md b/src/tools/miri/README.md index aa0b791bd05fd..3dee742fa0dea 100644 --- a/src/tools/miri/README.md +++ b/src/tools/miri/README.md @@ -589,6 +589,7 @@ Definite bugs found: * [`regex` incorrectly handling unaligned `Vec` buffers](https://www.reddit.com/r/rust/comments/vq3mmu/comment/ienc7t0?context=3) * [Incorrect use of `compare_exchange_weak` in `once_cell`](https://github.com/matklad/once_cell/issues/186) * [Dropping with unaligned pointers in `vec::IntoIter`](https://github.com/rust-lang/rust/pull/106084) +* [Deallocating with the wrong layout in new specializations for in-place `Iterator::collect`](https://github.com/rust-lang/rust/pull/118460) Violations of [Stacked Borrows] found that are likely bugs (but Stacked Borrows is currently just an experiment): From 11db9de7289d0405f40cfd3cb0f9acda7e5b9564 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 3 Dec 2023 11:28:40 +0100 Subject: [PATCH 11/13] simd_select_bitmask: support passing the mask as an array --- src/tools/miri/src/shims/intrinsics/simd.rs | 15 ++++++++++++--- src/tools/miri/tests/pass/portable-simd.rs | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/tools/miri/src/shims/intrinsics/simd.rs b/src/tools/miri/src/shims/intrinsics/simd.rs index d0a293d5f81e3..63af0814c8b30 100644 --- a/src/tools/miri/src/shims/intrinsics/simd.rs +++ b/src/tools/miri/src/shims/intrinsics/simd.rs @@ -386,7 +386,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { let (dest, dest_len) = this.place_to_simd(dest)?; let bitmask_len = dest_len.max(8); - assert!(mask.layout.ty.is_integral()); assert!(bitmask_len <= 64); assert_eq!(bitmask_len, mask.layout.size.bits()); assert_eq!(dest_len, yes_len); @@ -394,8 +393,18 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { let dest_len = u32::try_from(dest_len).unwrap(); let bitmask_len = u32::try_from(bitmask_len).unwrap(); - let mask: u64 = - this.read_scalar(mask)?.to_bits(mask.layout.size)?.try_into().unwrap(); + // The mask can be a single integer or an array. + let mask: u64 = match mask.layout.ty.kind() { + ty::Int(..) | ty::Uint(..) => + this.read_scalar(mask)?.to_bits(mask.layout.size)?.try_into().unwrap(), + ty::Array(elem, _) if matches!(elem.kind(), ty::Uint(ty::UintTy::U8)) => { + let mask_ty = this.machine.layouts.uint(mask.layout.size).unwrap(); + let mask = mask.transmute(mask_ty, this)?; + this.read_scalar(&mask)?.to_bits(mask_ty.size)?.try_into().unwrap() + } + _ => bug!("simd_select_bitmask: invalid mask type {}", mask.layout.ty), + }; + for i in 0..dest_len { let mask = mask & 1u64 diff --git a/src/tools/miri/tests/pass/portable-simd.rs b/src/tools/miri/tests/pass/portable-simd.rs index 2179bcf1c38db..1ef9d8f38c009 100644 --- a/src/tools/miri/tests/pass/portable-simd.rs +++ b/src/tools/miri/tests/pass/portable-simd.rs @@ -247,6 +247,22 @@ fn simd_mask() { assert_eq!(bitmask2, [0b0001]); } } + + // This used to cause an ICE. + let bitmask = u8x8::from_array([0b01000101, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!( + mask32x8::from_bitmask_vector(bitmask), + mask32x8::from_array([true, false, true, false, false, false, true, false]), + ); + let bitmask = + u8x16::from_array([0b01000101, 0b11110000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!( + mask32x16::from_bitmask_vector(bitmask), + mask32x16::from_array([ + true, false, true, false, false, false, true, false, false, false, false, false, true, + true, true, true, + ]), + ); } fn simd_cast() { From 31ea5181b60094bb6597902bbe8357015fd78f35 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 3 Dec 2023 11:44:07 +0100 Subject: [PATCH 12/13] add simd_cttz and simd_ctlz --- src/tools/miri/src/shims/intrinsics/simd.rs | 24 +++++++++++++++++++-- src/tools/miri/tests/pass/portable-simd.rs | 5 +++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/tools/miri/src/shims/intrinsics/simd.rs b/src/tools/miri/src/shims/intrinsics/simd.rs index 63af0814c8b30..3df054372682e 100644 --- a/src/tools/miri/src/shims/intrinsics/simd.rs +++ b/src/tools/miri/src/shims/intrinsics/simd.rs @@ -1,6 +1,7 @@ use rustc_apfloat::{Float, Round}; use rustc_middle::ty::layout::{HasParamEnv, LayoutOf}; use rustc_middle::{mir, ty, ty::FloatTy}; +use rustc_span::{sym, Symbol}; use rustc_target::abi::{Endian, HasDataLayout}; use crate::*; @@ -25,7 +26,10 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { | "floor" | "round" | "trunc" - | "fsqrt" => { + | "fsqrt" + | "ctlz" + | "cttz" + => { let [op] = check_arg_count(args)?; let (op, op_len) = this.operand_to_simd(op)?; let (dest, dest_len) = this.place_to_simd(dest)?; @@ -38,6 +42,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { Abs, Sqrt, Round(rustc_apfloat::Round), + Numeric(Symbol), } let which = match intrinsic_name { "neg" => Op::MirOp(mir::UnOp::Neg), @@ -47,6 +52,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { "floor" => Op::Round(rustc_apfloat::Round::TowardNegative), "round" => Op::Round(rustc_apfloat::Round::NearestTiesToAway), "trunc" => Op::Round(rustc_apfloat::Round::TowardZero), + "ctlz" => Op::Numeric(sym::ctlz), + "cttz" => Op::Numeric(sym::cttz), _ => unreachable!(), }; @@ -101,6 +108,18 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { } } } + Op::Numeric(name) => { + assert!(op.layout.ty.is_integral()); + let size = op.layout.size; + let bits = op.to_scalar().to_bits(size).unwrap(); + let extra = 128u128.checked_sub(u128::from(size.bits())).unwrap(); + let bits_out = match name { + sym::ctlz => u128::from(bits.leading_zeros()).checked_sub(extra).unwrap(), + sym::cttz => u128::from((bits << extra).trailing_zeros()).checked_sub(extra).unwrap(), + _ => unreachable!(), + }; + Scalar::from_uint(bits_out, size) + } }; this.write_scalar(val, &dest)?; } @@ -126,7 +145,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { | "fmin" | "saturating_add" | "saturating_sub" - | "arith_offset" => { + | "arith_offset" + => { use mir::BinOp; let [left, right] = check_arg_count(args)?; diff --git a/src/tools/miri/tests/pass/portable-simd.rs b/src/tools/miri/tests/pass/portable-simd.rs index 1ef9d8f38c009..26f622512f164 100644 --- a/src/tools/miri/tests/pass/portable-simd.rs +++ b/src/tools/miri/tests/pass/portable-simd.rs @@ -197,6 +197,11 @@ fn simd_ops_i32() { assert_eq!(b.reduce_or(), -1); assert_eq!(a.reduce_xor(), 0); assert_eq!(b.reduce_xor(), -4); + + assert_eq!(b.leading_zeros(), u32x4::from_array([31, 30, 30, 0])); + assert_eq!(b.trailing_zeros(), u32x4::from_array([0, 1, 0, 2])); + assert_eq!(b.leading_ones(), u32x4::from_array([0, 0, 0, 30])); + assert_eq!(b.trailing_ones(), u32x4::from_array([1, 0, 2, 0])); } fn simd_mask() { From 2903f1c322c9cad4dc45ed026f0036b2fa41f9bf Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 3 Dec 2023 12:08:02 +0100 Subject: [PATCH 13/13] add simd_bswap and simd_bitreverse --- src/tools/miri/src/shims/intrinsics/simd.rs | 6 ++++++ src/tools/miri/tests/pass/portable-simd.rs | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/tools/miri/src/shims/intrinsics/simd.rs b/src/tools/miri/src/shims/intrinsics/simd.rs index 3df054372682e..e16d116f621ed 100644 --- a/src/tools/miri/src/shims/intrinsics/simd.rs +++ b/src/tools/miri/src/shims/intrinsics/simd.rs @@ -29,6 +29,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { | "fsqrt" | "ctlz" | "cttz" + | "bswap" + | "bitreverse" => { let [op] = check_arg_count(args)?; let (op, op_len) = this.operand_to_simd(op)?; @@ -54,6 +56,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { "trunc" => Op::Round(rustc_apfloat::Round::TowardZero), "ctlz" => Op::Numeric(sym::ctlz), "cttz" => Op::Numeric(sym::cttz), + "bswap" => Op::Numeric(sym::bswap), + "bitreverse" => Op::Numeric(sym::bitreverse), _ => unreachable!(), }; @@ -116,6 +120,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> { let bits_out = match name { sym::ctlz => u128::from(bits.leading_zeros()).checked_sub(extra).unwrap(), sym::cttz => u128::from((bits << extra).trailing_zeros()).checked_sub(extra).unwrap(), + sym::bswap => (bits << extra).swap_bytes(), + sym::bitreverse => (bits << extra).reverse_bits(), _ => unreachable!(), }; Scalar::from_uint(bits_out, size) diff --git a/src/tools/miri/tests/pass/portable-simd.rs b/src/tools/miri/tests/pass/portable-simd.rs index 26f622512f164..514e12fffc5dc 100644 --- a/src/tools/miri/tests/pass/portable-simd.rs +++ b/src/tools/miri/tests/pass/portable-simd.rs @@ -202,6 +202,19 @@ fn simd_ops_i32() { assert_eq!(b.trailing_zeros(), u32x4::from_array([0, 1, 0, 2])); assert_eq!(b.leading_ones(), u32x4::from_array([0, 0, 0, 30])); assert_eq!(b.trailing_ones(), u32x4::from_array([1, 0, 2, 0])); + assert_eq!( + b.swap_bytes(), + i32x4::from_array([0x01000000, 0x02000000, 0x03000000, 0xfcffffffu32 as i32]) + ); + assert_eq!( + b.reverse_bits(), + i32x4::from_array([ + 0x80000000u32 as i32, + 0x40000000, + 0xc0000000u32 as i32, + 0x3fffffffu32 as i32 + ]) + ); } fn simd_mask() {