diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 92cebb48b69..53fd867e7fd 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -126,6 +126,7 @@ pub mod mir { pub mod repr; pub mod tcx; pub mod visit; + pub mod transform; pub mod mir_map; } diff --git a/src/librustc/mir/transform.rs b/src/librustc/mir/transform.rs new file mode 100644 index 00000000000..0f18d8d2821 --- /dev/null +++ b/src/librustc/mir/transform.rs @@ -0,0 +1,16 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use mir::repr::Mir; +use middle::ty::ctxt; + +pub trait MirPass { + fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, tcx: &ctxt<'tcx>); +} diff --git a/src/librustc_mir/mir_map.rs b/src/librustc_mir/mir_map.rs index f7a0642fd97..0e641bf679d 100644 --- a/src/librustc_mir/mir_map.rs +++ b/src/librustc_mir/mir_map.rs @@ -22,12 +22,13 @@ extern crate rustc_front; use build; use graphviz; use pretty; -use transform::{simplify_cfg, MirPass}; +use transform::simplify_cfg; use rustc::dep_graph::DepNode; use rustc::mir::repr::Mir; use hair::cx::Cx; use std::fs::File; +use rustc::mir::transform::MirPass; use rustc::mir::mir_map::MirMap; use rustc::middle::infer; use rustc::middle::region::CodeExtentData; @@ -147,7 +148,7 @@ impl<'a, 'm, 'tcx> Visitor<'tcx> for InnerDump<'a,'m,'tcx> { match build_mir(Cx::new(&infcx), implicit_arg_tys, id, span, decl, body) { Ok(mut mir) => { - simplify_cfg::SimplifyCfg::new().run_on_mir(&mut mir); + simplify_cfg::SimplifyCfg::new().run_on_mir(&mut mir, self.tcx); let meta_item_list = self.attr .iter() diff --git a/src/librustc_mir/transform/erase_regions.rs b/src/librustc_mir/transform/erase_regions.rs index 0f0317b6b19..b927ab489f1 100644 --- a/src/librustc_mir/transform/erase_regions.rs +++ b/src/librustc_mir/transform/erase_regions.rs @@ -15,24 +15,26 @@ use rustc::middle::ty; use rustc::mir::repr::*; use rustc::mir::visit::MutVisitor; -use transform::MirPass; use rustc::mir::mir_map::MirMap; +use rustc::mir::transform::MirPass; pub fn erase_regions<'tcx>(tcx: &ty::ctxt<'tcx>, mir_map: &mut MirMap<'tcx>) { - let mut eraser = EraseRegions::new(tcx); + let mut eraser = EraseRegions; - eraser.run_on_mir(mir); for (_, mir) in &mut mir_map.map { + eraser.run_on_mir(mir, tcx); } } -pub struct EraseRegions<'a, 'tcx: 'a> { +pub struct EraseRegions; + +struct EraseRegionsVisitor<'a, 'tcx: 'a> { tcx: &'a ty::ctxt<'tcx>, } -impl<'a, 'tcx> EraseRegions<'a, 'tcx> { - pub fn new(tcx: &'a ty::ctxt<'tcx>) -> EraseRegions<'a, 'tcx> { - EraseRegions { +impl<'a, 'tcx> EraseRegionsVisitor<'a, 'tcx> { + pub fn new(tcx: &'a ty::ctxt<'tcx>) -> Self { + EraseRegionsVisitor { tcx: tcx } } @@ -56,13 +58,13 @@ impl<'a, 'tcx> EraseRegions<'a, 'tcx> { } } -impl<'a, 'tcx> MirPass<'tcx> for EraseRegions<'a, 'tcx> { - fn run_on_mir(&mut self, mir: &mut Mir<'tcx>) { - self.visit_mir(mir); +impl MirPass for EraseRegions { + fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, tcx: &ty::ctxt<'tcx>) { + EraseRegionsVisitor::new(tcx).visit_mir(mir); } } -impl<'a, 'tcx> MutVisitor<'tcx> for EraseRegions<'a, 'tcx> { +impl<'a, 'tcx> MutVisitor<'tcx> for EraseRegionsVisitor<'a, 'tcx> { fn visit_mir(&mut self, mir: &mut Mir<'tcx>) { self.erase_regions_return_ty(&mut mir.return_ty); self.erase_regions_tys(mir.var_decls.iter_mut().map(|d| &mut d.ty)); diff --git a/src/librustc_mir/transform/mod.rs b/src/librustc_mir/transform/mod.rs index 174718f7b16..41ea4469734 100644 --- a/src/librustc_mir/transform/mod.rs +++ b/src/librustc_mir/transform/mod.rs @@ -11,9 +11,3 @@ pub mod simplify_cfg; pub mod erase_regions; mod util; - -use rustc::mir::repr::Mir; - -pub trait MirPass<'tcx> { - fn run_on_mir(&mut self, mir: &mut Mir<'tcx>); -} diff --git a/src/librustc_mir/transform/simplify_cfg.rs b/src/librustc_mir/transform/simplify_cfg.rs index 9d4c73b90f8..17c5b5f7c3c 100644 --- a/src/librustc_mir/transform/simplify_cfg.rs +++ b/src/librustc_mir/transform/simplify_cfg.rs @@ -11,7 +11,7 @@ use rustc::middle::const_eval::ConstVal; use rustc::mir::repr::*; use transform::util; -use transform::MirPass; +use rustc::mir::transform::MirPass; pub struct SimplifyCfg; @@ -118,8 +118,8 @@ impl SimplifyCfg { } } -impl<'tcx> MirPass<'tcx> for SimplifyCfg { - fn run_on_mir(&mut self, mir: &mut Mir<'tcx>) { +impl MirPass for SimplifyCfg { + fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, _: &::rustc::middle::ty::ctxt<'tcx>) { let mut changed = true; while changed { changed = self.simplify_branches(mir);