diff options
| author | Michael Goulet <michael@errs.io> | 2022-05-22 12:34:34 -0700 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-05-24 15:54:44 -0700 |
| commit | d1a9a9551741c3e888d350d8d4f4821a5addccb2 (patch) | |
| tree | 4c1ceffc14c22d16ff8adc6677598917f96eb674 /compiler/rustc_metadata/src/rmeta | |
| parent | fa70b89d19a52be0dea03022d807a3e615763727 (diff) | |
| download | rust-d1a9a9551741c3e888d350d8d4f4821a5addccb2.tar.gz rust-d1a9a9551741c3e888d350d8d4f4821a5addccb2.zip | |
Make Lazy not care about lifetimes until decode
Diffstat (limited to 'compiler/rustc_metadata/src/rmeta')
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/decoder.rs | 34 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/encoder.rs | 27 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/mod.rs | 67 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/rmeta/table.rs | 9 |
5 files changed, 91 insertions, 51 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index 72b7c08f04b..1420871b025 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -25,7 +25,7 @@ use rustc_middle::thir; use rustc_middle::ty::codec::TyDecoder; use rustc_middle::ty::fast_reject::SimplifiedType; use rustc_middle::ty::GeneratorDiagnosticData; -use rustc_middle::ty::{self, Ty, TyCtxt, Visibility}; +use rustc_middle::ty::{self, ParameterizedOverTcx, Ty, TyCtxt, Visibility}; use rustc_serialize::{opaque, Decodable, Decoder}; use rustc_session::cstore::{ CrateSource, ExternCrate, ForeignModule, LinkagePreference, NativeLib, @@ -86,7 +86,7 @@ pub(crate) struct CrateMetadata { /// lifetime is only used behind `Lazy`, and therefore acts like a /// universal (`for<'tcx>`), that is paired up with whichever `TyCtxt` /// is being used to decode those values. - root: CrateRoot<'static>, + root: CrateRoot, /// Trait impl data. /// FIXME: Used only from queries and can use query cache, /// so pre-decoding can probably be avoided. @@ -261,11 +261,14 @@ impl<'a, 'tcx> Metadata<'a, 'tcx> for (CrateMetadataRef<'a>, TyCtxt<'tcx>) { } } -impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> LazyValue<T> { - fn decode<M: Metadata<'a, 'tcx>>(self, metadata: M) -> T { +impl<T: ParameterizedOverTcx> LazyValue<T> { + fn decode<'a, 'tcx, M: Metadata<'a, 'tcx>>(self, metadata: M) -> T::Value<'tcx> + where + T::Value<'tcx>: Decodable<DecodeContext<'a, 'tcx>>, + { let mut dcx = metadata.decoder(self.position.get()); dcx.lazy_state = LazyState::NodeStart(self.position); - T::decode(&mut dcx) + T::Value::decode(&mut dcx) } } @@ -292,6 +295,9 @@ impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> Iterator for DecodeIterato impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> ExactSizeIterator for DecodeIterator<'a, 'tcx, T> { + fn len(&self) -> usize { + self.elem_counter.len() + } } unsafe impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> TrustedLen @@ -299,8 +305,14 @@ unsafe impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> TrustedLen { } -impl<'a: 'x, 'tcx: 'x, 'x, T: Decodable<DecodeContext<'a, 'tcx>>> LazyArray<T> { - fn decode<M: Metadata<'a, 'tcx>>(self, metadata: M) -> DecodeIterator<'a, 'tcx, T> { +impl<T: ParameterizedOverTcx> LazyArray<T> { + fn decode<'a, 'tcx, M: Metadata<'a, 'tcx>>( + self, + metadata: M, + ) -> DecodeIterator<'a, 'tcx, T::Value<'tcx>> + where + T::Value<'tcx>: Decodable<DecodeContext<'a, 'tcx>>, + { let mut dcx = metadata.decoder(self.position.get()); dcx.lazy_state = LazyState::NodeStart(self.position); DecodeIterator { elem_counter: (0..self.num_elems), dcx, _phantom: PhantomData } @@ -671,14 +683,14 @@ impl MetadataBlob { .decode(self) } - pub(crate) fn get_root<'tcx>(&self) -> CrateRoot<'tcx> { + pub(crate) fn get_root(&self) -> CrateRoot { let slice = &self.blob()[..]; let offset = METADATA_HEADER.len(); let pos = (((slice[offset + 0] as u32) << 24) | ((slice[offset + 1] as u32) << 16) | ((slice[offset + 2] as u32) << 8) | ((slice[offset + 3] as u32) << 0)) as usize; - LazyValue::<CrateRoot<'tcx>>::from_position(NonZeroUsize::new(pos).unwrap()).decode(self) + LazyValue::<CrateRoot>::from_position(NonZeroUsize::new(pos).unwrap()).decode(self) } pub(crate) fn list_crate_metadata(&self, out: &mut dyn io::Write) -> io::Result<()> { @@ -705,7 +717,7 @@ impl MetadataBlob { } } -impl CrateRoot<'_> { +impl CrateRoot { pub(crate) fn is_proc_macro_crate(&self) -> bool { self.proc_macro_data.is_some() } @@ -1677,7 +1689,7 @@ impl CrateMetadata { sess: &Session, cstore: &CStore, blob: MetadataBlob, - root: CrateRoot<'static>, + root: CrateRoot, raw_proc_macros: Option<&'static [ProcMacro]>, cnum: CrateNum, cnum_map: CrateNumMap, diff --git a/compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs b/compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs index 06045bb3e3d..15fd190b049 100644 --- a/compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs +++ b/compiler/rustc_metadata/src/rmeta/def_path_hash_map.rs @@ -3,6 +3,7 @@ use crate::rmeta::EncodeContext; use crate::rmeta::MetadataBlob; use rustc_data_structures::owning_ref::OwningRef; use rustc_hir::def_path_hash_map::{Config as HashMapConfig, DefPathHashMap}; +use rustc_middle::parameterized_over_tcx; use rustc_serialize::{opaque, Decodable, Decoder, Encodable, Encoder}; use rustc_span::def_id::{DefIndex, DefPathHash}; @@ -11,6 +12,10 @@ pub(crate) enum DefPathHashMapRef<'tcx> { BorrowedFromTcx(&'tcx DefPathHashMap), } +parameterized_over_tcx! { + DefPathHashMapRef, +} + impl DefPathHashMapRef<'_> { #[inline] pub fn def_path_hash_to_def_index(&self, def_path_hash: &DefPathHash) -> DefIndex { diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 28f289f06ec..1e83434b9d0 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -47,7 +47,7 @@ pub(super) struct EncodeContext<'a, 'tcx> { tcx: TyCtxt<'tcx>, feat: &'tcx rustc_feature::Features, - tables: TableBuilders<'tcx>, + tables: TableBuilders, lazy_state: LazyState, type_shorthands: FxHashMap<Ty<'tcx>, usize>, @@ -388,10 +388,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { self.emit_usize(distance) } - fn lazy<T: Encodable<EncodeContext<'a, 'tcx>>, B: Borrow<T>>( - &mut self, - value: B, - ) -> LazyValue<T> { + fn lazy<T: ParameterizedOverTcx, B: Borrow<T::Value<'tcx>>>(&mut self, value: B) -> LazyValue<T> + where + T::Value<'tcx>: Encodable<EncodeContext<'a, 'tcx>>, + { let pos = NonZeroUsize::new(self.position()).unwrap(); assert_eq!(self.lazy_state, LazyState::NoNode); @@ -404,14 +404,13 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { LazyValue::from_position(pos) } - fn lazy_array< - T: Encodable<EncodeContext<'a, 'tcx>>, - I: IntoIterator<Item = B>, - B: Borrow<T>, - >( + fn lazy_array<T: ParameterizedOverTcx, I: IntoIterator<Item = B>, B: Borrow<T::Value<'tcx>>>( &mut self, values: I, - ) -> LazyArray<T> { + ) -> LazyArray<T> + where + T::Value<'tcx>: Encodable<EncodeContext<'a, 'tcx>>, + { let pos = NonZeroUsize::new(self.position()).unwrap(); assert_eq!(self.lazy_state, LazyState::NoNode); @@ -456,7 +455,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { } } - fn encode_def_path_hash_map(&mut self) -> LazyValue<DefPathHashMapRef<'tcx>> { + fn encode_def_path_hash_map(&mut self) -> LazyValue<DefPathHashMapRef<'static>> { self.lazy(DefPathHashMapRef::BorrowedFromTcx( self.tcx.resolutions(()).definitions.def_path_hash_to_def_index_map(), )) @@ -535,7 +534,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { self.lazy_array(adapted.iter().map(|rc| &**rc)) } - fn encode_crate_root(&mut self) -> LazyValue<CrateRoot<'tcx>> { + fn encode_crate_root(&mut self) -> LazyValue<CrateRoot> { let tcx = self.tcx; let mut i = self.position(); @@ -1859,7 +1858,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { fn encode_exported_symbols( &mut self, exported_symbols: &[(ExportedSymbol<'tcx>, SymbolExportInfo)], - ) -> LazyArray<(ExportedSymbol<'tcx>, SymbolExportInfo)> { + ) -> LazyArray<(ExportedSymbol<'static>, SymbolExportInfo)> { empty_proc_macro!(self); // The metadata symbol name is special. It should not show up in // downstream crates. diff --git a/compiler/rustc_metadata/src/rmeta/mod.rs b/compiler/rustc_metadata/src/rmeta/mod.rs index 00c4dc3955d..fb2ffe1d73d 100644 --- a/compiler/rustc_metadata/src/rmeta/mod.rs +++ b/compiler/rustc_metadata/src/rmeta/mod.rs @@ -21,7 +21,7 @@ use rustc_middle::thir; use rustc_middle::ty::fast_reject::SimplifiedType; use rustc_middle::ty::query::Providers; use rustc_middle::ty::{self, ReprOptions, Ty}; -use rustc_middle::ty::{GeneratorDiagnosticData, TyCtxt}; +use rustc_middle::ty::{GeneratorDiagnosticData, ParameterizedOverTcx, TyCtxt}; use rustc_serialize::opaque::Encoder; use rustc_session::config::SymbolManglingVersion; use rustc_session::cstore::{CrateDepKind, ForeignModule, LinkagePreference, NativeLib}; @@ -83,6 +83,10 @@ struct LazyValue<T> { _marker: PhantomData<fn() -> T>, } +impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyValue<T> { + type Value<'tcx> = LazyValue<T::Value<'tcx>>; +} + impl<T> LazyValue<T> { fn from_position(position: NonZeroUsize) -> LazyValue<T> { LazyValue { position, _marker: PhantomData } @@ -105,6 +109,10 @@ struct LazyArray<T> { _marker: PhantomData<fn() -> T>, } +impl<T: ParameterizedOverTcx> ParameterizedOverTcx for LazyArray<T> { + type Value<'tcx> = LazyArray<T::Value<'tcx>>; +} + impl<T> LazyArray<T> { fn from_position_and_num_elems(position: NonZeroUsize, num_elems: usize) -> LazyArray<T> { LazyArray { position, num_elems, _marker: PhantomData } @@ -126,6 +134,10 @@ struct LazyTable<I, T> { _marker: PhantomData<fn(I) -> T>, } +impl<I: 'static, T: ParameterizedOverTcx> ParameterizedOverTcx for LazyTable<I, T> { + type Value<'tcx> = LazyTable<I, T::Value<'tcx>>; +} + impl<I, T> LazyTable<I, T> { fn from_position_and_encoded_size( position: NonZeroUsize, @@ -199,7 +211,7 @@ pub(crate) struct ProcMacroData { /// a normal crate, much of what we serialized would be unusable in addition /// to being unused. #[derive(MetadataEncodable, MetadataDecodable)] -pub(crate) struct CrateRoot<'tcx> { +pub(crate) struct CrateRoot { name: Symbol, triple: TargetTriple, extra_filename: String, @@ -226,16 +238,16 @@ pub(crate) struct CrateRoot<'tcx> { interpret_alloc_index: LazyArray<u32>, proc_macro_data: Option<ProcMacroData>, - tables: LazyTables<'tcx>, + tables: LazyTables, debugger_visualizers: LazyArray<rustc_span::DebuggerVisualizerFile>, - exported_symbols: LazyArray<(ExportedSymbol<'tcx>, SymbolExportInfo)>, + exported_symbols: LazyArray<(ExportedSymbol<'static>, SymbolExportInfo)>, syntax_contexts: SyntaxContextTable, expn_data: ExpnDataTable, expn_hashes: ExpnHashTable, - def_path_hash_map: LazyValue<DefPathHashMapRef<'tcx>>, + def_path_hash_map: LazyValue<DefPathHashMapRef<'static>>, source_map: LazyArray<rustc_span::SourceFile>, @@ -301,17 +313,17 @@ pub(crate) struct IncoherentImpls { macro_rules! define_tables { ($($name:ident: Table<$IDX:ty, $T:ty>),+ $(,)?) => { #[derive(MetadataEncodable, MetadataDecodable)] - pub(crate) struct LazyTables<'tcx> { + pub(crate) struct LazyTables { $($name: LazyTable<$IDX, $T>),+ } #[derive(Default)] - struct TableBuilders<'tcx> { + struct TableBuilders { $($name: TableBuilder<$IDX, $T>),+ } - impl<'tcx> TableBuilders<'tcx> { - fn encode(&self, buf: &mut Encoder) -> LazyTables<'tcx> { + impl TableBuilders { + fn encode(&self, buf: &mut Encoder) -> LazyTables { LazyTables { $($name: self.$name.encode(buf)),+ } @@ -333,23 +345,23 @@ define_tables! { lookup_const_stability: Table<DefIndex, LazyValue<attr::ConstStability>>, lookup_deprecation_entry: Table<DefIndex, LazyValue<attr::Deprecation>>, // As an optimization, a missing entry indicates an empty `&[]`. - explicit_item_bounds: Table<DefIndex, LazyArray<(ty::Predicate<'tcx>, Span)>>, - explicit_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'tcx>>>, + explicit_item_bounds: Table<DefIndex, LazyArray<(ty::Predicate<'static>, Span)>>, + explicit_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>, generics_of: Table<DefIndex, LazyValue<ty::Generics>>, // As an optimization, a missing entry indicates an empty `&[]`. - inferred_outlives_of: Table<DefIndex, LazyArray<(ty::Predicate<'tcx>, Span)>>, - super_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'tcx>>>, - type_of: Table<DefIndex, LazyValue<Ty<'tcx>>>, + inferred_outlives_of: Table<DefIndex, LazyArray<(ty::Predicate<'static>, Span)>>, + super_predicates_of: Table<DefIndex, LazyValue<ty::GenericPredicates<'static>>>, + type_of: Table<DefIndex, LazyValue<Ty<'static>>>, variances_of: Table<DefIndex, LazyArray<ty::Variance>>, - fn_sig: Table<DefIndex, LazyValue<ty::PolyFnSig<'tcx>>>, + fn_sig: Table<DefIndex, LazyValue<ty::PolyFnSig<'static>>>, codegen_fn_attrs: Table<DefIndex, LazyValue<CodegenFnAttrs>>, - impl_trait_ref: Table<DefIndex, LazyValue<ty::TraitRef<'tcx>>>, - const_param_default: Table<DefIndex, LazyValue<rustc_middle::ty::Const<'tcx>>>, - optimized_mir: Table<DefIndex, LazyValue<mir::Body<'tcx>>>, - mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'tcx>>>, - promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'tcx>>>>, + impl_trait_ref: Table<DefIndex, LazyValue<ty::TraitRef<'static>>>, + const_param_default: Table<DefIndex, LazyValue<rustc_middle::ty::Const<'static>>>, + optimized_mir: Table<DefIndex, LazyValue<mir::Body<'static>>>, + mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>, + promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>, // FIXME(compiler-errors): Why isn't this a LazyArray? - thir_abstract_const: Table<DefIndex, LazyValue<&'tcx [thir::abstract_const::Node<'tcx>]>>, + thir_abstract_const: Table<DefIndex, LazyValue<&'static [thir::abstract_const::Node<'static>]>>, impl_parent: Table<DefIndex, RawDefId>, impl_polarity: Table<DefIndex, ty::ImplPolarity>, impl_constness: Table<DefIndex, hir::Constness>, @@ -376,7 +388,7 @@ define_tables! { def_keys: Table<DefIndex, LazyValue<DefKey>>, def_path_hashes: Table<DefIndex, DefPathHash>, proc_macro_quoted_spans: Table<usize, LazyValue<Span>>, - generator_diagnostic_data: Table<DefIndex, LazyValue<GeneratorDiagnosticData<'tcx>>>, + generator_diagnostic_data: Table<DefIndex, LazyValue<GeneratorDiagnosticData<'static>>>, may_have_doc_links: Table<DefIndex, ()>, } @@ -477,3 +489,14 @@ pub fn provide(providers: &mut Providers) { encoder::provide(providers); decoder::provide(providers); } + +trivially_parameterized_over_tcx! { + VariantData, + AssocFnData, + EntryKind, + RawDefId, + TraitImpls, + IncoherentImpls, + CrateRoot, + CrateDep, +} diff --git a/compiler/rustc_metadata/src/rmeta/table.rs b/compiler/rustc_metadata/src/rmeta/table.rs index 60c5143a6c3..100bac15b80 100644 --- a/compiler/rustc_metadata/src/rmeta/table.rs +++ b/compiler/rustc_metadata/src/rmeta/table.rs @@ -3,6 +3,7 @@ use crate::rmeta::*; use rustc_data_structures::fingerprint::Fingerprint; use rustc_hir::def::{CtorKind, CtorOf}; use rustc_index::vec::Idx; +use rustc_middle::ty::ParameterizedOverTcx; use rustc_serialize::opaque::Encoder; use rustc_serialize::Encoder as _; use rustc_span::hygiene::MacroKind; @@ -296,7 +297,7 @@ where } } -impl<I: Idx, T> LazyTable<I, T> +impl<I: Idx, T: ParameterizedOverTcx> LazyTable<I, T> where Option<T>: FixedSizeEncoding, { @@ -306,9 +307,9 @@ where &self, metadata: M, i: I, - ) -> Option<T> + ) -> Option<T::Value<'tcx>> where - Option<T>: FixedSizeEncoding<ByteArray = [u8; N]>, + Option<T::Value<'tcx>>: FixedSizeEncoding<ByteArray = [u8; N]>, { debug!("LazyTable::lookup: index={:?} len={:?}", i, self.encoded_size); @@ -322,7 +323,7 @@ where /// Size of the table in entries, including possible gaps. pub(super) fn size<const N: usize>(&self) -> usize where - Option<T>: FixedSizeEncoding<ByteArray = [u8; N]>, + for<'tcx> Option<T::Value<'tcx>>: FixedSizeEncoding<ByteArray = [u8; N]>, { self.encoded_size / N } |
