1
Fork 0

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

View file

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

View file

@ -980,6 +980,25 @@ fn report(tcx: TyCtxt, ecx: &EvalContext, e: EvalError) {
err.emit(); 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. // TODO(solson): Upstream these methods into rustc::ty::layout.
trait IntegerExt { trait IntegerExt {

View file

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

View file

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

View file

@ -1,5 +1,5 @@
fn main() { fn main() {
let v: Vec<u8> = vec![1, 2]; 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); panic!("this should never print: {}", x);
} }