1
Fork 0

Cache foreign_modules query

This commit is contained in:
Ryan Levick 2020-10-27 15:01:03 +01:00
parent 9f6c670c4b
commit 69dc98161a
7 changed files with 20 additions and 16 deletions

View file

@ -1414,12 +1414,14 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
}
}
fn get_foreign_modules(&self, tcx: TyCtxt<'tcx>) -> &'tcx [ForeignModule] {
fn get_foreign_modules(&self, tcx: TyCtxt<'tcx>) -> Lrc<FxHashMap<DefId, ForeignModule>> {
if self.root.is_proc_macro_crate() {
// Proc macro crates do not have any *target* foreign modules.
&[]
Lrc::new(FxHashMap::default())
} else {
tcx.arena.alloc_from_iter(self.root.foreign_modules.decode((self, tcx.sess)))
let modules: FxHashMap<DefId, ForeignModule> =
self.root.foreign_modules.decode((self, tcx.sess)).map(|m| (m.def_id, m)).collect();
Lrc::new(modules)
}
}

View file

@ -6,12 +6,14 @@ use crate::rmeta::{self, encoder};
use rustc_ast as ast;
use rustc_ast::expand::allocator::AllocatorKind;
use rustc_data_structures::stable_map::FxHashMap;
use rustc_data_structures::svh::Svh;
use rustc_hir as hir;
use rustc_hir::def::DefKind;
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, CRATE_DEF_INDEX, LOCAL_CRATE};
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash};
use rustc_middle::hir::exports::Export;
use rustc_middle::middle::cstore::ForeignModule;
use rustc_middle::middle::cstore::{CrateSource, CrateStore, EncodedMetadata};
use rustc_middle::middle::exported_symbols::ExportedSymbol;
use rustc_middle::middle::stability::DeprecationEntry;
@ -267,12 +269,10 @@ pub fn provide(providers: &mut Providers) {
Some(id) => id,
None => return false,
};
tcx.foreign_modules(id.krate)
.iter()
.find(|m| m.def_id == fm_id)
.expect("failed to find foreign module")
.foreign_items
.contains(&id)
let map = tcx.foreign_modules(id.krate);
let module =
tcx.prof.generic_activity("finding_foreign_module").run(|| map.get(&fm_id));
module.expect("failed to find foreign module").foreign_items.contains(&id)
})
.map(|l| l.kind)
},
@ -282,7 +282,9 @@ pub fn provide(providers: &mut Providers) {
},
foreign_modules: |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
&tcx.arena.alloc(foreign_modules::collect(tcx))[..]
let modules: FxHashMap<DefId, ForeignModule> =
foreign_modules::collect(tcx).into_iter().map(|m| (m.def_id, m)).collect();
Lrc::new(modules)
},
link_args: |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);

View file

@ -1502,7 +1502,7 @@ impl EncodeContext<'a, 'tcx> {
fn encode_foreign_modules(&mut self) -> Lazy<[ForeignModule]> {
empty_proc_macro!(self);
let foreign_modules = self.tcx.foreign_modules(LOCAL_CRATE);
self.lazy(foreign_modules.iter().cloned())
self.lazy(foreign_modules.iter().map(|(_, m)| m).cloned())
}
fn encode_hygiene(&mut self) -> (SyntaxContextTable, ExpnDataTable) {