@@ -24,6 +24,7 @@ use rustc_span::symbol::sym;
2424use rustc_span:: FileName ;
2525use std:: path:: PathBuf ;
2626use std:: result;
27+ use std:: sync:: atomic:: AtomicPtr ;
2728use std:: sync:: Arc ;
2829
2930pub type Result < T > = result:: Result < T , ErrorGuaranteed > ;
@@ -39,6 +40,7 @@ pub struct Compiler {
3940 pub sess : Session ,
4041 pub codegen_backend : Box < dyn CodegenBackend > ,
4142 pub ( crate ) override_queries : Option < fn ( & Session , & mut Providers ) > ,
43+ pub compiler_for_deadlock_handler : Arc < AtomicPtr < ( ) > > ,
4244}
4345
4446/// Converts strings provided as `--cfg [cfgspec]` into a `Cfg`.
@@ -328,23 +330,27 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
328330 let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
329331 early_dcx. initialize_checked_jobserver ( ) ;
330332
333+ let compiler_for_deadlock_handler = Arc :: < AtomicPtr < _ > > :: default ( ) ;
334+
331335 util:: run_in_thread_pool_with_globals (
332336 config. opts . edition ,
333337 config. opts . unstable_opts . threads ,
338+ compiler_for_deadlock_handler. clone ( ) ,
334339 || {
335340 crate :: callbacks:: setup_callbacks ( ) ;
336341
337342 let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
338343
339- let codegen_backend = if let Some ( make_codegen_backend) = config. make_codegen_backend {
340- make_codegen_backend ( & config. opts )
341- } else {
342- util:: get_codegen_backend (
343- & early_dcx,
344- & config. opts . maybe_sysroot ,
345- config. opts . unstable_opts . codegen_backend . as_deref ( ) ,
346- )
347- } ;
344+ let codegen_backend: Box < dyn CodegenBackend > =
345+ if let Some ( make_codegen_backend) = config. make_codegen_backend {
346+ make_codegen_backend ( & config. opts )
347+ } else {
348+ util:: get_codegen_backend (
349+ & early_dcx,
350+ & config. opts . maybe_sysroot ,
351+ config. opts . unstable_opts . codegen_backend . as_deref ( ) ,
352+ )
353+ } ;
348354
349355 let temps_dir = config. opts . unstable_opts . temps_dir . as_deref ( ) . map ( PathBuf :: from) ;
350356
@@ -419,8 +425,12 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
419425 }
420426 sess. lint_store = Some ( Lrc :: new ( lint_store) ) ;
421427
422- let compiler =
423- Compiler { sess, codegen_backend, override_queries : config. override_queries } ;
428+ let compiler = Arc :: new ( Compiler {
429+ sess,
430+ codegen_backend,
431+ override_queries : config. override_queries ,
432+ compiler_for_deadlock_handler,
433+ } ) ;
424434
425435 rustc_span:: set_source_map ( compiler. sess . parse_sess . clone_source_map ( ) , move || {
426436 // There are two paths out of `f`.
0 commit comments