refactor MirPass
to always require a tcx
This commit is contained in:
parent
41c892f5e1
commit
030b237476
6 changed files with 36 additions and 22 deletions
|
@ -126,6 +126,7 @@ pub mod mir {
|
||||||
pub mod repr;
|
pub mod repr;
|
||||||
pub mod tcx;
|
pub mod tcx;
|
||||||
pub mod visit;
|
pub mod visit;
|
||||||
|
pub mod transform;
|
||||||
pub mod mir_map;
|
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 build;
|
||||||
use graphviz;
|
use graphviz;
|
||||||
use pretty;
|
use pretty;
|
||||||
use transform::{simplify_cfg, MirPass};
|
use transform::simplify_cfg;
|
||||||
use rustc::dep_graph::DepNode;
|
use rustc::dep_graph::DepNode;
|
||||||
use rustc::mir::repr::Mir;
|
use rustc::mir::repr::Mir;
|
||||||
use hair::cx::Cx;
|
use hair::cx::Cx;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
|
||||||
|
use rustc::mir::transform::MirPass;
|
||||||
use rustc::mir::mir_map::MirMap;
|
use rustc::mir::mir_map::MirMap;
|
||||||
use rustc::middle::infer;
|
use rustc::middle::infer;
|
||||||
use rustc::middle::region::CodeExtentData;
|
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) {
|
match build_mir(Cx::new(&infcx), implicit_arg_tys, id, span, decl, body) {
|
||||||
Ok(mut mir) => {
|
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
|
let meta_item_list = self.attr
|
||||||
.iter()
|
.iter()
|
||||||
|
|
|
@ -15,24 +15,26 @@
|
||||||
use rustc::middle::ty;
|
use rustc::middle::ty;
|
||||||
use rustc::mir::repr::*;
|
use rustc::mir::repr::*;
|
||||||
use rustc::mir::visit::MutVisitor;
|
use rustc::mir::visit::MutVisitor;
|
||||||
use transform::MirPass;
|
|
||||||
use rustc::mir::mir_map::MirMap;
|
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>) {
|
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 {
|
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>,
|
tcx: &'a ty::ctxt<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> EraseRegions<'a, 'tcx> {
|
impl<'a, 'tcx> EraseRegionsVisitor<'a, 'tcx> {
|
||||||
pub fn new(tcx: &'a ty::ctxt<'tcx>) -> EraseRegions<'a, 'tcx> {
|
pub fn new(tcx: &'a ty::ctxt<'tcx>) -> Self {
|
||||||
EraseRegions {
|
EraseRegionsVisitor {
|
||||||
tcx: tcx
|
tcx: tcx
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,13 +58,13 @@ impl<'a, 'tcx> EraseRegions<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> MirPass<'tcx> for EraseRegions<'a, 'tcx> {
|
impl MirPass for EraseRegions {
|
||||||
fn run_on_mir(&mut self, mir: &mut Mir<'tcx>) {
|
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, tcx: &ty::ctxt<'tcx>) {
|
||||||
self.visit_mir(mir);
|
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>) {
|
fn visit_mir(&mut self, mir: &mut Mir<'tcx>) {
|
||||||
self.erase_regions_return_ty(&mut mir.return_ty);
|
self.erase_regions_return_ty(&mut mir.return_ty);
|
||||||
self.erase_regions_tys(mir.var_decls.iter_mut().map(|d| &mut d.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 simplify_cfg;
|
||||||
pub mod erase_regions;
|
pub mod erase_regions;
|
||||||
mod util;
|
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::middle::const_eval::ConstVal;
|
||||||
use rustc::mir::repr::*;
|
use rustc::mir::repr::*;
|
||||||
use transform::util;
|
use transform::util;
|
||||||
use transform::MirPass;
|
use rustc::mir::transform::MirPass;
|
||||||
|
|
||||||
pub struct SimplifyCfg;
|
pub struct SimplifyCfg;
|
||||||
|
|
||||||
|
@ -118,8 +118,8 @@ impl SimplifyCfg {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'tcx> MirPass<'tcx> for SimplifyCfg {
|
impl MirPass for SimplifyCfg {
|
||||||
fn run_on_mir(&mut self, mir: &mut Mir<'tcx>) {
|
fn run_on_mir<'tcx>(&mut self, mir: &mut Mir<'tcx>, _: &::rustc::middle::ty::ctxt<'tcx>) {
|
||||||
let mut changed = true;
|
let mut changed = true;
|
||||||
while changed {
|
while changed {
|
||||||
changed = self.simplify_branches(mir);
|
changed = self.simplify_branches(mir);
|
||||||
|
|
Loading…
Add table
Reference in a new issue