@@ -24,6 +24,7 @@ use rustc_span::symbol::sym;
24
24
use rustc_span:: FileName ;
25
25
use std:: path:: PathBuf ;
26
26
use std:: result;
27
+ use std:: sync:: atomic:: AtomicPtr ;
27
28
use std:: sync:: Arc ;
28
29
29
30
pub type Result < T > = result:: Result < T , ErrorGuaranteed > ;
@@ -39,6 +40,7 @@ pub struct Compiler {
39
40
pub sess : Session ,
40
41
pub codegen_backend : Box < dyn CodegenBackend > ,
41
42
pub ( crate ) override_queries : Option < fn ( & Session , & mut Providers ) > ,
43
+ pub compiler_for_deadlock_handler : Arc < AtomicPtr < ( ) > > ,
42
44
}
43
45
44
46
/// 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
328
330
let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
329
331
early_dcx. initialize_checked_jobserver ( ) ;
330
332
333
+ let compiler_for_deadlock_handler = Arc :: < AtomicPtr < _ > > :: default ( ) ;
334
+
331
335
util:: run_in_thread_pool_with_globals (
332
336
config. opts . edition ,
333
337
config. opts . unstable_opts . threads ,
338
+ compiler_for_deadlock_handler. clone ( ) ,
334
339
|| {
335
340
crate :: callbacks:: setup_callbacks ( ) ;
336
341
337
342
let early_dcx = EarlyDiagCtxt :: new ( config. opts . error_format ) ;
338
343
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
+ } ;
348
354
349
355
let temps_dir = config. opts . unstable_opts . temps_dir . as_deref ( ) . map ( PathBuf :: from) ;
350
356
@@ -419,8 +425,12 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
419
425
}
420
426
sess. lint_store = Some ( Lrc :: new ( lint_store) ) ;
421
427
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
+ } ) ;
424
434
425
435
rustc_span:: set_source_map ( compiler. sess . parse_sess . clone_source_map ( ) , move || {
426
436
// There are two paths out of `f`.
0 commit comments