@@ -6,12 +6,14 @@ use crate::rmeta::{self, encoder};
66
77use rustc_ast as ast;
88use rustc_ast:: expand:: allocator:: AllocatorKind ;
9+ use rustc_data_structures:: stable_map:: FxHashMap ;
910use rustc_data_structures:: svh:: Svh ;
1011use rustc_hir as hir;
1112use rustc_hir:: def:: DefKind ;
1213use rustc_hir:: def_id:: { CrateNum , DefId , DefIdMap , CRATE_DEF_INDEX , LOCAL_CRATE } ;
1314use rustc_hir:: definitions:: { DefKey , DefPath , DefPathHash } ;
1415use rustc_middle:: hir:: exports:: Export ;
16+ use rustc_middle:: middle:: cstore:: ForeignModule ;
1517use rustc_middle:: middle:: cstore:: { CrateSource , CrateStore , EncodedMetadata } ;
1618use rustc_middle:: middle:: exported_symbols:: ExportedSymbol ;
1719use rustc_middle:: middle:: stability:: DeprecationEntry ;
@@ -267,12 +269,10 @@ pub fn provide(providers: &mut Providers) {
267269 Some ( id) => id,
268270 None => return false ,
269271 } ;
270- tcx. foreign_modules ( id. krate )
271- . iter ( )
272- . find ( |m| m. def_id == fm_id)
273- . expect ( "failed to find foreign module" )
274- . foreign_items
275- . contains ( & id)
272+ let map = tcx. foreign_modules ( id. krate ) ;
273+ let module =
274+ tcx. prof . generic_activity ( "finding_foreign_module" ) . run ( || map. get ( & fm_id) ) ;
275+ module. expect ( "failed to find foreign module" ) . foreign_items . contains ( & id)
276276 } )
277277 . map ( |l| l. kind )
278278 } ,
@@ -282,7 +282,9 @@ pub fn provide(providers: &mut Providers) {
282282 } ,
283283 foreign_modules : |tcx, cnum| {
284284 assert_eq ! ( cnum, LOCAL_CRATE ) ;
285- & tcx. arena . alloc ( foreign_modules:: collect ( tcx) ) [ ..]
285+ let modules: FxHashMap < DefId , ForeignModule > =
286+ foreign_modules:: collect ( tcx) . into_iter ( ) . map ( |m| ( m. def_id , m) ) . collect ( ) ;
287+ Lrc :: new ( modules)
286288 } ,
287289 link_args : |tcx, cnum| {
288290 assert_eq ! ( cnum, LOCAL_CRATE ) ;
0 commit comments