Skip to content

Commit a8f8106

Browse files
saethlinRalfJung
authored andcommitted
Use static dispatch in the visitor
1 parent 61e71ce commit a8f8106

File tree

10 files changed

+148
-105
lines changed

10 files changed

+148
-105
lines changed

src/tools/miri/src/concurrency/thread.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,15 @@ impl<'mir, 'tcx> Thread<'mir, 'tcx> {
182182
}
183183

184184
impl VisitMachineValues for Thread<'_, '_> {
185-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
185+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
186186
let Thread { panic_payload, last_error, stack, state: _, thread_name: _, join_status: _ } =
187187
self;
188188

189189
if let Some(payload) = panic_payload {
190-
visit(&Operand::Immediate(Immediate::Scalar(*payload)))
190+
visit.visit(*payload);
191191
}
192192
if let Some(error) = last_error {
193-
visit(&Operand::Indirect(**error))
193+
visit.visit(**error);
194194
}
195195
for frame in stack {
196196
frame.visit_machine_values(visit)
@@ -199,7 +199,7 @@ impl VisitMachineValues for Thread<'_, '_> {
199199
}
200200

201201
impl VisitMachineValues for Frame<'_, '_, Provenance, FrameData<'_>> {
202-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
202+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
203203
let Frame {
204204
return_place,
205205
locals,
@@ -213,12 +213,12 @@ impl VisitMachineValues for Frame<'_, '_, Provenance, FrameData<'_>> {
213213

214214
// Return place.
215215
if let Place::Ptr(mplace) = **return_place {
216-
visit(&Operand::Indirect(mplace));
216+
visit.visit(mplace);
217217
}
218218
// Locals.
219219
for local in locals.iter() {
220220
if let LocalValue::Live(value) = &local.value {
221-
visit(value);
221+
visit.visit(value);
222222
}
223223
}
224224

@@ -299,7 +299,7 @@ impl<'mir, 'tcx> Default for ThreadManager<'mir, 'tcx> {
299299
}
300300

301301
impl VisitMachineValues for ThreadManager<'_, '_> {
302-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
302+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
303303
let ThreadManager {
304304
threads,
305305
thread_local_alloc_ids,
@@ -313,8 +313,7 @@ impl VisitMachineValues for ThreadManager<'_, '_> {
313313
thread.visit_machine_values(visit);
314314
}
315315
for ptr in thread_local_alloc_ids.borrow().values().copied() {
316-
let ptr: Pointer<Option<Provenance>> = ptr.into();
317-
visit(&Operand::Indirect(MemPlace::from_ptr(ptr)));
316+
visit.visit(ptr);
318317
}
319318
// FIXME: Do we need to do something for TimeoutCallback? That's a Box<dyn>, not sure what
320319
// to do.

src/tools/miri/src/concurrency/weak_memory.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,15 @@ pub struct StoreBufferAlloc {
108108
store_buffers: RefCell<RangeObjectMap<StoreBuffer>>,
109109
}
110110

111-
impl VisitProvenance for StoreBufferAlloc {
112-
fn visit_provenance(&self, visitor: &mut impl FnMut(SbTag)) {
111+
impl VisitMachineValues for StoreBufferAlloc {
112+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
113113
for val in self
114114
.store_buffers
115115
.borrow()
116116
.iter()
117117
.flat_map(|buf| buf.buffer.iter().map(|element| &element.val))
118118
{
119-
if let Scalar::Ptr(ptr, _) = val {
120-
if let Provenance::Concrete { sb, .. } = ptr.provenance {
121-
visitor(sb);
122-
}
123-
}
119+
visit.visit(val);
124120
}
125121
}
126122
}

src/tools/miri/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ pub use crate::range_map::RangeMap;
112112
pub use crate::stacked_borrows::{
113113
CallId, EvalContextExt as StackedBorEvalContextExt, Item, Permission, SbTag, Stack, Stacks,
114114
};
115-
pub use crate::tag_gc::{EvalContextExt as _, VisitMachineValues, VisitProvenance};
115+
pub use crate::tag_gc::{EvalContextExt as _, ProvenanceVisitor, VisitMachineValues};
116116

117117
/// Insert rustc arguments at the beginning of the argument list that Miri wants to be
118118
/// set per default, for maximal validation power.

src/tools/miri/src/machine.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl<'tcx> std::fmt::Debug for FrameData<'tcx> {
6464
}
6565

6666
impl VisitMachineValues for FrameData<'_> {
67-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
67+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
6868
let FrameData { catch_unwind, stacked_borrows: _, timing: _ } = self;
6969

7070
if let Some(catch_unwind) = catch_unwind {
@@ -261,6 +261,20 @@ pub struct AllocExtra {
261261
pub weak_memory: Option<weak_memory::AllocExtra>,
262262
}
263263

264+
impl VisitMachineValues for AllocExtra {
265+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
266+
let AllocExtra { stacked_borrows, data_race: _, weak_memory } = self;
267+
268+
if let Some(stacked_borrows) = stacked_borrows {
269+
stacked_borrows.borrow().visit_machine_values(visit);
270+
}
271+
272+
if let Some(weak_memory) = weak_memory {
273+
weak_memory.visit_machine_values(visit);
274+
}
275+
}
276+
}
277+
264278
/// Precomputed layouts of primitive types
265279
pub struct PrimitiveLayouts<'tcx> {
266280
pub unit: TyAndLayout<'tcx>,
@@ -602,7 +616,7 @@ impl<'mir, 'tcx> MiriMachine<'mir, 'tcx> {
602616
}
603617

604618
impl VisitMachineValues for MiriMachine<'_, '_> {
605-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
619+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
606620
let MiriMachine {
607621
threads,
608622
tls,
@@ -621,17 +635,16 @@ impl VisitMachineValues for MiriMachine<'_, '_> {
621635
dir_handler.visit_machine_values(visit);
622636

623637
if let Some(argc) = argc {
624-
visit(&Operand::Indirect(*argc));
638+
visit.visit(argc);
625639
}
626640
if let Some(argv) = argv {
627-
visit(&Operand::Indirect(*argv));
641+
visit.visit(argv);
628642
}
629643
if let Some(cmd_line) = cmd_line {
630-
visit(&Operand::Indirect(*cmd_line));
644+
visit.visit(cmd_line);
631645
}
632646
for ptr in extern_statics.values().copied() {
633-
let ptr: Pointer<Option<Provenance>> = ptr.into();
634-
visit(&Operand::Indirect(MemPlace::from_ptr(ptr)));
647+
visit.visit(ptr);
635648
}
636649
}
637650
}

src/tools/miri/src/shims/env.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,14 @@ pub struct EnvVars<'tcx> {
3737
}
3838

3939
impl VisitMachineValues for EnvVars<'_> {
40-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
40+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
4141
let EnvVars { map, environ } = self;
4242

4343
for ptr in map.values() {
44-
visit(&Operand::Indirect(MemPlace::from_ptr(*ptr)));
44+
visit.visit(*ptr);
4545
}
46-
4746
if let Some(env) = environ {
48-
visit(&Operand::Indirect(**env));
47+
visit.visit(**env);
4948
}
5049
}
5150
}

src/tools/miri/src/shims/panic.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ pub struct CatchUnwindData<'tcx> {
3636
}
3737

3838
impl VisitMachineValues for CatchUnwindData<'_> {
39-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
39+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
4040
let CatchUnwindData { catch_fn, data, dest: _, ret: _ } = self;
41-
visit(&Operand::Indirect(MemPlace::from_ptr(*catch_fn)));
42-
visit(&Operand::Immediate(Immediate::Scalar(*data)));
41+
visit.visit(catch_fn);
42+
visit.visit(data);
4343
}
4444
}
4545

src/tools/miri/src/shims/tls.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,14 @@ impl<'tcx> TlsData<'tcx> {
236236
}
237237

238238
impl VisitMachineValues for TlsData<'_> {
239-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
239+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
240240
let TlsData { keys, macos_thread_dtors, next_key: _, dtors_running: _ } = self;
241241

242242
for scalar in keys.values().flat_map(|v| v.data.values()) {
243-
visit(&Operand::Immediate(Immediate::Scalar(*scalar)));
243+
visit.visit(scalar);
244244
}
245245
for (_, scalar) in macos_thread_dtors.values() {
246-
visit(&Operand::Immediate(Immediate::Scalar(*scalar)));
246+
visit.visit(scalar);
247247
}
248248
}
249249
}

src/tools/miri/src/shims/unix/fs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,11 +463,11 @@ impl Default for DirHandler {
463463
}
464464

465465
impl VisitMachineValues for DirHandler {
466-
fn visit_machine_values(&self, visit: &mut impl FnMut(&Operand<Provenance>)) {
466+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
467467
let DirHandler { streams, next_id: _ } = self;
468468

469469
for dir in streams.values() {
470-
visit(&Operand::Indirect(MemPlace::from_ptr(dir.entry)));
470+
visit.visit(dir.entry);
471471
}
472472
}
473473
}

src/tools/miri/src/stacked_borrows/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,10 +513,10 @@ impl Stacks {
513513
}
514514
}
515515

516-
impl VisitProvenance for Stacks {
517-
fn visit_provenance(&self, visit: &mut impl FnMut(SbTag)) {
516+
impl VisitMachineValues for Stacks {
517+
fn visit_machine_values(&self, visit: &mut ProvenanceVisitor) {
518518
for tag in self.exposed_tags.iter().copied() {
519-
visit(tag);
519+
visit.visit(tag);
520520
}
521521
}
522522
}

0 commit comments

Comments
 (0)