Skip to content

Commit 515fdbf

Browse files
authored
Rollup merge of #117475 - nnethercote:rm-create_session, r=oli-obk
Inline and remove `create_session`. Currently the parts of session initialization that happen within `rustc_interface` are split between `run_compiler` and `create_session`. This split isn't necessary and obscures what's happening. This commit merges the two functions. I think a single longer function is much clearer than splitting this code across two functions in different modules, especially when `create_session` has 13 parameters, and is misnamed (it also creates the codegen backend). The net result is 43 fewer lines of code. r? ``@oli-obk``
2 parents 6c893e6 + 587af91 commit 515fdbf

File tree

2 files changed

+54
-97
lines changed

2 files changed

+54
-97
lines changed

compiler/rustc_interface/src/interface.rs

+51-13
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ use rustc_query_system::query::print_query_stack;
1818
use rustc_session::config::{
1919
self, Cfg, CheckCfg, ExpectedValues, Input, OutFileName, OutputFilenames,
2020
};
21+
use rustc_session::filesearch::sysroot_candidates;
2122
use rustc_session::parse::ParseSess;
22-
use rustc_session::CompilerIO;
23-
use rustc_session::Session;
24-
use rustc_session::{lint, EarlyErrorHandler};
23+
use rustc_session::{lint, CompilerIO, EarlyErrorHandler, Session};
2524
use rustc_span::source_map::{FileLoader, FileName};
2625
use rustc_span::symbol::sym;
2726
use std::path::PathBuf;
@@ -398,32 +397,71 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
398397
|| {
399398
crate::callbacks::setup_callbacks();
400399

401-
let registry = &config.registry;
402-
403400
let handler = EarlyErrorHandler::new(config.opts.error_format);
404401

402+
let codegen_backend = if let Some(make_codegen_backend) = config.make_codegen_backend {
403+
make_codegen_backend(&config.opts)
404+
} else {
405+
util::get_codegen_backend(
406+
&handler,
407+
&config.opts.maybe_sysroot,
408+
config.opts.unstable_opts.codegen_backend.as_deref(),
409+
)
410+
};
411+
405412
let temps_dir = config.opts.unstable_opts.temps_dir.as_deref().map(PathBuf::from);
406-
let (mut sess, codegen_backend) = util::create_session(
413+
414+
let bundle = match rustc_errors::fluent_bundle(
415+
config.opts.maybe_sysroot.clone(),
416+
sysroot_candidates().to_vec(),
417+
config.opts.unstable_opts.translate_lang.clone(),
418+
config.opts.unstable_opts.translate_additional_ftl.as_deref(),
419+
config.opts.unstable_opts.translate_directionality_markers,
420+
) {
421+
Ok(bundle) => bundle,
422+
Err(e) => {
423+
handler.early_error(format!("failed to load fluent bundle: {e}"));
424+
}
425+
};
426+
427+
let mut locale_resources = Vec::from(config.locale_resources);
428+
locale_resources.push(codegen_backend.locale_resource());
429+
430+
// target_override is documented to be called before init(), so this is okay
431+
let target_override = codegen_backend.target_override(&config.opts);
432+
433+
let mut sess = rustc_session::build_session(
407434
&handler,
408435
config.opts,
409-
parse_cfg(&handler, config.crate_cfg),
410-
parse_check_cfg(&handler, config.crate_check_cfg),
411-
config.locale_resources,
412-
config.file_loader,
413436
CompilerIO {
414437
input: config.input,
415438
output_dir: config.output_dir,
416439
output_file: config.output_file,
417440
temps_dir,
418441
},
442+
bundle,
443+
config.registry.clone(),
444+
locale_resources,
419445
config.lint_caps,
420-
config.make_codegen_backend,
421-
registry.clone(),
446+
config.file_loader,
447+
target_override,
448+
util::rustc_version_str().unwrap_or("unknown"),
422449
config.ice_file,
423450
config.using_internal_features,
424451
config.expanded_args,
425452
);
426453

454+
codegen_backend.init(&sess);
455+
456+
let cfg = parse_cfg(&handler, config.crate_cfg);
457+
let mut cfg = config::build_configuration(&sess, cfg);
458+
util::add_configuration(&mut cfg, &mut sess, &*codegen_backend);
459+
sess.parse_sess.config = cfg;
460+
461+
let mut check_cfg = parse_check_cfg(&handler, config.crate_check_cfg);
462+
check_cfg.fill_well_known(&sess.target);
463+
sess.parse_sess.check_config = check_cfg;
464+
427465
if let Some(parse_sess_created) = config.parse_sess_created {
428466
parse_sess_created(&mut sess.parse_sess);
429467
}
@@ -444,7 +482,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
444482
rustc_span::set_source_map(compiler.sess.parse_sess.clone_source_map(), move || {
445483
let r = {
446484
let _sess_abort_error = defer(|| {
447-
compiler.sess.finish_diagnostics(registry);
485+
compiler.sess.finish_diagnostics(&config.registry);
448486
});
449487

450488
f(&compiler)

compiler/rustc_interface/src/util.rs

+3-84
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,24 @@ use info;
33
use libloading::Library;
44
use rustc_ast as ast;
55
use rustc_codegen_ssa::traits::CodegenBackend;
6-
use rustc_data_structures::fx::FxHashMap;
76
#[cfg(parallel_compiler)]
87
use rustc_data_structures::sync;
9-
use rustc_errors::registry::Registry;
108
use rustc_parse::validate_attr;
119
use rustc_session as session;
12-
use rustc_session::config::{
13-
self, Cfg, CheckCfg, CrateType, OutFileName, OutputFilenames, OutputTypes,
14-
};
10+
use rustc_session::config::{self, Cfg, CrateType, OutFileName, OutputFilenames, OutputTypes};
1511
use rustc_session::filesearch::sysroot_candidates;
1612
use rustc_session::lint::{self, BuiltinLintDiagnostics, LintBuffer};
1713
use rustc_session::{filesearch, output, Session};
1814
use rustc_span::edit_distance::find_best_match_for_name;
1915
use rustc_span::edition::Edition;
20-
use rustc_span::source_map::FileLoader;
2116
use rustc_span::symbol::{sym, Symbol};
22-
use session::{CompilerIO, EarlyErrorHandler};
17+
use session::EarlyErrorHandler;
2318
use std::env;
2419
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
2520
use std::mem;
2621
use std::path::{Path, PathBuf};
2722
use std::sync::atomic::{AtomicBool, Ordering};
28-
use std::sync::{Arc, OnceLock};
23+
use std::sync::OnceLock;
2924
use std::thread;
3025

3126
/// Function pointer type that constructs a new CodegenBackend.
@@ -52,82 +47,6 @@ pub fn add_configuration(cfg: &mut Cfg, sess: &mut Session, codegen_backend: &dy
5247
}
5348
}
5449

55-
pub fn create_session(
56-
handler: &EarlyErrorHandler,
57-
sopts: config::Options,
58-
cfg: Cfg,
59-
mut check_cfg: CheckCfg,
60-
locale_resources: &'static [&'static str],
61-
file_loader: Option<Box<dyn FileLoader + Send + Sync + 'static>>,
62-
io: CompilerIO,
63-
lint_caps: FxHashMap<lint::LintId, lint::Level>,
64-
make_codegen_backend: Option<
65-
Box<dyn FnOnce(&config::Options) -> Box<dyn CodegenBackend> + Send>,
66-
>,
67-
descriptions: Registry,
68-
ice_file: Option<PathBuf>,
69-
using_internal_features: Arc<AtomicBool>,
70-
expanded_args: Vec<String>,
71-
) -> (Session, Box<dyn CodegenBackend>) {
72-
let codegen_backend = if let Some(make_codegen_backend) = make_codegen_backend {
73-
make_codegen_backend(&sopts)
74-
} else {
75-
get_codegen_backend(
76-
handler,
77-
&sopts.maybe_sysroot,
78-
sopts.unstable_opts.codegen_backend.as_deref(),
79-
)
80-
};
81-
82-
// target_override is documented to be called before init(), so this is okay
83-
let target_override = codegen_backend.target_override(&sopts);
84-
85-
let bundle = match rustc_errors::fluent_bundle(
86-
sopts.maybe_sysroot.clone(),
87-
sysroot_candidates().to_vec(),
88-
sopts.unstable_opts.translate_lang.clone(),
89-
sopts.unstable_opts.translate_additional_ftl.as_deref(),
90-
sopts.unstable_opts.translate_directionality_markers,
91-
) {
92-
Ok(bundle) => bundle,
93-
Err(e) => {
94-
handler.early_error(format!("failed to load fluent bundle: {e}"));
95-
}
96-
};
97-
98-
let mut locale_resources = Vec::from(locale_resources);
99-
locale_resources.push(codegen_backend.locale_resource());
100-
101-
let mut sess = session::build_session(
102-
handler,
103-
sopts,
104-
io,
105-
bundle,
106-
descriptions,
107-
locale_resources,
108-
lint_caps,
109-
file_loader,
110-
target_override,
111-
rustc_version_str().unwrap_or("unknown"),
112-
ice_file,
113-
using_internal_features,
114-
expanded_args,
115-
);
116-
117-
codegen_backend.init(&sess);
118-
119-
let mut cfg = config::build_configuration(&sess, cfg);
120-
add_configuration(&mut cfg, &mut sess, &*codegen_backend);
121-
122-
check_cfg.fill_well_known(&sess.target);
123-
124-
// These configs use symbols, rather than strings.
125-
sess.parse_sess.config = cfg;
126-
sess.parse_sess.check_config = check_cfg;
127-
128-
(sess, codegen_backend)
129-
}
130-
13150
const STACK_SIZE: usize = 8 * 1024 * 1024;
13251

13352
fn get_stack_size() -> Option<usize> {

0 commit comments

Comments
 (0)