Move initialize_checked_jobserver.

Currently it's a method on `EarlyDiagCtxt`, which is not the right place
for it at all -- `EarlyDiagCtxt` is used to issue diagnostics, but
shouldn't be doing any of the actual checking.

This commit moves it into a standalone function that takes an
`EarlyDiagCtxt` as an argument, which is more sensible. This does
require adding `EarlyDiagCtxt::early_struct_warn`, so a warning can be
returned and then modified with a note. (And that likely explains why
somebody put `initialize_checked_jobserver` into `EarlyDiagCtxt` in the
first place.)
This commit is contained in:
Nicholas Nethercote 2024-03-21 14:54:24 +11:00
parent 62c32aeeab
commit 9b0ced000a
3 changed files with 20 additions and 13 deletions

View File

@ -5,6 +5,7 @@
use rustc_codegen_ssa::traits::CodegenBackend; use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_data_structures::defer; use rustc_data_structures::defer;
use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_data_structures::jobserver;
use rustc_data_structures::stable_hasher::StableHasher; use rustc_data_structures::stable_hasher::StableHasher;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use rustc_errors::registry::Registry; use rustc_errors::registry::Registry;
@ -323,6 +324,18 @@ pub struct Config {
pub expanded_args: Vec<String>, pub expanded_args: Vec<String>,
} }
/// Initialize jobserver before getting `jobserver::client` and `build_session`.
pub(crate) fn initialize_checked_jobserver(early_dcx: &EarlyDiagCtxt) {
jobserver::initialize_checked(|err| {
#[allow(rustc::untranslatable_diagnostic)]
#[allow(rustc::diagnostic_outside_of_impl)]
early_dcx
.early_struct_warn(err)
.with_note("the build environment is likely misconfigured")
.emit()
});
}
// JUSTIFICATION: before session exists, only config // JUSTIFICATION: before session exists, only config
#[allow(rustc::bad_opt_access)] #[allow(rustc::bad_opt_access)]
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable #[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
@ -334,7 +347,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
// Check jobserver before run_in_thread_pool_with_globals, which call jobserver::acquire_thread // Check jobserver before run_in_thread_pool_with_globals, which call jobserver::acquire_thread
let early_dcx = EarlyDiagCtxt::new(config.opts.error_format); let early_dcx = EarlyDiagCtxt::new(config.opts.error_format);
early_dcx.initialize_checked_jobserver(); initialize_checked_jobserver(&early_dcx);
crate::callbacks::setup_callbacks(); crate::callbacks::setup_callbacks();

View File

@ -1,5 +1,5 @@
#![allow(rustc::bad_opt_access)] #![allow(rustc::bad_opt_access)]
use crate::interface::parse_cfg; use crate::interface::{initialize_checked_jobserver, parse_cfg};
use rustc_data_structures::profiling::TimePassesFormat; use rustc_data_structures::profiling::TimePassesFormat;
use rustc_errors::{emitter::HumanReadableErrorType, registry, ColorConfig}; use rustc_errors::{emitter::HumanReadableErrorType, registry, ColorConfig};
use rustc_session::config::{ use rustc_session::config::{
@ -31,7 +31,7 @@ fn sess_and_cfg<F>(args: &[&'static str], f: F)
F: FnOnce(Session, Cfg), F: FnOnce(Session, Cfg),
{ {
let mut early_dcx = EarlyDiagCtxt::new(ErrorOutputType::default()); let mut early_dcx = EarlyDiagCtxt::new(ErrorOutputType::default());
early_dcx.initialize_checked_jobserver(); initialize_checked_jobserver(&early_dcx);
let matches = optgroups().parse(args).unwrap(); let matches = optgroups().parse(args).unwrap();
let sessopts = build_session_options(&mut early_dcx, &matches); let sessopts = build_session_options(&mut early_dcx, &matches);

View File

@ -1397,16 +1397,10 @@ pub fn early_warn(&self, msg: impl Into<DiagMessage>) {
self.dcx.warn(msg) self.dcx.warn(msg)
} }
pub fn initialize_checked_jobserver(&self) { #[allow(rustc::untranslatable_diagnostic)]
// initialize jobserver before getting `jobserver::client` and `build_session`. #[allow(rustc::diagnostic_outside_of_impl)]
jobserver::initialize_checked(|err| { pub fn early_struct_warn(&self, msg: impl Into<DiagMessage>) -> Diag<'_, ()> {
#[allow(rustc::untranslatable_diagnostic)] self.dcx.struct_warn(msg)
#[allow(rustc::diagnostic_outside_of_impl)]
self.dcx
.struct_warn(err)
.with_note("the build environment is likely misconfigured")
.emit()
});
} }
} }