diff options
| author | bors <bors@rust-lang.org> | 2017-04-07 08:36:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-04-07 08:36:11 +0000 |
| commit | 4c59c92bc4d4d6e5b2b66c4cc08dd1a058283a0d (patch) | |
| tree | 3ac2a85c507f549dfc2c8720419cad0fa64eacee | |
| parent | b9c5197d4878253804d91e0c30ed92e0a965b663 (diff) | |
| parent | aab2cca046670295bc1a430a8b1c23d755f9bd5a (diff) | |
| download | rust-4c59c92bc4d4d6e5b2b66c4cc08dd1a058283a0d.tar.gz rust-4c59c92bc4d4d6e5b2b66c4cc08dd1a058283a0d.zip | |
Auto merge of #40873 - cramertj:on-demandify-queries, r=nikomatsakis
On demandify reachability cc https://github.com/rust-lang/rust/issues/40746 I tried following this guidance from #40746: > The following tasks currently execute before a tcx is built, but they could be easily converted into queries that are requested after tcx is built. The main reason they are the way they are was to avoid a gratuitious refcell (but using the refcell map seems fine)... but the result of moving `region_maps` out of `TyCtxt` and into a query caused a lot of churn, and seems like it could potentially result in a rather large performance hit, since it means a dep-graph lookup on every use of `region_maps` (rather than just a field access). Possibly `TyCtxt` could store a `RefCell<Option<RegionMap>>` internally and use that to prevent repeat lookups, but that feels like it's duplicating the work of the dep-graph. @nikomatsakis What did you have in mind for this?
| -rw-r--r-- | src/librustc/middle/reachable.rs | 17 | ||||
| -rw-r--r-- | src/librustc/ty/maps.rs | 12 | ||||
| -rw-r--r-- | src/librustc_driver/driver.rs | 1 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/librustc/middle/reachable.rs b/src/librustc/middle/reachable.rs index b0e39442af9..e5dd48534a6 100644 --- a/src/librustc/middle/reachable.rs +++ b/src/librustc/middle/reachable.rs @@ -15,11 +15,11 @@ // makes all other generics or inline functions that it references // reachable as well. -use dep_graph::DepNode; use hir::map as hir_map; use hir::def::Def; -use hir::def_id::DefId; +use hir::def_id::{DefId, CrateNum}; use ty::{self, TyCtxt}; +use ty::maps::Providers; use middle::privacy; use session::config; use util::nodemap::{NodeSet, FxHashSet}; @@ -362,7 +362,11 @@ impl<'a, 'tcx: 'a> ItemLikeVisitor<'tcx> for CollectPrivateImplItemsVisitor<'a, } pub fn find_reachable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> NodeSet { - let _task = tcx.dep_graph.in_task(DepNode::Reachability); + ty::queries::reachable_set::get(tcx, DUMMY_SP, LOCAL_CRATE) +} + +fn reachable_set<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, crate_num: CrateNum) -> NodeSet { + debug_assert!(crate_num == LOCAL_CRATE); let access_levels = &ty::queries::privacy_access_levels::get(tcx, DUMMY_SP, LOCAL_CRATE); @@ -408,3 +412,10 @@ pub fn find_reachable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> NodeSet { // Return the set of reachable symbols. reachable_context.reachable_symbols } + +pub fn provide(providers: &mut Providers) { + *providers = Providers { + reachable_set, + ..*providers + }; +} diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 4a183191cef..823bdc9e092 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -15,6 +15,7 @@ use middle::privacy::AccessLevels; use mir; use session::CompileResult; use ty::{self, CrateInherentImpls, Ty, TyCtxt}; +use util::nodemap::NodeSet; use rustc_data_structures::indexed_vec::IndexVec; use std::cell::{RefCell, RefMut}; @@ -209,6 +210,11 @@ impl<'tcx> QueryDescription for queries::typeck_item_bodies<'tcx> { } } +impl<'tcx> QueryDescription for queries::reachable_set<'tcx> { + fn describe(_: TyCtxt, _: CrateNum) -> String { + format!("reachability") + } +} macro_rules! define_maps { (<$tcx:tt> @@ -440,6 +446,8 @@ define_maps! { <'tcx> /// Performs the privacy check and computes "access levels". pub privacy_access_levels: PrivacyAccessLevels(CrateNum) -> Rc<AccessLevels>, + pub reachable_set: reachability_dep_node(CrateNum) -> NodeSet, + pub mir_shims: mir_shim(ty::InstanceDef<'tcx>) -> &'tcx RefCell<mir::Mir<'tcx>> } @@ -451,6 +459,10 @@ fn crate_inherent_impls_dep_node(_: CrateNum) -> DepNode<DefId> { DepNode::Coherence } +fn reachability_dep_node(_: CrateNum) -> DepNode<DefId> { + DepNode::Reachability +} + fn mir_shim(instance: ty::InstanceDef) -> DepNode<DefId> { instance.dep_node() } diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 96eb5dd602f..0fb386341a9 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -889,6 +889,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, rustc_privacy::provide(&mut local_providers); typeck::provide(&mut local_providers); ty::provide(&mut local_providers); + reachable::provide(&mut local_providers); let mut extern_providers = ty::maps::Providers::default(); cstore::provide(&mut extern_providers); |
