Run Mir passes (copied from rustc pre-trans).
This commit is contained in:
parent
756d73b3ca
commit
64eca52ad3
@ -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();
|
||||
});
|
||||
|
@ -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();
|
||||
});
|
||||
|
@ -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 {
|
||||
|
@ -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::{
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user