X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=compiler%2Frustc_query_system%2Fsrc%2Fquery%2Fcaches.rs;h=9f875b4373173cac741bc7fdd5058627de025b0e;hb=d4598406336a1100786ff15708b48a51768ec235;hp=77d0d0314fc17de7a36de449436e484118bec350;hpb=788671c1c62e099b2ad4ff5384c6f764b8b26b8d;p=rust.git diff --git a/compiler/rustc_query_system/src/query/caches.rs b/compiler/rustc_query_system/src/query/caches.rs index 77d0d0314fc..9f875b43731 100644 --- a/compiler/rustc_query_system/src/query/caches.rs +++ b/compiler/rustc_query_system/src/query/caches.rs @@ -16,17 +16,13 @@ pub trait CacheSelector<'tcx, V> { type Cache where - V: Clone; + V: Copy; type ArenaCache; } pub trait QueryStorage { type Value: Debug; - type Stored: Clone; - - /// Store a value without putting it in the cache. - /// This is meant to be used with cycle errors. - fn store_nocache(&self, value: Self::Value) -> Self::Stored; + type Stored: Copy; } pub trait QueryCache: QueryStorage + Sized { @@ -36,14 +32,7 @@ pub trait QueryCache: QueryStorage + Sized { /// It returns the shard index and a lock guard to the shard, /// which will be used if the query is not in the cache and we need /// to compute it. - fn lookup( - &self, - key: &Self::Key, - // `on_hit` can be called while holding a lock to the query state shard. - on_hit: OnHit, - ) -> Result - where - OnHit: FnOnce(&Self::Stored, DepNodeIndex) -> R; + fn lookup(&self, key: &Self::Key) -> Option<(Self::Stored, DepNodeIndex)>; fn complete(&self, key: Self::Key, value: Self::Value, index: DepNodeIndex) -> Self::Stored; @@ -55,7 +44,7 @@ fn lookup( impl<'tcx, K: Eq + Hash, V: 'tcx> CacheSelector<'tcx, V> for DefaultCacheSelector { type Cache = DefaultCache where - V: Clone; + V: Copy; type ArenaCache = ArenaCache<'tcx, K, V>; } @@ -72,29 +61,20 @@ fn default() -> Self { } } -impl QueryStorage for DefaultCache { +impl QueryStorage for DefaultCache { type Value = V; type Stored = V; - - #[inline] - fn store_nocache(&self, value: Self::Value) -> Self::Stored { - // We have no dedicated storage - value - } } impl QueryCache for DefaultCache where K: Eq + Hash + Clone + Debug, - V: Clone + Debug, + V: Copy + Debug, { type Key = K; #[inline(always)] - fn lookup(&self, key: &K, on_hit: OnHit) -> Result - where - OnHit: FnOnce(&V, DepNodeIndex) -> R, - { + fn lookup(&self, key: &K) -> Option<(V, DepNodeIndex)> { let key_hash = sharded::make_hash(key); #[cfg(parallel_compiler)] let lock = self.cache.get_shard_by_hash(key_hash).lock(); @@ -102,12 +82,7 @@ fn lookup(&self, key: &K, on_hit: OnHit) -> Result let lock = self.cache.lock(); let result = lock.raw_entry().from_key_hashed_nocheck(key_hash, key); - if let Some((_, value)) = result { - let hit_result = on_hit(&value.0, value.1); - Ok(hit_result) - } else { - Err(()) - } + if let Some((_, value)) = result { Some(*value) } else { None } } #[inline] @@ -159,13 +134,6 @@ fn default() -> Self { impl<'tcx, K: Eq + Hash, V: Debug + 'tcx> QueryStorage for ArenaCache<'tcx, K, V> { type Value = V; type Stored = &'tcx V; - - #[inline] - fn store_nocache(&self, value: Self::Value) -> Self::Stored { - let value = self.arena.alloc((value, DepNodeIndex::INVALID)); - let value = unsafe { &*(&value.0 as *const _) }; - &value - } } impl<'tcx, K, V: 'tcx> QueryCache for ArenaCache<'tcx, K, V> @@ -176,10 +144,7 @@ impl<'tcx, K, V: 'tcx> QueryCache for ArenaCache<'tcx, K, V> type Key = K; #[inline(always)] - fn lookup(&self, key: &K, on_hit: OnHit) -> Result - where - OnHit: FnOnce(&&'tcx V, DepNodeIndex) -> R, - { + fn lookup(&self, key: &K) -> Option<(&'tcx V, DepNodeIndex)> { let key_hash = sharded::make_hash(key); #[cfg(parallel_compiler)] let lock = self.cache.get_shard_by_hash(key_hash).lock(); @@ -187,12 +152,7 @@ fn lookup(&self, key: &K, on_hit: OnHit) -> Result let lock = self.cache.lock(); let result = lock.raw_entry().from_key_hashed_nocheck(key_hash, key); - if let Some((_, value)) = result { - let hit_result = on_hit(&&value.0, value.1); - Ok(hit_result) - } else { - Err(()) - } + if let Some((_, value)) = result { Some((&value.0, value.1)) } else { None } } #[inline] @@ -234,7 +194,7 @@ fn iter(&self, f: &mut dyn FnMut(&Self::Key, &Self::Value, DepNodeIndex)) { impl<'tcx, K: Idx, V: 'tcx> CacheSelector<'tcx, V> for VecCacheSelector { type Cache = VecCache where - V: Clone; + V: Copy; type ArenaCache = VecArenaCache<'tcx, K, V>; } @@ -251,39 +211,25 @@ fn default() -> Self { } } -impl QueryStorage for VecCache { +impl QueryStorage for VecCache { type Value = V; type Stored = V; - - #[inline] - fn store_nocache(&self, value: Self::Value) -> Self::Stored { - // We have no dedicated storage - value - } } impl QueryCache for VecCache where K: Eq + Idx + Clone + Debug, - V: Clone + Debug, + V: Copy + Debug, { type Key = K; #[inline(always)] - fn lookup(&self, key: &K, on_hit: OnHit) -> Result - where - OnHit: FnOnce(&V, DepNodeIndex) -> R, - { + fn lookup(&self, key: &K) -> Option<(V, DepNodeIndex)> { #[cfg(parallel_compiler)] let lock = self.cache.get_shard_by_hash(key.index() as u64).lock(); #[cfg(not(parallel_compiler))] let lock = self.cache.lock(); - if let Some(Some(value)) = lock.get(*key) { - let hit_result = on_hit(&value.0, value.1); - Ok(hit_result) - } else { - Err(()) - } + if let Some(Some(value)) = lock.get(*key) { Some(*value) } else { None } } #[inline] @@ -340,13 +286,6 @@ fn default() -> Self { impl<'tcx, K: Eq + Idx, V: Debug + 'tcx> QueryStorage for VecArenaCache<'tcx, K, V> { type Value = V; type Stored = &'tcx V; - - #[inline] - fn store_nocache(&self, value: Self::Value) -> Self::Stored { - let value = self.arena.alloc((value, DepNodeIndex::INVALID)); - let value = unsafe { &*(&value.0 as *const _) }; - &value - } } impl<'tcx, K, V: 'tcx> QueryCache for VecArenaCache<'tcx, K, V> @@ -357,20 +296,12 @@ impl<'tcx, K, V: 'tcx> QueryCache for VecArenaCache<'tcx, K, V> type Key = K; #[inline(always)] - fn lookup(&self, key: &K, on_hit: OnHit) -> Result - where - OnHit: FnOnce(&&'tcx V, DepNodeIndex) -> R, - { + fn lookup(&self, key: &K) -> Option<(&'tcx V, DepNodeIndex)> { #[cfg(parallel_compiler)] let lock = self.cache.get_shard_by_hash(key.index() as u64).lock(); #[cfg(not(parallel_compiler))] let lock = self.cache.lock(); - if let Some(Some(value)) = lock.get(*key) { - let hit_result = on_hit(&&value.0, value.1); - Ok(hit_result) - } else { - Err(()) - } + if let Some(Some(value)) = lock.get(*key) { Some((&value.0, value.1)) } else { None } } #[inline]