Skip to content

Commit

Permalink
use the FulfillmentContext and InferCtxt more correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
arielb1 committed Feb 20, 2016
1 parent a61963a commit 881249a
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 77 deletions.
10 changes: 8 additions & 2 deletions src/librustc/mir/mir_map.rs
Expand Up @@ -12,16 +12,22 @@ use util::nodemap::NodeMap;
use mir::repr::Mir;
use mir::transform::MirPass;
use middle::ty;
use middle::infer;

pub struct MirMap<'tcx> {
pub map: NodeMap<Mir<'tcx>>,
}

impl<'tcx> MirMap<'tcx> {
pub fn run_passes(&mut self, passes: &mut [Box<MirPass>], tcx: &ty::ctxt<'tcx>) {
for (_, ref mut mir) in &mut self.map {
if passes.is_empty() { return; }

for (&id, mir) in &mut self.map {
let param_env = ty::ParameterEnvironment::for_item(tcx, id);
let infcx = infer::new_infer_ctxt(tcx, &tcx.tables, Some(param_env));

for pass in &mut *passes {
pass.run_on_mir(mir, tcx)
pass.run_on_mir(mir, &infcx)
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/librustc/mir/transform.rs
Expand Up @@ -9,8 +9,8 @@
// except according to those terms.

use mir::repr::Mir;
use middle::ty::ctxt;
use middle::infer::InferCtxt;

pub trait MirPass {
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, tcx: &ctxt<'tcx>);
fn run_on_mir<'a, 'tcx>(&mut self, mir: &mut Mir<'tcx>, infcx: &InferCtxt<'a, 'tcx>);
}
8 changes: 4 additions & 4 deletions src/librustc_mir/mir_map.rs
Expand Up @@ -149,11 +149,11 @@ 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) => {
clear_dead_blocks::ClearDeadBlocks::new().run_on_mir(&mut mir, self.tcx);
type_check::TypeckMir::new(&infcx).run_on_mir(&mut mir, self.tcx);
no_landing_pads::NoLandingPads.run_on_mir(&mut mir, self.tcx);
clear_dead_blocks::ClearDeadBlocks::new().run_on_mir(&mut mir, &infcx);
type_check::TypeckMir::new().run_on_mir(&mut mir, &infcx);
no_landing_pads::NoLandingPads.run_on_mir(&mut mir, &infcx);
if self.tcx.sess.opts.mir_opt_level > 0 {
simplify_cfg::SimplifyCfg::new().run_on_mir(&mut mir, self.tcx);
simplify_cfg::SimplifyCfg::new().run_on_mir(&mut mir, &infcx);
}
let meta_item_list = self.attr
.iter()
Expand Down
5 changes: 3 additions & 2 deletions src/librustc_mir/transform/clear_dead_blocks.rs
Expand Up @@ -15,7 +15,7 @@
//! This pass does not renumber or remove the blocks, to have the
//! MIR better match the source.

use rustc::middle::ty;
use rustc::middle::infer;
use rustc::mir::repr::*;
use rustc::mir::transform::MirPass;

Expand Down Expand Up @@ -56,7 +56,8 @@ impl ClearDeadBlocks {
}

impl MirPass for ClearDeadBlocks {
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, _tcx: &ty::ctxt<'tcx>) {
fn run_on_mir<'a, 'tcx>(&mut self, mir: &mut Mir<'tcx>, _: &infer::InferCtxt<'a, 'tcx>)
{
self.clear_dead_blocks(mir);
}
}
13 changes: 1 addition & 12 deletions src/librustc_mir/transform/erase_regions.rs
Expand Up @@ -16,18 +16,13 @@ use rustc::middle::ty;
use rustc::mir::repr::*;
use rustc::mir::visit::MutVisitor;
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;

for (_, mir) in &mut mir_map.map {
eraser.run_on_mir(mir, tcx);
EraseRegionsVisitor::new(tcx).visit_mir(mir);
}
}

pub struct EraseRegions;

struct EraseRegionsVisitor<'a, 'tcx: 'a> {
tcx: &'a ty::ctxt<'tcx>,
}
Expand Down Expand Up @@ -58,12 +53,6 @@ impl<'a, 'tcx> EraseRegionsVisitor<'a, 'tcx> {
}
}

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 EraseRegionsVisitor<'a, 'tcx> {
fn visit_mir(&mut self, mir: &mut Mir<'tcx>) {
self.erase_regions_return_ty(&mut mir.return_ty);
Expand Down
7 changes: 4 additions & 3 deletions src/librustc_mir/transform/no_landing_pads.rs
Expand Up @@ -11,7 +11,7 @@
//! This pass removes the unwind branch of all the terminators when the no-landing-pads option is
//! specified.

use rustc::middle::ty;
use rustc::middle::infer;
use rustc::mir::repr::*;
use rustc::mir::visit::MutVisitor;
use rustc::mir::transform::MirPass;
Expand Down Expand Up @@ -41,8 +41,9 @@ impl<'tcx> MutVisitor<'tcx> for NoLandingPads {
}

impl MirPass for NoLandingPads {
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, tcx: &ty::ctxt<'tcx>) {
if tcx.sess.no_landing_pads() {
fn run_on_mir<'a, 'tcx>(&mut self, mir: &mut Mir<'tcx>,
infcx: &infer::InferCtxt<'a, 'tcx>) {
if infcx.tcx.sess.no_landing_pads() {
self.visit_mir(mir);
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_mir/transform/simplify_cfg.rs
Expand Up @@ -9,6 +9,7 @@
// except according to those terms.

use rustc::middle::const_eval::ConstVal;
use rustc::middle::infer;
use rustc::mir::repr::*;
use transform::util;
use rustc::mir::transform::MirPass;
Expand Down Expand Up @@ -119,7 +120,7 @@ impl SimplifyCfg {
}

impl MirPass for SimplifyCfg {
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, _: &::rustc::middle::ty::ctxt<'tcx>) {
fn run_on_mir<'a, 'tcx>(&mut self, mir: &mut Mir<'tcx>, _: &infer::InferCtxt<'a, 'tcx>) {
let mut changed = true;
while changed {
changed = self.simplify_branches(mir);
Expand Down

0 comments on commit 881249a

Please sign in to comment.