extern crate miri;
extern crate rustc;
extern crate rustc_driver;
+extern crate rustc_interface;
extern crate test;
use self::miri::eval_main;
-use self::rustc_driver::{driver, Compilation};
-use std::cell::RefCell;
-use std::rc::Rc;
+use rustc::hir::def_id::LOCAL_CRATE;
+use rustc_interface::interface;
+use rustc_driver::Compilation;
use crate::test::Bencher;
-pub struct MiriCompilerCalls<'a>(Rc<RefCell<&'a mut Bencher>>);
+struct MiriCompilerCalls<'a> {
+ bencher: &'a mut Bencher,
+}
+
+impl rustc_driver::Callbacks for MiriCompilerCalls<'_> {
+ fn after_analysis(&mut self, compiler: &interface::Compiler) -> Compilation {
+ compiler.session().abort_if_errors();
+
+ compiler.global_ctxt().unwrap().peek_mut().enter(|tcx| {
+ let (entry_def_id, _) = tcx.entry_fn(LOCAL_CRATE).expect(
+ "no main or start function found",
+ );
+
+ self.bencher.iter(|| {
+ let config = miri::MiriConfig { validate: true, args: vec![], seed: None };
+ eval_main(tcx, entry_def_id, config);
+ });
+ });
+
+ compiler.session().abort_if_errors();
+
+ Compilation::Stop
+ }
+}
fn find_sysroot() -> String {
// Taken from https://github.com/Manishearth/rust-clippy/pull/911.
"--sysroot".to_string(),
find_sysroot(),
];
- let bencher = RefCell::new(bencher);
-
- let mut control = driver::CompileController::basic();
-
- control.after_analysis.stop = Compilation::Stop;
- control.after_analysis.callback = Box::new(move |state| {
- state.session.abort_if_errors();
-
- let tcx = state.tcx.unwrap();
- let (entry_node_id, _, _) = state.session.entry_fn.borrow().expect(
- "no main or start function found",
- );
- let entry_def_id = tcx.hir().local_def_id(entry_node_id);
-
- bencher.borrow_mut().iter(|| {
- eval_main(tcx, entry_def_id, false);
- });
-
- state.session.abort_if_errors();
- });
-
- rustc_driver::run_compiler(args, Box::new(control), None, None);
+ rustc_driver::run_compiler(args, &mut MiriCompilerCalls { bencher }, None, None).unwrap()
}