diff options
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/decoder.rs | 6 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/encoder.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/mod.rs | 2 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/table.rs | 19 |
4 files changed, 25 insertions, 7 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index ef1debf4344..7b500f1565d 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -1459,9 +1459,9 @@ impl<'a, 'tcx> CrateMetadataRef<'a> { index: DefIndex, def_path_hashes: &mut FxHashMap<DefIndex, DefPathHash>, ) -> DefPathHash { - *def_path_hashes.entry(index).or_insert_with(|| { - self.root.tables.def_path_hashes.get(self, index).unwrap().decode(self) - }) + *def_path_hashes + .entry(index) + .or_insert_with(|| self.root.tables.def_path_hashes.get(self, index).unwrap()) } #[inline] diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 818d51cc66a..be10ad490e1 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -461,16 +461,15 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { .chain(self.tcx.resolutions(()).proc_macros.iter().map(|p| p.local_def_index)) { let def_key = self.lazy(table.def_key(def_index)); - let def_path_hash = self.lazy(table.def_path_hash(def_index)); + let def_path_hash = table.def_path_hash(def_index); self.tables.def_keys.set(def_index, def_key); self.tables.def_path_hashes.set(def_index, def_path_hash); } } else { for (def_index, def_key, def_path_hash) in table.enumerated_keys_and_path_hashes() { let def_key = self.lazy(def_key); - let def_path_hash = self.lazy(def_path_hash); self.tables.def_keys.set(def_index, def_key); - self.tables.def_path_hashes.set(def_index, def_path_hash); + self.tables.def_path_hashes.set(def_index, *def_path_hash); } } } diff --git a/compiler/rustc_metadata/src/rmeta/mod.rs b/compiler/rustc_metadata/src/rmeta/mod.rs index 192857ce577..37340ee3268 100644 --- a/compiler/rustc_metadata/src/rmeta/mod.rs +++ b/compiler/rustc_metadata/src/rmeta/mod.rs @@ -332,7 +332,7 @@ define_tables! { // `DefPathTable` up front, since we may only ever use a few // definitions from any given crate. def_keys: Table<DefIndex, Lazy<DefKey>>, - def_path_hashes: Table<DefIndex, Lazy<DefPathHash>>, + def_path_hashes: Table<DefIndex, DefPathHash>, proc_macro_quoted_spans: Table<usize, Lazy<Span>>, } diff --git a/compiler/rustc_metadata/src/rmeta/table.rs b/compiler/rustc_metadata/src/rmeta/table.rs index bbf6bde95e5..3e0aa0728df 100644 --- a/compiler/rustc_metadata/src/rmeta/table.rs +++ b/compiler/rustc_metadata/src/rmeta/table.rs @@ -1,5 +1,6 @@ use crate::rmeta::*; +use rustc_data_structures::fingerprint::Fingerprint; use rustc_hir::def::{CtorKind, CtorOf}; use rustc_index::vec::Idx; use rustc_serialize::opaque::Encoder; @@ -181,6 +182,24 @@ fixed_size_enum! { } } +// We directly encode `DefPathHash` because a `Lazy` would encur a 25% cost. +impl FixedSizeEncoding for Option<DefPathHash> { + fixed_size_encoding_byte_len_and_defaults!(16); + + #[inline] + fn from_bytes(b: &[u8]) -> Self { + Some(DefPathHash(Fingerprint::from_le_bytes(b.try_into().unwrap()))) + } + + #[inline] + fn write_to_bytes(self, b: &mut [u8]) { + let Some(DefPathHash(fingerprint)) = self else { + panic!("Trying to encode absent DefPathHash.") + }; + b[..Self::BYTE_LEN].copy_from_slice(&fingerprint.to_le_bytes()); + } +} + // NOTE(eddyb) there could be an impl for `usize`, which would enable a more // generic `Lazy<T>` impl, but in the general case we might not need / want to // fit every `usize` in `u32`. |
