diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2016-08-08 18:42:06 -0400 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2016-08-08 18:44:24 -0400 |
| commit | 8fdc72f830642abcd8dfefe5437e7df34390ce19 (patch) | |
| tree | d86ef07043d672c744aad4bb1489939ee4dcfd1b /src/librustc_mir/transform | |
| parent | 88b2e9a66d6e95dde14742c0d3b05cde3683a732 (diff) | |
| download | rust-8fdc72f830642abcd8dfefe5437e7df34390ce19.tar.gz rust-8fdc72f830642abcd8dfefe5437e7df34390ce19.zip | |
track MIR through the dep-graph
Per the discussion on #34765, we make one `DepNode::Mir` variant and use it to represent both the MIR tracking map as well as passes that operate on MIR. We also track loads of cached MIR (which naturally comes from metadata). Note that the "HAIR" pass adds a read of TypeckItemBody because it uses a myriad of tables that are not individually tracked.
Diffstat (limited to 'src/librustc_mir/transform')
| -rw-r--r-- | src/librustc_mir/transform/qualify_consts.rs | 19 | ||||
| -rw-r--r-- | src/librustc_mir/transform/type_check.rs | 5 |
2 files changed, 11 insertions, 13 deletions
diff --git a/src/librustc_mir/transform/qualify_consts.rs b/src/librustc_mir/transform/qualify_consts.rs index 1d00938fb25..28204f4630c 100644 --- a/src/librustc_mir/transform/qualify_consts.rs +++ b/src/librustc_mir/transform/qualify_consts.rs @@ -16,6 +16,7 @@ use rustc_data_structures::bitvec::BitVector; use rustc_data_structures::indexed_vec::{IndexVec, Idx}; +use rustc::dep_graph::DepNode; use rustc::hir; use rustc::hir::def_id::DefId; use rustc::hir::intravisit::FnKind; @@ -881,8 +882,8 @@ fn qualify_const_item_cached<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let extern_mir; let param_env_and_mir = if def_id.is_local() { - let node_id = tcx.map.as_local_node_id(def_id).unwrap(); - mir_map.and_then(|map| map.map.get(&node_id)).map(|mir| { + mir_map.and_then(|map| map.map.get(&def_id)).map(|mir| { + let node_id = tcx.map.as_local_node_id(def_id).unwrap(); (ty::ParameterEnvironment::for_item(tcx, node_id), mir) }) } else if let Some(mir) = tcx.sess.cstore.maybe_get_item_mir(tcx, def_id) { @@ -917,9 +918,10 @@ impl<'tcx> MirMapPass<'tcx> for QualifyAndPromoteConstants { // First, visit `const` items, potentially recursing, to get // accurate MUTABLE_INTERIOR and NEEDS_DROP qualifications. - for &id in map.map.keys() { - let def_id = tcx.map.local_def_id(id); - let _task = tcx.dep_graph.in_task(self.dep_node(def_id)); + let keys = map.map.keys(); + for &def_id in &keys { + let _task = tcx.dep_graph.in_task(DepNode::Mir(def_id)); + let id = tcx.map.as_local_node_id(def_id).unwrap(); let src = MirSource::from_node(tcx, id); if let MirSource::Const(_) = src { qualify_const_item_cached(tcx, &mut qualif_map, Some(map), def_id); @@ -929,9 +931,9 @@ impl<'tcx> MirMapPass<'tcx> for QualifyAndPromoteConstants { // Then, handle everything else, without recursing, // as the MIR map is not shared, since promotion // in functions (including `const fn`) mutates it. - for (&id, mir) in &mut map.map { - let def_id = tcx.map.local_def_id(id); - let _task = tcx.dep_graph.in_task(self.dep_node(def_id)); + for &def_id in &keys { + let _task = tcx.dep_graph.in_task(DepNode::Mir(def_id)); + let id = tcx.map.as_local_node_id(def_id).unwrap(); let src = MirSource::from_node(tcx, id); let mode = match src { MirSource::Fn(_) => { @@ -948,6 +950,7 @@ impl<'tcx> MirMapPass<'tcx> for QualifyAndPromoteConstants { }; let param_env = ty::ParameterEnvironment::for_item(tcx, id); + let mir = map.map.get_mut(&def_id).unwrap(); for hook in &mut *hooks { hook.on_mir_pass(tcx, src, mir, self, false); } diff --git a/src/librustc_mir/transform/type_check.rs b/src/librustc_mir/transform/type_check.rs index db49e1e0407..26a907920e8 100644 --- a/src/librustc_mir/transform/type_check.rs +++ b/src/librustc_mir/transform/type_check.rs @@ -11,8 +11,6 @@ //! This pass type-checks the MIR to ensure it is not broken. #![allow(unreachable_code)] -use rustc::dep_graph::DepNode; -use rustc::hir::def_id::DefId; use rustc::infer::{self, InferCtxt, InferOk}; use rustc::traits::{self, ProjectionMode}; use rustc::ty::fold::TypeFoldable; @@ -714,7 +712,4 @@ impl<'tcx> MirPass<'tcx> for TypeckMir { } impl Pass for TypeckMir { - fn dep_node(&self, def_id: DefId) -> DepNode<DefId> { - DepNode::MirTypeck(def_id) - } } |
