diff --git a/src/librustc/arena.rs b/src/librustc/arena.rs index 98678b1f28c36..6312a6cfcd651 100644 --- a/src/librustc/arena.rs +++ b/src/librustc/arena.rs @@ -96,6 +96,9 @@ macro_rules! arena_types { [few] visible_parent_map: rustc::util::nodemap::DefIdMap, [few] foreign_module: rustc::middle::cstore::ForeignModule, [few] foreign_modules: Vec, + [few] reachable_non_generics: rustc::util::nodemap::DefIdMap< + rustc::middle::exported_symbols::SymbolExportLevel + >, ], $tcx); ) } diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index ff8acf5126e9e..68d3cb65729d2 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -590,7 +590,7 @@ rustc_queries! { Other { query dylib_dependency_formats(_: CrateNum) - -> Lrc> { + -> &'tcx [(CrateNum, LinkagePreference)] { desc { "dylib dependency formats of crate" } } } @@ -625,7 +625,7 @@ rustc_queries! { desc { "test whether a crate has #![no_builtins]" } } - query extern_crate(_: DefId) -> Lrc> { + query extern_crate(_: DefId) -> Option<&'tcx ExternCrate> { eval_always desc { "getting crate's ExternCrateData" } } @@ -671,7 +671,7 @@ rustc_queries! { // Does not include external symbols that don't have a corresponding DefId, // like the compiler-generated `main` function and so on. query reachable_non_generics(_: CrateNum) - -> Lrc> { + -> &'tcx DefIdMap { desc { "looking up the exported symbols of a crate" } } query is_reachable_non_generic(_: DefId) -> bool {} diff --git a/src/librustc/ty/print/pretty.rs b/src/librustc/ty/print/pretty.rs index 7a8d5d3bb9a67..06db4b9b65bca 100644 --- a/src/librustc/ty/print/pretty.rs +++ b/src/librustc/ty/print/pretty.rs @@ -253,8 +253,8 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>: // 2. for an extern inferred from a path or an indirect crate, // where there is no explicit `extern crate`, we just prepend // the crate name. - match *self.tcx().extern_crate(def_id) { - Some(ExternCrate { + match self.tcx().extern_crate(def_id) { + Some(&ExternCrate { src: ExternCrateSource::Extern(def_id), direct: true, span, diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs index 616049ea112a4..fb7ef87646296 100644 --- a/src/librustc_codegen_ssa/back/symbol_export.rs +++ b/src/librustc_codegen_ssa/back/symbol_export.rs @@ -1,4 +1,3 @@ -use rustc_data_structures::sync::Lrc; use std::sync::Arc; use rustc::ty::Instance; @@ -49,12 +48,12 @@ pub fn crates_export_threshold(crate_types: &[config::CrateType]) -> SymbolExpor fn reachable_non_generics_provider<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, cnum: CrateNum) - -> Lrc> + -> &'tcx DefIdMap { assert_eq!(cnum, LOCAL_CRATE); if !tcx.sess.opts.output_types.should_codegen() { - return Default::default(); + return tcx.arena.alloc(Default::default()); } // Check to see if this crate is a "special runtime crate". These @@ -155,7 +154,7 @@ fn reachable_non_generics_provider<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, reachable_non_generics.insert(id, SymbolExportLevel::C); } - Lrc::new(reachable_non_generics) + tcx.arena.alloc(reachable_non_generics) } fn is_reachable_non_generic_provider_local<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index f0dde17beeeb1..fae4c244d6e14 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -163,7 +163,7 @@ provide! { <'tcx> tcx, def_id, other, cdata, } is_mir_available => { cdata.is_item_mir_available(def_id.index) } - dylib_dependency_formats => { Lrc::new(cdata.get_dylib_dependency_formats()) } + dylib_dependency_formats => { cdata.get_dylib_dependency_formats(tcx) } is_panic_runtime => { cdata.root.panic_runtime } is_compiler_builtins => { cdata.root.compiler_builtins } has_global_allocator => { cdata.root.has_global_allocator } @@ -172,8 +172,8 @@ provide! { <'tcx> tcx, def_id, other, cdata, is_profiler_runtime => { cdata.root.profiler_runtime } panic_strategy => { cdata.root.panic_strategy } extern_crate => { - let r = Lrc::new(*cdata.extern_crate.lock()); - r + let r = *cdata.extern_crate.lock(); + r.map(|c| &*tcx.arena.alloc(c)) } is_no_builtins => { cdata.root.no_builtins } impl_defaultness => { cdata.get_impl_defaultness(def_id.index) } @@ -190,7 +190,7 @@ provide! { <'tcx> tcx, def_id, other, cdata, }) .collect(); - Lrc::new(reachable_non_generics) + tcx.arena.alloc(reachable_non_generics) } native_libraries => { Lrc::new(cdata.get_native_libraries(tcx.sess)) } foreign_modules => { cdata.get_foreign_modules(tcx) } diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index b287db498fcac..958c81989ffd6 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1097,16 +1097,18 @@ impl<'a, 'tcx> CrateMetadata { } } - pub fn get_dylib_dependency_formats(&self) -> Vec<(CrateNum, LinkagePreference)> { - self.root + pub fn get_dylib_dependency_formats( + &self, + tcx: TyCtxt<'_, 'tcx, '_>, + ) -> &'tcx [(CrateNum, LinkagePreference)] { + tcx.arena.alloc_from_iter(self.root .dylib_dependency_formats .decode(self) .enumerate() .flat_map(|(i, link)| { let cnum = CrateNum::new(i + 1); link.map(|link| (self.cnum_map[cnum], link)) - }) - .collect() + })) } pub fn get_missing_lang_items( diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index 45ace5b37665a..55471dbc00be5 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -109,8 +109,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> { let mut result = Vec::with_capacity(self.tcx.crates().len()); for &n in self.tcx.crates().iter() { - let span = match *self.tcx.extern_crate(n.as_def_id()) { - Some(ExternCrate { span, .. }) => span, + let span = match self.tcx.extern_crate(n.as_def_id()) { + Some(&ExternCrate { span, .. }) => span, None => { debug!("Skipping crate {}, no data", n); continue;