refactor MirPass
to always require a tcx
This commit is contained in:
parent
41c892f5e1
commit
030b237476
@ -126,6 +126,7 @@ pub mod mir {
|
||||
pub mod repr;
|
||||
pub mod tcx;
|
||||
pub mod visit;
|
||||
pub mod transform;
|
||||
pub mod mir_map;
|
||||
}
|
||||
|
||||
|
16
src/librustc/mir/transform.rs
Normal file
16
src/librustc/mir/transform.rs
Normal 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>);
|
||||
}
|
@ -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()
|
||||
|
@ -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));
|
||||
|
@ -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>);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user