1
Fork 0

Allow codegen backends to opt-out of parallel codegen

This commit is contained in:
Maybe Waffle 2024-02-15 00:23:56 +00:00
parent 9a77ec98b8
commit f368922cfa
2 changed files with 14 additions and 2 deletions

View file

@ -369,6 +369,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> {
@ -1129,6 +1133,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.
@ -1399,7 +1404,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_backend { if cgcx.parallel {
helper.request_token(); helper.request_token();
} }
} }
@ -1522,7 +1527,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_backend { if cgcx.parallel {
helper.request_token(); helper.request_token();
} }
assert_eq!(main_thread_state, MainThreadState::Codegenning); assert_eq!(main_thread_state, MainThreadState::Codegenning);

View file

@ -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: