Skip to content

Commit cdffee5

Browse files
committed
Extend the BorTag GC to AllocIds
1 parent 448452d commit cdffee5

File tree

20 files changed

+429
-0
lines changed

20 files changed

+429
-0
lines changed

src/borrow_tracker/mod.rs

+11
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ impl VisitTags for FrameState {
7676
fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {
7777
// `protected_tags` are already recorded by `GlobalStateInner`.
7878
}
79+
80+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {}
7981
}
8082

8183
/// Extra global state, available to the memory access hooks.
@@ -115,6 +117,8 @@ impl VisitTags for GlobalStateInner {
115117
// The only other candidate is base_ptr_tags, and that does not need visiting since we don't ever
116118
// GC the bottommost/root tag.
117119
}
120+
121+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {}
118122
}
119123

120124
/// We need interior mutable access to the global state.
@@ -459,4 +463,11 @@ impl VisitTags for AllocState {
459463
AllocState::TreeBorrows(tb) => tb.visit_tags(visit),
460464
}
461465
}
466+
467+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
468+
match self {
469+
AllocState::StackedBorrows(sb) => sb.visit_prov(visit),
470+
AllocState::TreeBorrows(tb) => tb.visit_prov(visit),
471+
}
472+
}
462473
}

src/borrow_tracker/stacked_borrows/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,10 @@ impl VisitTags for Stacks {
468468
visit(tag);
469469
}
470470
}
471+
472+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {
473+
/* No allocs */
474+
}
471475
}
472476

473477
/// Map per-stack operations to higher-level per-location-range operations.

src/borrow_tracker/tree_borrows/tree.rs

+4
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,10 @@ impl VisitTags for Tree {
656656
// (the `root` node of `Tree` is not an `Option<_>`)
657657
visit(self.nodes.get(self.root).unwrap().tag)
658658
}
659+
660+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {
661+
/* No allocs */
662+
}
659663
}
660664

661665
/// Relative position of the access

src/concurrency/data_race.rs

+8
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,10 @@ impl VisitTags for VClockAlloc {
697697
fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {
698698
// No tags here.
699699
}
700+
701+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {
702+
// No allocs here.
703+
}
700704
}
701705

702706
impl VClockAlloc {
@@ -1278,6 +1282,10 @@ impl VisitTags for GlobalState {
12781282
fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {
12791283
// We don't have any tags.
12801284
}
1285+
1286+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {
1287+
// No allocs here.
1288+
}
12811289
}
12821290

12831291
impl GlobalState {

src/concurrency/init_once.rs

+6
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ impl<'mir, 'tcx> VisitTags for InitOnce<'mir, 'tcx> {
5151
waiter.callback.visit_tags(visit);
5252
}
5353
}
54+
55+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
56+
for waiter in self.waiters.iter() {
57+
waiter.callback.visit_prov(visit);
58+
}
59+
}
5460
}
5561

5662
impl<'mir, 'tcx: 'mir> EvalContextExtPriv<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}

src/concurrency/sync.rs

+6
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ impl<'mir, 'tcx> VisitTags for SynchronizationState<'mir, 'tcx> {
187187
init_once.visit_tags(visit);
188188
}
189189
}
190+
191+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
192+
for init_once in self.init_onces.iter() {
193+
init_once.visit_prov(visit);
194+
}
195+
}
190196
}
191197

192198
// Private extension trait for local helper methods

src/concurrency/thread.rs

+75
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,27 @@ impl VisitTags for Thread<'_, '_> {
240240
frame.visit_tags(visit)
241241
}
242242
}
243+
244+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
245+
let Thread {
246+
panic_payloads: panic_payload,
247+
last_error,
248+
stack,
249+
top_user_relevant_frame: _,
250+
state: _,
251+
thread_name: _,
252+
join_status: _,
253+
on_stack_empty: _, // we assume the closure captures no GC-relevant state
254+
} = self;
255+
256+
for payload in panic_payload {
257+
payload.visit_prov(visit);
258+
}
259+
last_error.visit_prov(visit);
260+
for frame in stack {
261+
frame.visit_prov(visit)
262+
}
263+
}
243264
}
244265

245266
impl VisitTags for Frame<'_, '_, Provenance, FrameExtra<'_>> {
@@ -274,6 +295,38 @@ impl VisitTags for Frame<'_, '_, Provenance, FrameExtra<'_>> {
274295

