Split cgus into todo and done before the main module codegen loop

This commit is contained in:
bjorn3 2024-05-11 17:39:51 +00:00
parent 9ee010cc34
commit 50b34279c3
2 changed files with 34 additions and 46 deletions

View File

@ -78,11 +78,6 @@ pub(super) fn acquire(&mut self, dcx: &rustc_errors::DiagCtxt) -> ConcurrencyLim
} }
} }
pub(super) fn job_already_done(&mut self) {
let mut state = self.state.lock().unwrap();
state.job_already_done();
}
pub(crate) fn finished(mut self) { pub(crate) fn finished(mut self) {
self.helper_thread.take(); self.helper_thread.take();
@ -190,14 +185,6 @@ pub(super) fn job_finished(&mut self) {
self.assert_invariants(); self.assert_invariants();
} }
pub(super) fn job_already_done(&mut self) {
self.assert_invariants();
self.pending_jobs -= 1;
self.assert_invariants();
self.drop_excess_capacity();
self.assert_invariants();
}
pub(super) fn poison(&mut self, error: String) { pub(super) fn poison(&mut self, error: String) {
self.poisoned = true; self.poisoned = true;
self.stored_error = Some(error); self.stored_error = Some(error);

View File

@ -604,40 +604,41 @@ pub(crate) fn run_aot(
let global_asm_config = Arc::new(crate::global_asm::GlobalAsmConfig::new(tcx)); let global_asm_config = Arc::new(crate::global_asm::GlobalAsmConfig::new(tcx));
let mut concurrency_limiter = ConcurrencyLimiter::new(tcx.sess, cgus.len()); let (todo_cgus, done_cgus) =
cgus.into_iter().enumerate().partition::<Vec<_>, _>(|&(i, _)| match cgu_reuse[i] {
_ if backend_config.disable_incr_cache => true,
CguReuse::No => true,
CguReuse::PreLto | CguReuse::PostLto => false,
});
let modules = tcx.sess.time("codegen mono items", || { let mut concurrency_limiter = ConcurrencyLimiter::new(tcx.sess, todo_cgus.len());
cgus.iter()
.enumerate() let modules =
.map(|(i, cgu)| { tcx.sess.time("codegen mono items", || {
let cgu_reuse = todo_cgus
if backend_config.disable_incr_cache { CguReuse::No } else { cgu_reuse[i] }; .into_iter()
match cgu_reuse { .map(|(_, cgu)| {
CguReuse::No => { let dep_node = cgu.codegen_dep_node(tcx);
let dep_node = cgu.codegen_dep_node(tcx); tcx.dep_graph
tcx.dep_graph .with_task(
.with_task( dep_node,
dep_node, tcx,
tcx, (
( backend_config.clone(),
backend_config.clone(), global_asm_config.clone(),
global_asm_config.clone(), cgu.name(),
cgu.name(), concurrency_limiter.acquire(tcx.dcx()),
concurrency_limiter.acquire(tcx.dcx()), ),
), module_codegen,
module_codegen, Some(rustc_middle::dep_graph::hash_result),
Some(rustc_middle::dep_graph::hash_result), )
) .0
.0 })
} .chain(done_cgus.into_iter().map(|(_, cgu)| {
CguReuse::PreLto | CguReuse::PostLto => { OngoingModuleCodegen::Sync(reuse_workproduct_for_cgu(tcx, cgu))
concurrency_limiter.job_already_done(); }))
OngoingModuleCodegen::Sync(reuse_workproduct_for_cgu(tcx, cgu)) .collect::<Vec<_>>()
} });
}
})
.collect::<Vec<_>>()
});
let mut allocator_module = make_module(tcx.sess, &backend_config, "allocator_shim".to_string()); let mut allocator_module = make_module(tcx.sess, &backend_config, "allocator_shim".to_string());
let mut allocator_unwind_context = UnwindContext::new(allocator_module.isa(), true); let mut allocator_unwind_context = UnwindContext::new(allocator_module.isa(), true);