rust/benches/miri_helper.rs

49 lines
1.5 KiB
Rust

#![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<RefCell<&'a mut Bencher>>);
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
}
}