275296
extra.visit_tags(visit);
276297
}
298+
299+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
300+
let Frame {
301+
return_place,
302+
locals,
303+
extra,
304+
body: _,
305+
instance: _,
306+
return_to_block: _,
307+
loc: _,
308+
// There are some private fields we cannot access; they contain no tags.
309+
..
310+
} = self;
311+
312+
// Return place.
313+
return_place.visit_prov(visit);
314+
// Locals.
315+
for local in locals.iter() {
316+
match local.as_mplace_or_imm() {
317+
None => {}
318+
Some(Either::Left((ptr, meta))) => {
319+
ptr.visit_prov(visit);
320+
meta.visit_prov(visit);
321+
}
322+
Some(Either::Right(imm)) => {
323+
imm.visit_prov(visit);
324+
}
325+
}
326+
}
327+
328+
extra.visit_prov(visit);
329+
}
277330
}
278331

279332
/// A specific moment in time.
@@ -354,6 +407,28 @@ impl VisitTags for ThreadManager<'_, '_> {
354407
}
355408
sync.visit_tags(visit);
356409
}
410+
411+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
412+
let ThreadManager {
413+
threads,
414+
thread_local_alloc_ids,
415+
timeout_callbacks,
416+
active_thread: _,
417+
yield_active_thread: _,
418+
sync,
419+
} = self;
420+
421+
for thread in threads {
422+
thread.visit_prov(visit);
423+
}
424+
for ptr in thread_local_alloc_ids.borrow().values() {
425+
ptr.visit_prov(visit);
426+
}
427+
for callback in timeout_callbacks.values() {
428+
callback.callback.visit_prov(visit);
429+
}
430+
sync.visit_prov(visit);
431+
}
357432
}
358433

359434
impl<'mir, 'tcx> Default for ThreadManager<'mir, 'tcx> {

src/concurrency/weak_memory.rs

+11
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,17 @@ impl VisitTags for StoreBufferAlloc {
119119
val.visit_tags(visit);
120120
}
121121
}
122+
123+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
124+
let Self { store_buffers } = self;
125+
for val in store_buffers
126+
.borrow()
127+
.iter()
128+
.flat_map(|buf| buf.buffer.iter().map(|element| &element.val))
129+
{
130+
val.visit_prov(visit);
131+
}
132+
}
122133
}
123134

124135
#[derive(Debug, Clone, PartialEq, Eq)]

src/intptrcast.rs

+11
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ impl VisitTags for GlobalStateInner {
4848
fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {
4949
// Nothing to visit here.
5050
}
51+
52+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
53+
for id in &self.exposed {
54+
id.visit_prov(visit)
55+
}
56+
}
5157
}
5258

5359
impl GlobalStateInner {
@@ -63,6 +69,11 @@ impl GlobalStateInner {
6369
}
6470

6571
impl<'mir, 'tcx> GlobalStateInner {
72+
pub fn remove_unreachable_allocs(&mut self, live_allocs: &FxHashSet<AllocId>) {
73+
self.int_to_ptr_map.retain(|(_, id)| live_allocs.contains(id));
74+
self.base_addr.retain(|id, _| live_allocs.contains(id));
75+
}
76+
6677
// Returns the exposed `AllocId` that corresponds to the specified addr,
6778
// or `None` if the addr is out of bounds
6879
fn alloc_id_from_addr(ecx: &MiriInterpCx<'mir, 'tcx>, addr: u64) -> Option<AllocId> {

src/machine.rs

+81
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ impl VisitTags for FrameExtra<'_> {
8585
catch_unwind.visit_tags(visit);
8686
borrow_tracker.visit_tags(visit);
8787
}
88+
89+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
90+
let FrameExtra { catch_unwind, borrow_tracker, timing: _, is_user_relevant: _ } = self;
91+
92+
catch_unwind.visit_prov(visit);
93+
borrow_tracker.visit_prov(visit);
94+
}
8895
}
8996

9097
/// Extra memory kinds
@@ -302,6 +309,14 @@ impl VisitTags for AllocExtra<'_> {
302309
data_race.visit_tags(visit);
303310
weak_memory.visit_tags(visit);
304311
}
312+
313+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
314+
let AllocExtra { borrow_tracker, data_race, weak_memory, backtrace: _ } = self;
315+
316+
borrow_tracker.visit_prov(visit);
317+
data_race.visit_prov(visit);
318+
weak_memory.visit_prov(visit);
319+
}
305320
}
306321

