about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2017-02-28 12:32:54 -0500
committerNiko Matsakis <niko@alum.mit.edu>2017-02-28 12:32:54 -0500
commit384f044d826f68827802ce6f255a09282e437a09 (patch)
tree53c6792f46f6f7cc4a3bbad8ca63dca7b55b910e
parenta780fa3f67dc6d1f4a450b4f367727a7e87a7867 (diff)
downloadrust-384f044d826f68827802ce6f255a09282e437a09.tar.gz
rust-384f044d826f68827802ce6f255a09282e437a09.zip
convert MIR to iterate over the bodies vector
-rw-r--r--src/librustc/dep_graph/dep_node.rs2
-rw-r--r--src/librustc_mir/mir_map.rs26
2 files changed, 7 insertions, 21 deletions
diff --git a/src/librustc/dep_graph/dep_node.rs b/src/librustc/dep_graph/dep_node.rs
index 2e7bac67c5f..2777c4d2487 100644
--- a/src/librustc/dep_graph/dep_node.rs
+++ b/src/librustc/dep_graph/dep_node.rs
@@ -89,6 +89,7 @@ pub enum DepNode<D: Clone + Debug> {
 
     // Represents the MIR for a fn; also used as the task node for
     // things read/modify that MIR.
+    MirKrate,
     Mir(D),
 
     BorrowCheckKrate,
@@ -212,6 +213,7 @@ impl<D: Clone + Debug> DepNode<D> {
         match *self {
             Krate => Some(Krate),
             BorrowCheckKrate => Some(BorrowCheckKrate),
+            MirKrate => Some(MirKrate),
             TypeckBodiesKrate => Some(TypeckBodiesKrate),
             CollectLanguageItems => Some(CollectLanguageItems),
             CheckStaticRecursion => Some(CheckStaticRecursion),
diff --git a/src/librustc_mir/mir_map.rs b/src/librustc_mir/mir_map.rs
index e0eb09fbf5d..a41489ff89f 100644
--- a/src/librustc_mir/mir_map.rs
+++ b/src/librustc_mir/mir_map.rs
@@ -30,7 +30,6 @@ use rustc::ty::{self, Ty, TyCtxt};
 use rustc::ty::maps::Providers;
 use rustc::ty::subst::Substs;
 use rustc::hir;
-use rustc::hir::intravisit::{Visitor, NestedVisitorMap};
 use syntax::abi::Abi;
 use syntax::ast;
 use syntax_pos::Span;
@@ -39,9 +38,11 @@ use std::cell::RefCell;
 use std::mem;
 
 pub fn build_mir_for_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
-    tcx.visit_all_item_likes_in_krate(DepNode::Mir, &mut BuildMir {
-        tcx: tcx
-    }.as_deep_visitor());
+    tcx.dep_graph.with_task(DepNode::MirKrate, || {
+        tcx.visit_all_bodies_in_krate(|body_owner_def_id, _body_id| {
+            tcx.item_mir(body_owner_def_id);
+        });
+    });
 }
 
 pub fn provide(providers: &mut Providers) {
@@ -180,23 +181,6 @@ impl<'a, 'gcx: 'tcx, 'tcx> MutVisitor<'tcx> for GlobalizeMir<'a, 'gcx> {
 ///////////////////////////////////////////////////////////////////////////
 // BuildMir -- walks a crate, looking for fn items and methods to build MIR from
 
-struct BuildMir<'a, 'tcx: 'a> {
-    tcx: TyCtxt<'a, 'tcx, 'tcx>
-}
-
-impl<'a, 'tcx> Visitor<'tcx> for BuildMir<'a, 'tcx> {
-    fn nested_visit_map<'this>(&'this mut self) -> NestedVisitorMap<'this, 'tcx> {
-        NestedVisitorMap::None
-    }
-
-    fn visit_nested_body(&mut self, body_id: hir::BodyId) {
-        self.tcx.item_mir(self.tcx.hir.body_owner_def_id(body_id));
-
-        let body = self.tcx.hir.body(body_id);
-        self.visit_body(body);
-    }
-}
-
 fn closure_self_ty<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                              closure_expr_id: ast::NodeId,
                              body_id: hir::BodyId)