From fb6040096ca2c21c354a500ab8fd0038d84be193 Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Sat, 12 Jan 2019 21:49:18 +0100 Subject: [PATCH] Querify local proc_macro_decls_static --- src/librustc/session/mod.rs | 2 -- .../back/symbol_export.rs | 5 ++-- src/librustc_codegen_utils/symbol_names.rs | 2 +- src/librustc_driver/driver.rs | 7 +++-- src/librustc_driver/proc_macro_decls.rs | 26 +++++++++++++++---- src/librustc_metadata/encoder.rs | 4 +-- 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index ba09480f93f..da2524b8188 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -70,7 +70,6 @@ pub struct Session { /// For a library crate, this is always none pub entry_fn: Once>, pub plugin_registrar_fn: Once>, - pub proc_macro_decls_static: Once>, pub sysroot: PathBuf, /// The name of the root source file of the crate, in the local file system. /// `None` means that there is no source file. @@ -1175,7 +1174,6 @@ pub fn build_session_( // For a library crate, this is always none entry_fn: Once::new(), plugin_registrar_fn: Once::new(), - proc_macro_decls_static: Once::new(), sysroot, local_crate_source_file, working_dir, diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs index 928e171fe0f..c7bf221b939 100644 --- a/src/librustc_codegen_ssa/back/symbol_export.rs +++ b/src/librustc_codegen_ssa/back/symbol_export.rs @@ -147,9 +147,8 @@ fn reachable_non_generics_provider<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, }) .collect(); - if let Some(id) = *tcx.sess.proc_macro_decls_static.get() { - let def_id = tcx.hir().local_def_id(id); - reachable_non_generics.insert(def_id, SymbolExportLevel::C); + if let Some(id) = tcx.proc_macro_decls_static(LOCAL_CRATE) { + reachable_non_generics.insert(id, SymbolExportLevel::C); } if let Some(id) = *tcx.sess.plugin_registrar_fn.get() { diff --git a/src/librustc_codegen_utils/symbol_names.rs b/src/librustc_codegen_utils/symbol_names.rs index 5a5d1b20b21..72f534e486b 100644 --- a/src/librustc_codegen_utils/symbol_names.rs +++ b/src/librustc_codegen_utils/symbol_names.rs @@ -247,7 +247,7 @@ fn compute_symbol_name<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: Instance let disambiguator = tcx.sess.local_crate_disambiguator(); return tcx.sess.generate_plugin_registrar_symbol(disambiguator); } - if *tcx.sess.proc_macro_decls_static.get() == Some(id) { + if tcx.proc_macro_decls_static(LOCAL_CRATE) == Some(def_id) { let disambiguator = tcx.sess.local_crate_disambiguator(); return tcx.sess.generate_proc_macro_decls_symbol(disambiguator); } diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 380f9afd68d..71bc9968b1c 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -1158,6 +1158,7 @@ where } pub fn default_provide(providers: &mut ty::query::Providers) { + proc_macro_decls::provide(providers); hir::provide(providers); borrowck::provide(providers); mir::provide(providers); @@ -1216,8 +1217,6 @@ where .set(time(sess, "looking for plugin registrar", || { plugin::build::find_plugin_registrar(sess.diagnostic(), &hir_map) })); - sess.proc_macro_decls_static - .set(proc_macro_decls::find(&hir_map)); let mut local_providers = ty::query::Providers::default(); default_provide(&mut local_providers); @@ -1250,6 +1249,10 @@ where time(sess, "loop checking", || loops::check_crate(tcx)); + time(sess, "looking for derive registrar", || { + proc_macro_decls::find(tcx) + }); + time(sess, "attribute checking", || { hir::check_attr::check_crate(tcx) }); diff --git a/src/librustc_driver/proc_macro_decls.rs b/src/librustc_driver/proc_macro_decls.rs index bb2ea6c2a97..093d15b7e3c 100644 --- a/src/librustc_driver/proc_macro_decls.rs +++ b/src/librustc_driver/proc_macro_decls.rs @@ -1,15 +1,25 @@ use rustc::hir::itemlikevisit::ItemLikeVisitor; -use rustc::hir::map::Map; +use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use rustc::hir; +use rustc::ty::TyCtxt; +use rustc::ty::query::Providers; use syntax::ast; use syntax::attr; -pub fn find(hir_map: &Map) -> Option { - let krate = hir_map.krate(); +pub fn find<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) -> Option { + tcx.proc_macro_decls_static(LOCAL_CRATE) +} + +fn proc_macro_decls_static<'tcx>( + tcx: TyCtxt<'_, 'tcx, 'tcx>, + cnum: CrateNum, +) -> Option { + assert_eq!(cnum, LOCAL_CRATE); let mut finder = Finder { decls: None }; - krate.visit_all_item_likes(&mut finder); - finder.decls + tcx.hir().krate().visit_all_item_likes(&mut finder); + + finder.decls.map(|id| tcx.hir().local_def_id(id)) } struct Finder { @@ -30,3 +40,9 @@ impl<'v> ItemLikeVisitor<'v> for Finder { } } +pub(crate) fn provide(providers: &mut Providers<'_>) { + *providers = Providers { + proc_macro_decls_static, + ..*providers + }; +} diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs index 032a4656efc..56558a1550a 100644 --- a/src/librustc_metadata/encoder.rs +++ b/src/librustc_metadata/encoder.rs @@ -487,8 +487,8 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { .get() .map(|id| tcx.hir().local_def_id(id).index), proc_macro_decls_static: if is_proc_macro { - let id = tcx.sess.proc_macro_decls_static.get().unwrap(); - Some(tcx.hir().local_def_id(id).index) + let id = tcx.proc_macro_decls_static(LOCAL_CRATE).unwrap(); + Some(id.index) } else { None },