307322
/// Precomputed layouts of primitive types
@@ -843,6 +858,72 @@ impl VisitTags for MiriMachine<'_, '_> {
843858
ptr.visit_tags(visit);
844859
}
845860
}
861+
862+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
863+
#[rustfmt::skip]
864+
let MiriMachine {
865+
threads,
866+
tls,
867+
env_vars,
868+
main_fn_ret_place,
869+
argc,
870+
argv,
871+
cmd_line,
872+
extern_statics,
873+
dir_handler,
874+
borrow_tracker,
875+
data_race,
876+
intptrcast,
877+
file_handler,
878+
tcx: _,
879+
isolated_op: _,
880+
validate: _,
881+
enforce_abi: _,
882+
clock: _,
883+
layouts: _,
884+
static_roots: _,
885+
profiler: _,
886+
string_cache: _,
887+
exported_symbols_cache: _,
888+
panic_on_unsupported: _,
889+
backtrace_style: _,
890+
local_crates: _,
891+
rng: _,
892+
tracked_alloc_ids: _,
893+
check_alignment: _,
894+
cmpxchg_weak_failure_rate: _,
895+
mute_stdout_stderr: _,
896+
weak_memory: _,
897+
preemption_rate: _,
898+
report_progress: _,
899+
basic_block_count: _,
900+
external_so_lib: _,
901+
gc_interval: _,
902+
since_gc: _,
903+
num_cpus: _,
904+
page_size: _,
905+
stack_addr: _,
906+
stack_size: _,
907+
collect_leak_backtraces: _,
908+
allocation_spans: _,
909+
} = self;
910+
911+
threads.visit_prov(visit);
912+
tls.visit_prov(visit);
913+
env_vars.visit_prov(visit);
914+
dir_handler.visit_prov(visit);
915+
file_handler.visit_prov(visit);
916+
data_race.visit_prov(visit);
917+
borrow_tracker.visit_prov(visit);
918+
intptrcast.visit_prov(visit);
919+
main_fn_ret_place.visit_prov(visit);
920+
argc.visit_prov(visit);
921+
argv.visit_prov(visit);
922+
cmd_line.visit_prov(visit);
923+
for ptr in extern_statics.values() {
924+
ptr.visit_prov(visit);
925+
}
926+
}
846927
}
847928

848929
/// A rustc InterpCx for Miri.

src/shims/env.rs

+9
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ impl VisitTags for EnvVars<'_> {
4646
ptr.visit_tags(visit);
4747
}
4848
}
49+
50+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
51+
let EnvVars { map, environ } = self;
52+
53+
environ.visit_prov(visit);
54+
for ptr in map.values() {
55+
ptr.visit_prov(visit);
56+
}
57+
}
4958
}
5059

5160
impl<'tcx> EnvVars<'tcx> {

src/shims/panic.rs

+7
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ impl VisitTags for CatchUnwindData<'_> {
4242
data.visit_tags(visit);
4343
dest.visit_tags(visit);
4444
}
45+
46+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
47+
let CatchUnwindData { catch_fn, data, dest, ret: _ } = self;
48+
catch_fn.visit_prov(visit);
49+
data.visit_prov(visit);
50+
dest.visit_prov(visit);
51+
}
4552
}
4653

4754
impl<'mir, 'tcx: 'mir> EvalContextExt<'mir, 'tcx> for crate::MiriInterpCx<'mir, 'tcx> {}

src/shims/time.rs

+1
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ struct UnblockCallback {
280280

281281
impl VisitTags for UnblockCallback {
282282
fn visit_tags(&self, _visit: &mut dyn FnMut(BorTag)) {}
283+
fn visit_prov(&self, _visit: &mut dyn FnMut(AllocId)) {}
283284
}
284285

285286
impl<'mir, 'tcx: 'mir> MachineCallback<'mir, 'tcx> for UnblockCallback {

src/shims/tls.rs

+11
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,17 @@ impl VisitTags for TlsData<'_> {
218218
scalar.visit_tags(visit);
219219
}
220220
}
221+
222+
fn visit_prov(&self, visit: &mut dyn FnMut(AllocId)) {
223+
let TlsData { keys, macos_thread_dtors, next_key: _ } = self;
224+
225+
for scalar in keys.values().flat_map(|v| v.data.values()) {
226+
scalar.visit_prov(visit);
227+
}
228+
for (_, scalar) in macos_thread_dtors.values() {
229+
scalar.visit_prov(visit);
230+
}
231+
}
221232
}
222233

223234
#[derive(Debug, Default)]

0 commit comments

Comments
 (0)