Run Mir passes (copied from rustc pre-trans).

This commit is contained in:
Scott Olson 2016-06-30 21:33:24 -06:00
parent 756d73b3ca
commit 64eca52ad3
6 changed files with 36 additions and 8 deletions

View File

@ -4,8 +4,9 @@ extern crate rustc;
extern crate rustc_driver;
extern crate test;
use self::miri::eval_main;
use self::miri::{eval_main, run_mir_passes};
use self::rustc::session::Session;
use self::rustc::mir::mir_map::MirMap;
use self::rustc_driver::{driver, CompilerCalls, Compilation};
use std::cell::RefCell;
use std::rc::Rc;
@ -55,7 +56,9 @@ impl<'a> CompilerCalls<'a> for MiriCompilerCalls<'a> {
let (node_id, _) = state.session.entry_fn.borrow()
.expect("no main or start function found");
bencher.borrow_mut().iter(|| { eval_main(tcx, mir_map, node_id); });
let mut mir_map = MirMap { map: mir_map.map.clone() };
run_mir_passes(tcx, &mut mir_map);
bencher.borrow_mut().iter(|| { eval_main(tcx, &mir_map, node_id); });
state.session.abort_if_errors();
});

View File

@ -9,8 +9,9 @@ extern crate log_settings;
extern crate syntax;
#[macro_use] extern crate log;
use miri::eval_main;
use miri::{eval_main, run_mir_passes};
use rustc::session::Session;
use rustc::mir::mir_map::MirMap;
use rustc_driver::{driver, CompilerCalls, Compilation};
struct MiriCompilerCalls;
@ -31,7 +32,10 @@ impl<'a> CompilerCalls<'a> for MiriCompilerCalls {
let mir_map = state.mir_map.unwrap();
let (node_id, _) = state.session.entry_fn.borrow()
.expect("no main or start function found");
eval_main(tcx, mir_map, node_id);
let mut mir_map = MirMap { map: mir_map.map.clone() };
run_mir_passes(tcx, &mut mir_map);
eval_main(tcx, &mir_map, node_id);
state.session.abort_if_errors();
});

View File

@ -980,6 +980,25 @@ fn report(tcx: TyCtxt, ecx: &EvalContext, e: EvalError) {
err.emit();
}
pub fn run_mir_passes<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, mir_map: &mut MirMap<'tcx>) {
let mut passes = ::rustc::mir::transform::Passes::new();
passes.push_hook(Box::new(::rustc_mir::transform::dump_mir::DumpMir));
passes.push_pass(Box::new(::rustc_mir::transform::no_landing_pads::NoLandingPads));
passes.push_pass(Box::new(::rustc_mir::transform::simplify_cfg::SimplifyCfg::new("no-landing-pads")));
passes.push_pass(Box::new(::rustc_mir::transform::erase_regions::EraseRegions));
passes.push_pass(Box::new(::rustc_mir::transform::add_call_guards::AddCallGuards));
passes.push_pass(Box::new(::rustc_borrowck::ElaborateDrops));
passes.push_pass(Box::new(::rustc_mir::transform::no_landing_pads::NoLandingPads));
passes.push_pass(Box::new(::rustc_mir::transform::simplify_cfg::SimplifyCfg::new("elaborate-drops")));
passes.push_pass(Box::new(::rustc_mir::transform::add_call_guards::AddCallGuards));
passes.push_pass(Box::new(::rustc_mir::transform::dump_mir::Marker("PreMiri")));
passes.run_passes(tcx, mir_map);
}
// TODO(solson): Upstream these methods into rustc::ty::layout.
trait IntegerExt {

View File

@ -9,6 +9,7 @@
// From rustc.
#[macro_use] extern crate rustc;
extern crate rustc_borrowck;
extern crate rustc_data_structures;
extern crate rustc_mir;
extern crate rustc_trans;
@ -35,6 +36,7 @@ pub use interpreter::{
EvalContext,
Frame,
eval_main,
run_mir_passes,
};
pub use memory::{

View File

@ -1,8 +1,8 @@
#![feature(box_syntax)]
fn main() {
//FIXME: this span is wrong
let x = box 42; //~ ERROR: tried to treat a memory pointer as a function pointer
// FIXME: This span is wrong.
fn main() { //~ ERROR: tried to treat a memory pointer as a function pointer
let x = box 42;
unsafe {
let f = std::mem::transmute::<Box<i32>, fn()>(x);
f()

View File

@ -1,5 +1,5 @@
fn main() {
let v: Vec<u8> = vec![1, 2];
let x = unsafe { *v.get_unchecked(5) }; //~ ERROR: memory access of 5..6 outside bounds of allocation 29 which has size 2
let x = unsafe { *v.get_unchecked(5) }; //~ ERROR: memory access of 5..6 outside bounds of allocation 31 which has size 2
panic!("this should never print: {}", x);
}