refactor MirPass to always require a tcx

This commit is contained in:
Oliver Schneider 2016-02-05 09:35:00 +01:00 committed by Oliver 'ker' Schneider
parent 41c892f5e1
commit 030b237476
6 changed files with 36 additions and 22 deletions

View File

@ -126,6 +126,7 @@ pub mod mir {
pub mod repr;
pub mod tcx;
pub mod visit;
pub mod transform;
pub mod mir_map;
}

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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>);
}

View File

@ -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()

View File

@ -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));

View File

@ -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>);
}

View File

@ -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);