#![feature(custom_attribute, test)] #![feature(rustc_private)] #![allow(unused_attributes)] extern crate getopts; extern crate miri; extern crate rustc; extern crate rustc_driver; extern crate test; use self::miri::interpreter; use self::rustc::session::Session; use self::rustc_driver::{driver, CompilerCalls, Compilation}; use std::cell::RefCell; use std::rc::Rc; use std::env::var; use test::Bencher; pub struct MiriCompilerCalls<'a>(Rc>); pub fn run(filename: &str, bencher: &mut Bencher) { let path = var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set"); rustc_driver::run_compiler(&[ "miri".to_string(), format!("benches/{}.rs", filename), "--sysroot".to_string(), path.to_string(), ], &mut MiriCompilerCalls(Rc::new(RefCell::new(bencher)))); } impl<'a> CompilerCalls<'a> for MiriCompilerCalls<'a> { fn build_controller( &mut self, _: &Session, _: &getopts::Matches ) -> driver::CompileController<'a> { let mut control: driver::CompileController<'a> = driver::CompileController::basic(); let bencher = self.0.clone(); control.after_analysis.stop = Compilation::Stop; control.after_analysis.callback = Box::new(move |state| { state.session.abort_if_errors(); bencher.borrow_mut().iter(|| { interpreter::interpret_start_points(state.tcx.unwrap(), state.mir_map.unwrap()); }) }); control } }