diff --git a/benches/helpers/miri_helper.rs b/benches/helpers/miri_helper.rs index c8ae22e1ace..cdd1412204f 100644 --- a/benches/helpers/miri_helper.rs +++ b/benches/helpers/miri_helper.rs @@ -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(); }); diff --git a/src/bin/miri.rs b/src/bin/miri.rs index 6a9ad5ce838..4340729d7e0 100644 --- a/src/bin/miri.rs +++ b/src/bin/miri.rs @@ -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(); }); diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index dd352cc2410..a572c9b2c70 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -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 { diff --git a/src/lib.rs b/src/lib.rs index 83a1aeec68b..46bca86e5c5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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::{ diff --git a/tests/compile-fail/execute_memory.rs b/tests/compile-fail/execute_memory.rs index 413c6602114..054f91b3cf9 100644 --- a/tests/compile-fail/execute_memory.rs +++ b/tests/compile-fail/execute_memory.rs @@ -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::, fn()>(x); f() diff --git a/tests/compile-fail/out_of_bounds_read.rs b/tests/compile-fail/out_of_bounds_read.rs index 3e9e87cdc6c..fef6ff66c30 100644 --- a/tests/compile-fail/out_of_bounds_read.rs +++ b/tests/compile-fail/out_of_bounds_read.rs @@ -1,5 +1,5 @@ fn main() { let v: Vec = 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); }