Rollup merge of #116791 - WaffleLapkin:unparallel-backends, r=oli-obk
Allow codegen backends to opt-out of parallel codegen This makes it a bit easier to write cursed codegen backends.
This commit is contained in:
commit
88d387b263
4 changed files with 16 additions and 4 deletions
|
@ -374,6 +374,10 @@ pub struct CodegenContext<B: WriteBackendMethods> {
|
||||||
pub incr_comp_session_dir: Option<PathBuf>,
|
pub incr_comp_session_dir: Option<PathBuf>,
|
||||||
/// Channel back to the main control thread to send messages to
|
/// Channel back to the main control thread to send messages to
|
||||||
pub coordinator_send: Sender<Box<dyn Any + Send>>,
|
pub coordinator_send: Sender<Box<dyn Any + Send>>,
|
||||||
|
/// `true` if the codegen should be run in parallel.
|
||||||
|
///
|
||||||
|
/// Depends on [`CodegenBackend::supports_parallel()`] and `-Zno_parallel_backend`.
|
||||||
|
pub parallel: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B: WriteBackendMethods> CodegenContext<B> {
|
impl<B: WriteBackendMethods> CodegenContext<B> {
|
||||||
|
@ -1152,6 +1156,7 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
||||||
target_arch: tcx.sess.target.arch.to_string(),
|
target_arch: tcx.sess.target.arch.to_string(),
|
||||||
split_debuginfo: tcx.sess.split_debuginfo(),
|
split_debuginfo: tcx.sess.split_debuginfo(),
|
||||||
split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind,
|
split_dwarf_kind: tcx.sess.opts.unstable_opts.split_dwarf_kind,
|
||||||
|
parallel: backend.supports_parallel() && !sess.opts.unstable_opts.no_parallel_backend,
|
||||||
};
|
};
|
||||||
|
|
||||||
// This is the "main loop" of parallel work happening for parallel codegen.
|
// This is the "main loop" of parallel work happening for parallel codegen.
|
||||||
|
@ -1422,7 +1427,7 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
||||||
.binary_search_by_key(&cost, |&(_, cost)| cost)
|
.binary_search_by_key(&cost, |&(_, cost)| cost)
|
||||||
.unwrap_or_else(|e| e);
|
.unwrap_or_else(|e| e);
|
||||||
work_items.insert(insertion_index, (work, cost));
|
work_items.insert(insertion_index, (work, cost));
|
||||||
if !cgcx.opts.unstable_opts.no_parallel_llvm {
|
if cgcx.parallel {
|
||||||
helper.request_token();
|
helper.request_token();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1545,7 +1550,7 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
||||||
};
|
};
|
||||||
work_items.insert(insertion_index, (llvm_work_item, cost));
|
work_items.insert(insertion_index, (llvm_work_item, cost));
|
||||||
|
|
||||||
if !cgcx.opts.unstable_opts.no_parallel_llvm {
|
if cgcx.parallel {
|
||||||
helper.request_token();
|
helper.request_token();
|
||||||
}
|
}
|
||||||
assert_eq!(main_thread_state, MainThreadState::Codegenning);
|
assert_eq!(main_thread_state, MainThreadState::Codegenning);
|
||||||
|
|
|
@ -111,6 +111,13 @@ pub trait CodegenBackend {
|
||||||
codegen_results: CodegenResults,
|
codegen_results: CodegenResults,
|
||||||
outputs: &OutputFilenames,
|
outputs: &OutputFilenames,
|
||||||
) -> Result<(), ErrorGuaranteed>;
|
) -> Result<(), ErrorGuaranteed>;
|
||||||
|
|
||||||
|
/// Returns `true` if this backend can be safely called from multiple threads.
|
||||||
|
///
|
||||||
|
/// Defaults to `true`.
|
||||||
|
fn supports_parallel(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ExtraBackendMethods:
|
pub trait ExtraBackendMethods:
|
||||||
|
|
|
@ -685,7 +685,7 @@ fn test_unstable_options_tracking_hash() {
|
||||||
untracked!(nll_facts, true);
|
untracked!(nll_facts, true);
|
||||||
untracked!(no_analysis, true);
|
untracked!(no_analysis, true);
|
||||||
untracked!(no_leak_check, true);
|
untracked!(no_leak_check, true);
|
||||||
untracked!(no_parallel_llvm, true);
|
untracked!(no_parallel_backend, true);
|
||||||
untracked!(parse_only, true);
|
untracked!(parse_only, true);
|
||||||
// `pre_link_arg` is omitted because it just forwards to `pre_link_args`.
|
// `pre_link_arg` is omitted because it just forwards to `pre_link_args`.
|
||||||
untracked!(pre_link_args, vec![String::from("abc"), String::from("def")]);
|
untracked!(pre_link_args, vec![String::from("abc"), String::from("def")]);
|
||||||
|
|
|
@ -1772,7 +1772,7 @@ options! {
|
||||||
"disable the 'leak check' for subtyping; unsound, but useful for tests"),
|
"disable the 'leak check' for subtyping; unsound, but useful for tests"),
|
||||||
no_link: bool = (false, parse_no_flag, [TRACKED],
|
no_link: bool = (false, parse_no_flag, [TRACKED],
|
||||||
"compile without linking"),
|
"compile without linking"),
|
||||||
no_parallel_llvm: bool = (false, parse_no_flag, [UNTRACKED],
|
no_parallel_backend: bool = (false, parse_no_flag, [UNTRACKED],
|
||||||
"run LLVM in non-parallel mode (while keeping codegen-units and ThinLTO)"),
|
"run LLVM in non-parallel mode (while keeping codegen-units and ThinLTO)"),
|
||||||
no_profiler_runtime: bool = (false, parse_no_flag, [TRACKED],
|
no_profiler_runtime: bool = (false, parse_no_flag, [TRACKED],
|
||||||
"prevent automatic injection of the profiler_builtins crate"),
|
"prevent automatic injection of the profiler_builtins crate"),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue