Miri: GC the dead_alloc_map too

This commit is contained in:
Ben Kimock 2023-11-19 16:17:48 -05:00
parent 0ff8610964
commit f5dae8e73c
2 changed files with 13 additions and 1 deletions

View File

@ -501,6 +501,17 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
} }
} }
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
/// This function is used by Miri's provenance GC to remove unreachable entries from the dead_alloc_map.
pub fn remove_unreachable_allocs(&mut self, reachable_allocs: &FxHashSet<AllocId>) {
// Unlike all the other GC helpers where we check if an `AllocId` is found in the interpreter or
// is live, here all the IDs in the map are for dead allocations so we don't
// need to check for liveness.
#[allow(rustc::potential_query_instability)] // Only used from Miri, not queries.
self.memory.dead_alloc_map.retain(|id, _| reachable_allocs.contains(id));
}
}
/// Allocation accessors /// Allocation accessors
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
/// Helper function to obtain a global (tcx) allocation. /// Helper function to obtain a global (tcx) allocation.

View File

@ -195,7 +195,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
} }
fn remove_unreachable_allocs(&mut self, allocs: FxHashSet<AllocId>) { fn remove_unreachable_allocs(&mut self, allocs: FxHashSet<AllocId>) {
let this = self.eval_context_ref(); let this = self.eval_context_mut();
let allocs = LiveAllocs { let allocs = LiveAllocs {
ecx: this, ecx: this,
collected: allocs, collected: allocs,
@ -205,5 +205,6 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: MiriInterpCxExt<'mir, 'tcx> {
if let Some(borrow_tracker) = &this.machine.borrow_tracker { if let Some(borrow_tracker) = &this.machine.borrow_tracker {
borrow_tracker.borrow_mut().remove_unreachable_allocs(&allocs); borrow_tracker.borrow_mut().remove_unreachable_allocs(&allocs);
} }
this.remove_unreachable_allocs(&allocs.collected);
} }
} }