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