diff options
| author | Ben Kimock <kimockb@gmail.com> | 2023-11-17 20:33:44 -0500 |
|---|---|---|
| committer | Ben Kimock <kimockb@gmail.com> | 2023-11-19 13:29:02 -0500 |
| commit | 0d0a41789f86c2fc62382831e5256809b3bbe19e (patch) | |
| tree | 409911a27fe6c4b0b81f48b590e7c43c2fdb0763 /compiler/rustc_const_eval/src/interpret | |
| parent | 82b804c74433a233914f604bb0ba385719605e5e (diff) | |
| download | rust-0d0a41789f86c2fc62382831e5256809b3bbe19e.tar.gz rust-0d0a41789f86c2fc62382831e5256809b3bbe19e.zip | |
Expand Miri's BorTag GC to a Provenance GC
Diffstat (limited to 'compiler/rustc_const_eval/src/interpret')
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/machine.rs | 8 | ||||
| -rw-r--r-- | compiler/rustc_const_eval/src/interpret/memory.rs | 9 |
2 files changed, 17 insertions, 0 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/machine.rs b/compiler/rustc_const_eval/src/interpret/machine.rs index 61fe9151d8b..6617f6f2ffb 100644 --- a/compiler/rustc_const_eval/src/interpret/machine.rs +++ b/compiler/rustc_const_eval/src/interpret/machine.rs @@ -49,6 +49,14 @@ pub trait AllocMap<K: Hash + Eq, V> { where K: Borrow<Q>; + /// Callers should prefer [`AllocMap::contains_key`] when it is possible to call because it may + /// be more efficient. This function exists for callers that only have a shared reference + /// (which might make it slightly less efficient than `contains_key`, e.g. if + /// the data is stored inside a `RefCell`). + fn contains_key_ref<Q: ?Sized + Hash + Eq>(&self, k: &Q) -> bool + where + K: Borrow<Q>; + /// Inserts a new entry into the map. fn insert(&mut self, k: K, v: V) -> Option<V>; diff --git a/compiler/rustc_const_eval/src/interpret/memory.rs b/compiler/rustc_const_eval/src/interpret/memory.rs index 16905e93bf1..d5b165a7415 100644 --- a/compiler/rustc_const_eval/src/interpret/memory.rs +++ b/compiler/rustc_const_eval/src/interpret/memory.rs @@ -692,6 +692,15 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Ok((&mut alloc.extra, machine)) } + /// Check whether an allocation is live. This is faster than calling + /// [`InterpCx::get_alloc_info`] if all you need to check is whether the kind is + /// [`AllocKind::Dead`] because it doesn't have to look up the type and layout of statics. + pub fn is_alloc_live(&self, id: AllocId) -> bool { + self.tcx.try_get_global_alloc(id).is_some() + || self.memory.alloc_map.contains_key_ref(&id) + || self.memory.extra_fn_ptr_map.contains_key(&id) + } + /// Obtain the size and alignment of an allocation, even if that allocation has /// been deallocated. pub fn get_alloc_info(&self, id: AllocId) -> (Size, Align, AllocKind) { |
