1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#![feature(rustc_private)]
extern crate rustc_driver;
extern crate rustc_interface;
use corpus_extractor::{analyse, override_queries, save_cfg_configuration};
use rustc_driver::Compilation;
use rustc_interface::{
interface::{Compiler, Config},
Queries,
};
use std::process;
struct CorpusCallbacks {}
impl rustc_driver::Callbacks for CorpusCallbacks {
fn config(&mut self, config: &mut Config) {
save_cfg_configuration(&config.crate_cfg);
config.override_queries = Some(override_queries);
}
fn after_analysis<'tcx>(
&mut self,
compiler: &Compiler,
queries: &'tcx Queries<'tcx>,
) -> Compilation {
analyse(compiler, queries);
Compilation::Continue
}
}
fn main() {
rustc_driver::init_rustc_env_logger();
let mut callbacks = CorpusCallbacks {};
let exit_code = rustc_driver::catch_with_exit_code(|| {
use std::env;
let mut is_color_arg = false;
let mut args = env::args()
.filter(|arg| {
if arg == "--color" {
is_color_arg = true;
false
} else if is_color_arg {
is_color_arg = false;
false
} else {
true
}
})
.collect::<Vec<_>>();
args.push("--sysroot".to_owned());
args.push(std::env::var("SYSROOT").expect("Please specify the SYSROOT env variable."));
args.splice(
1..1,
[
"-Zalways-encode-mir",
"-Zmir-opt-level=0",
"-Cdebug-assertions=on",
]
.iter()
.map(ToString::to_string),
);
rustc_driver::RunCompiler::new(&args, &mut callbacks).run()
});
process::exit(exit_code);
}