From: Niko Matsakis Date: Fri, 29 Jan 2016 20:04:07 +0000 (-0500) Subject: Instrument a bunch of tasks that employ the HIR map in one way or X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;ds=sidebyside;h=35b6e2b0bbae9167ebc77ee02bd4542d51b199f3;p=rust.git Instrument a bunch of tasks that employ the HIR map in one way or another and were not previously instrumented. --- diff --git a/src/librustc/dep_graph/mod.rs b/src/librustc/dep_graph/mod.rs index d37a4acbcfb..faf97f5808e 100644 --- a/src/librustc/dep_graph/mod.rs +++ b/src/librustc/dep_graph/mod.rs @@ -40,8 +40,21 @@ pub enum DepNode { Hir(DefId), // Represents different phases in the compiler. + CrateReader, + CollectLanguageItems, + CheckStaticRecursion, + ResolveLifetimes, + RegionResolveCrate, + CheckLoops, + PluginRegistrar, + StabilityIndex, CollectItem(DefId), Coherence, + EffectCheck, + Liveness, + Resolve, + EntryPoint, + CheckEntryFn, CoherenceCheckImpl(DefId), CoherenceOverlapCheck(DefId), CoherenceOverlapCheckSpecial(DefId), diff --git a/src/librustc/middle/effect.rs b/src/librustc/middle/effect.rs index 055beac5428..c27d029374a 100644 --- a/src/librustc/middle/effect.rs +++ b/src/librustc/middle/effect.rs @@ -12,6 +12,7 @@ //! `unsafe`. use self::RootUnsafeContext::*; +use dep_graph::DepNode; use middle::def::Def; use middle::ty::{self, Ty}; use middle::ty::MethodCall; @@ -182,6 +183,8 @@ fn visit_expr(&mut self, expr: &hir::Expr) { } pub fn check_crate(tcx: &ty::ctxt) { + let _task = tcx.dep_graph.in_task(DepNode::EffectCheck); + let mut visitor = EffectCheckVisitor { tcx: tcx, unsafe_context: UnsafeContext::new(SafeContext), diff --git a/src/librustc/middle/entry.rs b/src/librustc/middle/entry.rs index 2d096f66e09..67e96816abf 100644 --- a/src/librustc/middle/entry.rs +++ b/src/librustc/middle/entry.rs @@ -9,6 +9,7 @@ // except according to those terms. +use dep_graph::DepNode; use front::map as ast_map; use middle::def_id::{CRATE_DEF_INDEX}; use session::{config, Session}; @@ -48,6 +49,8 @@ fn visit_item(&mut self, item: &'tcx Item) { } pub fn find_entry_point(session: &Session, ast_map: &ast_map::Map) { + let _task = ast_map.dep_graph.in_task(DepNode::EntryPoint); + let any_exe = session.crate_types.borrow().iter().any(|ty| { *ty == config::CrateTypeExecutable }); diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index 6e57d5dd1ba..f77ca10e88f 100644 --- a/src/librustc/middle/lang_items.rs +++ b/src/librustc/middle/lang_items.rs @@ -21,6 +21,7 @@ pub use self::LangItem::*; +use dep_graph::DepNode; use front::map as hir_map; use session::Session; use middle::cstore::CrateStore; @@ -234,6 +235,7 @@ pub fn extract(attrs: &[ast::Attribute]) -> Option { pub fn collect_language_items(session: &Session, map: &hir_map::Map) -> LanguageItems { + let _task = map.dep_graph.in_task(DepNode::CollectLanguageItems); let krate: &hir::Crate = map.krate(); let mut collector = LanguageItemCollector::new(session, map); collector.collect(krate); diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 90fa148e008..5fa9d459345 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -109,6 +109,7 @@ use self::LiveNodeKind::*; use self::VarKind::*; +use dep_graph::DepNode; use middle::def::*; use middle::pat_util; use middle::ty; @@ -192,6 +193,7 @@ fn visit_fn(&mut self, fk: FnKind<'v>, fd: &'v hir::FnDecl, } pub fn check_crate(tcx: &ty::ctxt) { + let _task = tcx.dep_graph.in_task(DepNode::Liveness); tcx.map.krate().visit_all_items(&mut IrMaps::new(tcx)); tcx.sess.abort_if_errors(); } diff --git a/src/librustc/middle/region.rs b/src/librustc/middle/region.rs index 1361fac5b16..bf21b607b77 100644 --- a/src/librustc/middle/region.rs +++ b/src/librustc/middle/region.rs @@ -16,6 +16,7 @@ //! Most of the documentation on regions can be found in //! `middle/infer/region_inference/README.md` +use dep_graph::DepNode; use front::map as ast_map; use session::Session; use util::nodemap::{FnvHashMap, NodeMap, NodeSet}; @@ -1224,7 +1225,10 @@ fn visit_local(&mut self, l: &Local) { } } -pub fn resolve_crate(sess: &Session, krate: &hir::Crate) -> RegionMaps { +pub fn resolve_crate(sess: &Session, map: &ast_map::Map) -> RegionMaps { + let _task = map.dep_graph.in_task(DepNode::RegionResolveCrate); + let krate = map.krate(); + let maps = RegionMaps { code_extents: RefCell::new(vec![]), code_extent_interner: RefCell::new(FnvHashMap()), diff --git a/src/librustc/middle/resolve_lifetime.rs b/src/librustc/middle/resolve_lifetime.rs index 48955bd9a15..4bdf716e637 100644 --- a/src/librustc/middle/resolve_lifetime.rs +++ b/src/librustc/middle/resolve_lifetime.rs @@ -18,6 +18,8 @@ pub use self::DefRegion::*; use self::ScopeChain::*; +use dep_graph::DepNode; +use front::map::Map; use session::Session; use middle::def::{Def, DefMap}; use middle::region; @@ -94,9 +96,11 @@ enum ScopeChain<'a> { static ROOT_SCOPE: ScopeChain<'static> = RootScope; pub fn krate(sess: &Session, - krate: &hir::Crate, + hir_map: &Map, def_map: &DefMap) -> Result { + let _task = hir_map.dep_graph.in_task(DepNode::ResolveLifetimes); + let krate = hir_map.krate(); let mut named_region_map = NodeMap(); try!(sess.track_errors(|| { krate.visit_all_items(&mut LifetimeContext { diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index e0d38f1c76f..7835f333f19 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -14,6 +14,7 @@ pub use self::StabilityLevel::*; use dep_graph::DepNode; +use front::map as hir_map; use session::Session; use lint; use middle::cstore::{CrateStore, LOCAL_CRATE}; @@ -30,7 +31,7 @@ use util::nodemap::{DefIdMap, FnvHashSet, FnvHashMap}; use rustc_front::hir; -use rustc_front::hir::{Crate, Item, Generics, StructField, Variant}; +use rustc_front::hir::{Item, Generics, StructField, Variant}; use rustc_front::intravisit::{self, Visitor}; use std::mem::replace; @@ -278,7 +279,9 @@ fn visit_macro_def(&mut self, md: &'v hir::MacroDef) { impl<'tcx> Index<'tcx> { /// Construct the stability index for a crate being compiled. - pub fn build(&mut self, tcx: &ty::ctxt<'tcx>, krate: &Crate, access_levels: &AccessLevels) { + pub fn build(&mut self, tcx: &ty::ctxt<'tcx>, access_levels: &AccessLevels) { + let _task = tcx.dep_graph.in_task(DepNode::StabilityIndex); + let krate = tcx.map.krate(); let mut annotator = Annotator { tcx: tcx, index: self, @@ -291,7 +294,10 @@ pub fn build(&mut self, tcx: &ty::ctxt<'tcx>, krate: &Crate, access_levels: &Acc |v| intravisit::walk_crate(v, krate)); } - pub fn new(krate: &Crate) -> Index<'tcx> { + pub fn new(hir_map: &hir_map::Map) -> Index<'tcx> { + let _task = hir_map.dep_graph.in_task(DepNode::StabilityIndex); + let krate = hir_map.krate(); + let mut is_staged_api = false; for attr in &krate.attrs { if attr.name() == "stable" || attr.name() == "unstable" { diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index c189df18a82..e5066399323 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -8,6 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +use rustc::dep_graph::DepGraph; use rustc::front; use rustc::front::map as hir_map; use rustc_mir as mir; @@ -115,9 +116,11 @@ macro_rules! controller_entry_point { let expanded_crate = assign_node_ids(sess, expanded_crate); // Lower ast -> hir. let lcx = LoweringContext::new(sess, Some(&expanded_crate)); + let dep_graph = DepGraph::new(sess.opts.build_dep_graph); let mut hir_forest = time(sess.time_passes(), "lowering ast -> hir", - || hir_map::Forest::new(lower_crate(&lcx, &expanded_crate))); + || hir_map::Forest::new(lower_crate(&lcx, &expanded_crate), + dep_graph)); // Discard MTWT tables that aren't required past lowering to HIR. if !sess.opts.debugging_opts.keep_mtwt_tables && @@ -130,17 +133,20 @@ macro_rules! controller_entry_point { write_out_deps(sess, &outputs, &id); - controller_entry_point!(after_write_deps, - sess, - CompileState::state_after_write_deps(input, - sess, - outdir, - &hir_map, - &expanded_crate, - &hir_map.krate(), - &id[..], - &lcx), - Ok(())); + { + let _ignore = hir_map.dep_graph.in_ignore(); + controller_entry_point!(after_write_deps, + sess, + CompileState::state_after_write_deps(input, + sess, + outdir, + &hir_map, + &expanded_crate, + &hir_map.krate(), + &id[..], + &lcx), + Ok(())); + } time(sess.time_passes(), "attribute checking", || { front::check_attr::check_crate(sess, &expanded_crate); @@ -166,6 +172,9 @@ macro_rules! controller_entry_point { control.make_glob_map, |tcx, mir_map, analysis, result| { { + // Eventually, we will want to track plugins. + let _ignore = tcx.dep_graph.in_ignore(); + let state = CompileState::state_after_analysis(input, &tcx.sess, outdir, @@ -735,11 +744,10 @@ macro_rules! try_with_f { } let time_passes = sess.time_passes(); - let krate = hir_map.krate(); time(time_passes, "external crate/lib resolution", - || LocalCrateReader::new(sess, cstore, &hir_map).read_crates(krate)); + || LocalCrateReader::new(sess, cstore, &hir_map).read_crates()); let lang_items = try!(time(time_passes, "language item collection", || { sess.track_errors(|| { @@ -769,7 +777,7 @@ macro_rules! try_with_f { let named_region_map = try!(time(time_passes, "lifetime resolution", || middle::resolve_lifetime::krate(sess, - krate, + &hir_map, &def_map.borrow()))); time(time_passes, @@ -777,20 +785,22 @@ macro_rules! try_with_f { || middle::entry::find_entry_point(sess, &hir_map)); sess.plugin_registrar_fn.set(time(time_passes, "looking for plugin registrar", || { - plugin::build::find_plugin_registrar(sess.diagnostic(), krate) + plugin::build::find_plugin_registrar(sess.diagnostic(), &hir_map) })); let region_map = time(time_passes, "region resolution", - || middle::region::resolve_crate(sess, krate)); + || middle::region::resolve_crate(sess, &hir_map)); time(time_passes, "loop checking", - || loops::check_crate(sess, krate)); + || loops::check_crate(sess, &hir_map)); try!(time(time_passes, "static item recursion checking", - || static_recursion::check_crate(sess, krate, &def_map.borrow(), &hir_map))); + || static_recursion::check_crate(sess, &def_map.borrow(), &hir_map))); + + let index = stability::Index::new(&hir_map); ty::ctxt::create_and_enter(sess, arenas, @@ -800,7 +810,7 @@ macro_rules! try_with_f { freevars, region_map, lang_items, - stability::Index::new(krate), + index, |tcx| { // passes are timed inside typeck try_with_f!(typeck::check_crate(tcx, trait_map), (tcx, None, analysis)); @@ -818,7 +828,7 @@ macro_rules! try_with_f { // Do not move this check past lint time(time_passes, "stability index", || { - tcx.stability.borrow_mut().build(tcx, krate, &analysis.access_levels) + tcx.stability.borrow_mut().build(tcx, &analysis.access_levels) }); time(time_passes, diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index 91af78a5bd4..58043f385fe 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -19,6 +19,7 @@ use {driver, abort_on_err}; +use rustc::dep_graph::DepGraph; use rustc::middle::ty; use rustc::middle::cfg; use rustc::middle::cfg::graphviz::LabelledCFG; @@ -183,7 +184,7 @@ fn call_with_pp_support_hir<'tcx, A, B, F>(&self, sess: sess, ast_map: Some(ast_map.clone()), }; - f(&annotation, payload, &ast_map.forest.krate) + f(&annotation, payload, ast_map.forest.krate()) } PpmIdentified => { @@ -191,7 +192,7 @@ fn call_with_pp_support_hir<'tcx, A, B, F>(&self, sess: sess, ast_map: Some(ast_map.clone()), }; - f(&annotation, payload, &ast_map.forest.krate) + f(&annotation, payload, ast_map.forest.krate()) } PpmTyped => { abort_on_err(driver::phase_3_run_analysis_passes(sess, @@ -207,7 +208,7 @@ fn call_with_pp_support_hir<'tcx, A, B, F>(&self, let _ignore = tcx.dep_graph.in_ignore(); f(&annotation, payload, - &ast_map.forest.krate) + ast_map.forest.krate()) }), sess) } _ => panic!("Should use call_with_pp_support"), @@ -706,8 +707,10 @@ pub fn pretty_print_input(sess: Session, let mut hir_forest; let lcx = LoweringContext::new(&sess, Some(&krate)); let arenas = ty::CtxtArenas::new(); + let dep_graph = DepGraph::new(false); + let _ignore = dep_graph.in_ignore(); let ast_map = if compute_ast_map { - hir_forest = hir_map::Forest::new(lower_crate(&lcx, &krate)); + hir_forest = hir_map::Forest::new(lower_crate(&lcx, &krate), dep_graph.clone()); let map = driver::make_map(&sess, &mut hir_forest); Some(map) } else { diff --git a/src/librustc_driver/test.rs b/src/librustc_driver/test.rs index 3389992ebb8..3736e045bd1 100644 --- a/src/librustc_driver/test.rs +++ b/src/librustc_driver/test.rs @@ -11,6 +11,7 @@ //! # Standalone Tests for the Inference Module use driver; +use rustc::dep_graph::DepGraph; use rustc_lint; use rustc_resolve as resolve; use rustc_typeck::middle::lang_items; @@ -118,17 +119,19 @@ fn test_env(source_string: &str, let krate = driver::assign_node_ids(&sess, krate); let lcx = LoweringContext::new(&sess, Some(&krate)); - let mut hir_forest = hir_map::Forest::new(lower_crate(&lcx, &krate)); + let dep_graph = DepGraph::new(false); + let _ignore = dep_graph.in_ignore(); + let mut hir_forest = hir_map::Forest::new(lower_crate(&lcx, &krate), dep_graph.clone()); let arenas = ty::CtxtArenas::new(); let ast_map = driver::make_map(&sess, &mut hir_forest); - let krate = ast_map.krate(); // run just enough stuff to build a tcx: let lang_items = lang_items::collect_language_items(&sess, &ast_map); let resolve::CrateMap { def_map, freevars, .. } = resolve::resolve_crate(&sess, &ast_map, resolve::MakeGlobMap::No); - let named_region_map = resolve_lifetime::krate(&sess, krate, &def_map.borrow()); - let region_map = region::resolve_crate(&sess, krate); + let named_region_map = resolve_lifetime::krate(&sess, &ast_map, &def_map.borrow()); + let region_map = region::resolve_crate(&sess, &ast_map); + let index = stability::Index::new(&ast_map); ty::ctxt::create_and_enter(&sess, &arenas, def_map, @@ -137,7 +140,7 @@ fn test_env(source_string: &str, freevars, region_map, lang_items, - stability::Index::new(krate), + index, |tcx| { let infcx = infer::new_infer_ctxt(tcx, &tcx.tables, None); body(Env { infcx: &infcx }); diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index b569739c40c..7b094a5900a 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -18,6 +18,7 @@ use loader::{self, CratePaths}; use rustc::back::svh::Svh; +use rustc::dep_graph::DepNode; use rustc::session::{config, Session}; use rustc::session::search_paths::PathKind; use rustc::middle::cstore::{CrateStore, validate_crate_name}; @@ -723,7 +724,10 @@ pub fn new(sess: &'a Session, cstore: &'a CStore, // Traverses an AST, reading all the information about use'd crates and // extern libraries necessary for later resolving, typechecking, linking, // etc. - pub fn read_crates(&mut self, krate: &hir::Crate) { + pub fn read_crates(&mut self) { + let _task = self.ast_map.dep_graph.in_task(DepNode::CrateReader); + let krate = self.ast_map.krate(); + self.process_crate(krate); krate.visit_all_items(self); self.creader.inject_allocator_crate(); diff --git a/src/librustc_passes/loops.rs b/src/librustc_passes/loops.rs index eb2e445f9b0..bce18d3fe6e 100644 --- a/src/librustc_passes/loops.rs +++ b/src/librustc_passes/loops.rs @@ -11,9 +11,11 @@ use rustc::session::Session; -use syntax::codemap::Span; +use rustc::dep_graph::DepNode; +use rustc::front::map::Map; use rustc_front::intravisit::{self, Visitor}; use rustc_front::hir; +use syntax::codemap::Span; #[derive(Clone, Copy, PartialEq)] enum Context { @@ -26,7 +28,9 @@ struct CheckLoopVisitor<'a> { cx: Context } -pub fn check_crate(sess: &Session, krate: &hir::Crate) { +pub fn check_crate(sess: &Session, map: &Map) { + let _task = map.dep_graph.in_task(DepNode::CheckLoops); + let krate = map.krate(); krate.visit_all_items(&mut CheckLoopVisitor { sess: sess, cx: Normal }); } diff --git a/src/librustc_passes/static_recursion.rs b/src/librustc_passes/static_recursion.rs index 2d81354495d..329ce21edbe 100644 --- a/src/librustc_passes/static_recursion.rs +++ b/src/librustc_passes/static_recursion.rs @@ -11,6 +11,7 @@ // This compiler pass detects constants that refer to themselves // recursively. +use rustc::dep_graph::DepNode; use rustc::front::map as ast_map; use rustc::session::{Session, CompileResult}; use rustc::middle::def::{Def, DefMap}; @@ -90,9 +91,11 @@ fn visit_impl_item(&mut self, ii: &'ast hir::ImplItem) { } pub fn check_crate<'ast>(sess: &Session, - krate: &'ast hir::Crate, def_map: &DefMap, - ast_map: &ast_map::Map<'ast>) -> CompileResult { + ast_map: &ast_map::Map<'ast>) + -> CompileResult { + let _task = ast_map.dep_graph.in_task(DepNode::CheckStaticRecursion); + let mut visitor = CheckCrateVisitor { sess: sess, def_map: def_map, @@ -100,7 +103,7 @@ pub fn check_crate<'ast>(sess: &Session, discriminant_map: RefCell::new(NodeMap()), }; sess.track_errors(|| { - krate.visit_all_items(&mut visitor); + ast_map.krate().visit_all_items(&mut visitor); }) } diff --git a/src/librustc_plugin/build.rs b/src/librustc_plugin/build.rs index 5adde4304f5..fe83b609334 100644 --- a/src/librustc_plugin/build.rs +++ b/src/librustc_plugin/build.rs @@ -14,6 +14,8 @@ use syntax::attr; use syntax::codemap::Span; use syntax::errors; +use rustc::dep_graph::DepNode; +use rustc::front::map::Map; use rustc_front::intravisit::Visitor; use rustc_front::hir; @@ -34,8 +36,11 @@ fn visit_item(&mut self, item: &hir::Item) { /// Find the function marked with `#[plugin_registrar]`, if any. pub fn find_plugin_registrar(diagnostic: &errors::Handler, - krate: &hir::Crate) + hir_map: &Map) -> Option { + let _task = hir_map.dep_graph.in_task(DepNode::PluginRegistrar); + let krate = hir_map.krate(); + let mut finder = RegistrarFinder { registrars: Vec::new() }; krate.visit_all_items(&mut finder); diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index 64973bd7916..054aa1d5f55 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -47,6 +47,7 @@ use self::ParentLink::*; use self::FallbackChecks::*; +use rustc::dep_graph::DepNode; use rustc::front::map as hir_map; use rustc::session::Session; use rustc::lint; @@ -3596,6 +3597,15 @@ pub fn resolve_crate<'a, 'tcx>(session: &'a Session, ast_map: &'a hir_map::Map<'tcx>, make_glob_map: MakeGlobMap) -> CrateMap { + // Currently, we ignore the name resolution data structures for + // the purposes of dependency tracking. Instead we will run name + // resolution and include its output in the hash of each item, + // much like we do for macro expansion. In other words, the hash + // reflects not just its contents but the results of name + // resolution on those contents. Hopefully we'll push this back at + // some point. + let _task = ast_map.dep_graph.in_task(DepNode::Resolve); + let krate = ast_map.krate(); let arenas = Resolver::arenas(); let mut resolver = create_resolver(session, ast_map, krate, make_glob_map, &arenas, None); diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs index cb0b4d0902c..083eeff9f90 100644 --- a/src/librustc_typeck/lib.rs +++ b/src/librustc_typeck/lib.rs @@ -100,6 +100,7 @@ pub use rustc::session; pub use rustc::util; +use dep_graph::DepNode; use front::map as hir_map; use middle::def::Def; use middle::infer::{self, TypeOrigin}; @@ -312,6 +313,7 @@ fn check_start_fn_ty(ccx: &CrateCtxt, fn check_for_entry_fn(ccx: &CrateCtxt) { let tcx = ccx.tcx; + let _task = tcx.dep_graph.in_task(DepNode::CheckEntryFn); match *tcx.sess.entry_fn.borrow() { Some((id, sp)) => match tcx.sess.entry_type.get() { Some(config::EntryMain) => check_main_fn_ty(ccx, id, sp),