Let backends define custom targets
Add a target_override hook that takes priority over builtin targets.
This commit is contained in:
parent
95386b656e
commit
c946c40d9d
6 changed files with 27 additions and 11 deletions
|
@ -40,6 +40,7 @@ fn mk_session(matches: getopts::Matches) -> (Session, CfgSpecs) {
|
|||
DiagnosticOutput::Default,
|
||||
Default::default(),
|
||||
None,
|
||||
None,
|
||||
);
|
||||
(sess, cfg)
|
||||
}
|
||||
|
|
|
@ -65,6 +65,10 @@ pub fn create_session(
|
|||
lint_caps: FxHashMap<lint::LintId, lint::Level>,
|
||||
descriptions: Registry,
|
||||
) -> (Lrc<Session>, Lrc<Box<dyn CodegenBackend>>) {
|
||||
let codegen_backend = get_codegen_backend(sopts.debugging_opts.codegen_backend.as_deref());
|
||||
// target_override is documented to be called before init(), so this is okay
|
||||
let target_override = codegen_backend.target_override(&sopts);
|
||||
|
||||
let mut sess = session::build_session(
|
||||
sopts,
|
||||
input_path,
|
||||
|
@ -72,9 +76,10 @@ pub fn create_session(
|
|||
diagnostic_output,
|
||||
lint_caps,
|
||||
file_loader,
|
||||
target_override,
|
||||
);
|
||||
|
||||
let codegen_backend = get_codegen_backend(&sess);
|
||||
codegen_backend.init(&sess);
|
||||
|
||||
let mut cfg = config::build_configuration(&sess, config::to_crate_config(cfg));
|
||||
add_configuration(&mut cfg, &mut sess, &*codegen_backend);
|
||||
|
@ -219,13 +224,13 @@ fn load_backend_from_dylib(path: &Path) -> fn() -> Box<dyn CodegenBackend> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_codegen_backend(sess: &Session) -> Box<dyn CodegenBackend> {
|
||||
pub fn get_codegen_backend(codegen_name: Option<&str>) -> Box<dyn CodegenBackend> {
|
||||
static INIT: Once = Once::new();
|
||||
|
||||
static mut LOAD: fn() -> Box<dyn CodegenBackend> = || unreachable!();
|
||||
|
||||
INIT.call_once(|| {
|
||||
let codegen_name = sess.opts.debugging_opts.codegen_backend.as_deref().unwrap_or("llvm");
|
||||
let codegen_name = codegen_name.unwrap_or("llvm");
|
||||
let backend = match codegen_name {
|
||||
filename if filename.contains('.') => load_backend_from_dylib(filename.as_ref()),
|
||||
codegen_name => get_builtin_codegen_backend(codegen_name),
|
||||
|
@ -235,9 +240,7 @@ pub fn get_codegen_backend(sess: &Session) -> Box<dyn CodegenBackend> {
|
|||
LOAD = backend;
|
||||
}
|
||||
});
|
||||
let backend = unsafe { LOAD() };
|
||||
backend.init(sess);
|
||||
backend
|
||||
unsafe { LOAD() }
|
||||
}
|
||||
|
||||
// This is used for rustdoc, but it uses similar machinery to codegen backend
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue