Add option to pass a custom codegen backend from a driver
This commit is contained in:
parent
956e06c6c8
commit
71bc62b9f6
8 changed files with 37 additions and 5 deletions
|
@ -141,6 +141,9 @@ pub fn run_compiler(
|
||||||
callbacks: &mut (dyn Callbacks + Send),
|
callbacks: &mut (dyn Callbacks + Send),
|
||||||
file_loader: Option<Box<dyn FileLoader + Send + Sync>>,
|
file_loader: Option<Box<dyn FileLoader + Send + Sync>>,
|
||||||
emitter: Option<Box<dyn Write + Send>>,
|
emitter: Option<Box<dyn Write + Send>>,
|
||||||
|
make_codegen_backend: Option<
|
||||||
|
Box<dyn FnOnce(&config::Options) -> Box<dyn CodegenBackend> + Send>,
|
||||||
|
>,
|
||||||
) -> interface::Result<()> {
|
) -> interface::Result<()> {
|
||||||
let mut args = Vec::new();
|
let mut args = Vec::new();
|
||||||
for arg in at_args {
|
for arg in at_args {
|
||||||
|
@ -162,6 +165,11 @@ pub fn run_compiler(
|
||||||
let sopts = config::build_session_options(&matches);
|
let sopts = config::build_session_options(&matches);
|
||||||
let cfg = interface::parse_cfgspecs(matches.opt_strs("cfg"));
|
let cfg = interface::parse_cfgspecs(matches.opt_strs("cfg"));
|
||||||
|
|
||||||
|
// We wrap `make_codegen_backend` in another `Option` such that `dummy_config` can take
|
||||||
|
// ownership of it when necessary, while also allowing the non-dummy config to take ownership
|
||||||
|
// when `dummy_config` is not used.
|
||||||
|
let mut make_codegen_backend = Some(make_codegen_backend);
|
||||||
|
|
||||||
let mut dummy_config = |sopts, cfg, diagnostic_output| {
|
let mut dummy_config = |sopts, cfg, diagnostic_output| {
|
||||||
let mut config = interface::Config {
|
let mut config = interface::Config {
|
||||||
opts: sopts,
|
opts: sopts,
|
||||||
|
@ -177,6 +185,7 @@ pub fn run_compiler(
|
||||||
lint_caps: Default::default(),
|
lint_caps: Default::default(),
|
||||||
register_lints: None,
|
register_lints: None,
|
||||||
override_queries: None,
|
override_queries: None,
|
||||||
|
make_codegen_backend: make_codegen_backend.take().unwrap(),
|
||||||
registry: diagnostics_registry(),
|
registry: diagnostics_registry(),
|
||||||
};
|
};
|
||||||
callbacks.config(&mut config);
|
callbacks.config(&mut config);
|
||||||
|
@ -253,6 +262,7 @@ pub fn run_compiler(
|
||||||
lint_caps: Default::default(),
|
lint_caps: Default::default(),
|
||||||
register_lints: None,
|
register_lints: None,
|
||||||
override_queries: None,
|
override_queries: None,
|
||||||
|
make_codegen_backend: make_codegen_backend.unwrap(),
|
||||||
registry: diagnostics_registry(),
|
registry: diagnostics_registry(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1265,7 +1275,7 @@ pub fn main() -> ! {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
run_compiler(&args, &mut callbacks, None, None)
|
run_compiler(&args, &mut callbacks, None, None, None)
|
||||||
});
|
});
|
||||||
// The extra `\t` is necessary to align this label with the others.
|
// The extra `\t` is necessary to align this label with the others.
|
||||||
print_time_passes_entry(callbacks.time_passes, "\ttotal", start.elapsed());
|
print_time_passes_entry(callbacks.time_passes, "\ttotal", start.elapsed());
|
||||||
|
|
|
@ -154,6 +154,10 @@ pub struct Config {
|
||||||
pub override_queries:
|
pub override_queries:
|
||||||
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::Providers)>,
|
Option<fn(&Session, &mut ty::query::Providers, &mut ty::query::Providers)>,
|
||||||
|
|
||||||
|
/// This is a callback from the driver that is called to create a codegen backend.
|
||||||
|
pub make_codegen_backend:
|
||||||
|
Option<Box<dyn FnOnce(&config::Options) -> Box<dyn CodegenBackend> + Send>>,
|
||||||
|
|
||||||
/// Registry of diagnostics codes.
|
/// Registry of diagnostics codes.
|
||||||
pub registry: Registry,
|
pub registry: Registry,
|
||||||
}
|
}
|
||||||
|
@ -167,6 +171,7 @@ pub fn create_compiler_and_run<R>(config: Config, f: impl FnOnce(&Compiler) -> R
|
||||||
config.file_loader,
|
config.file_loader,
|
||||||
config.input_path.clone(),
|
config.input_path.clone(),
|
||||||
config.lint_caps,
|
config.lint_caps,
|
||||||
|
config.make_codegen_backend,
|
||||||
registry.clone(),
|
registry.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -63,9 +63,17 @@ pub fn create_session(
|
||||||
file_loader: Option<Box<dyn FileLoader + Send + Sync + 'static>>,
|
file_loader: Option<Box<dyn FileLoader + Send + Sync + 'static>>,
|
||||||
input_path: Option<PathBuf>,
|
input_path: Option<PathBuf>,
|
||||||
lint_caps: FxHashMap<lint::LintId, lint::Level>,
|
lint_caps: FxHashMap<lint::LintId, lint::Level>,
|
||||||
|
make_codegen_backend: Option<
|
||||||
|
Box<dyn FnOnce(&config::Options) -> Box<dyn CodegenBackend> + Send>,
|
||||||
|
>,
|
||||||
descriptions: Registry,
|
descriptions: Registry,
|
||||||
) -> (Lrc<Session>, Lrc<Box<dyn CodegenBackend>>) {
|
) -> (Lrc<Session>, Lrc<Box<dyn CodegenBackend>>) {
|
||||||
let codegen_backend = get_codegen_backend(&sopts);
|
let codegen_backend = if let Some(make_codegen_backend) = make_codegen_backend {
|
||||||
|
make_codegen_backend(&sopts)
|
||||||
|
} else {
|
||||||
|
get_codegen_backend(&sopts)
|
||||||
|
};
|
||||||
|
|
||||||
// target_override is documented to be called before init(), so this is okay
|
// target_override is documented to be called before init(), so this is okay
|
||||||
let target_override = codegen_backend.target_override(&sopts);
|
let target_override = codegen_backend.target_override(&sopts);
|
||||||
|
|
||||||
|
|
|
@ -419,6 +419,7 @@ pub fn run_core(
|
||||||
(rustc_interface::DEFAULT_QUERY_PROVIDERS.typeck)(tcx, def_id)
|
(rustc_interface::DEFAULT_QUERY_PROVIDERS.typeck)(tcx, def_id)
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
|
make_codegen_backend: None,
|
||||||
registry: rustc_driver::diagnostics_registry(),
|
registry: rustc_driver::diagnostics_registry(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,7 @@ pub fn run(options: Options) -> Result<(), ErrorReported> {
|
||||||
lint_caps,
|
lint_caps,
|
||||||
register_lints: None,
|
register_lints: None,
|
||||||
override_queries: None,
|
override_queries: None,
|
||||||
|
make_codegen_backend: None,
|
||||||
registry: rustc_driver::diagnostics_registry(),
|
registry: rustc_driver::diagnostics_registry(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
|
||||||
lint_caps: Default::default(),
|
lint_caps: Default::default(),
|
||||||
register_lints: None,
|
register_lints: None,
|
||||||
override_queries: None,
|
override_queries: None,
|
||||||
|
make_codegen_backend: None,
|
||||||
registry: rustc_driver::diagnostics_registry(),
|
registry: rustc_driver::diagnostics_registry(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,13 @@ fn main() {
|
||||||
let mut count = 1;
|
let mut count = 1;
|
||||||
let args = vec!["compiler-calls".to_string(), "foo.rs".to_string()];
|
let args = vec!["compiler-calls".to_string(), "foo.rs".to_string()];
|
||||||
rustc_driver::catch_fatal_errors(|| {
|
rustc_driver::catch_fatal_errors(|| {
|
||||||
rustc_driver::run_compiler(&args, &mut TestCalls { count: &mut count }, None, None).ok();
|
rustc_driver::run_compiler(
|
||||||
|
&args,
|
||||||
|
&mut TestCalls { count: &mut count },
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
).ok();
|
||||||
}).ok();
|
}).ok();
|
||||||
assert_eq!(count, 2);
|
assert_eq!(count, 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,7 +357,7 @@ pub fn main() {
|
||||||
args.extend(vec!["--sysroot".into(), sys_root]);
|
args.extend(vec!["--sysroot".into(), sys_root]);
|
||||||
};
|
};
|
||||||
|
|
||||||
return rustc_driver::run_compiler(&args, &mut DefaultCallbacks, None, None);
|
return rustc_driver::run_compiler(&args, &mut DefaultCallbacks, None, None, None);
|
||||||
}
|
}
|
||||||
|
|
||||||
if orig_args.iter().any(|a| a == "--version" || a == "-V") {
|
if orig_args.iter().any(|a| a == "--version" || a == "-V") {
|
||||||
|
@ -420,6 +420,6 @@ pub fn main() {
|
||||||
let mut default = DefaultCallbacks;
|
let mut default = DefaultCallbacks;
|
||||||
let callbacks: &mut (dyn rustc_driver::Callbacks + Send) =
|
let callbacks: &mut (dyn rustc_driver::Callbacks + Send) =
|
||||||
if clippy_enabled { &mut clippy } else { &mut default };
|
if clippy_enabled { &mut clippy } else { &mut default };
|
||||||
rustc_driver::run_compiler(&args, callbacks, None, None)
|
rustc_driver::run_compiler(&args, callbacks, None, None, None)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue