Skip to content

Commit a6b8ae5

Browse files
committed
Auto merge of #118086 - nnethercote:queries-cleanups, r=bjorn3
Queries cleanups r? `@bjorn3`
2 parents 5a9e0e8 + 971010e commit a6b8ae5

File tree

8 files changed

+47
-59
lines changed

8 files changed

+47
-59
lines changed

compiler/rustc_driver_impl/src/lib.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,8 @@ fn run_compiler(
360360
drop(default_handler);
361361

362362
interface::run_compiler(config, |compiler| {
363-
let sess = compiler.session();
364-
let codegen_backend = compiler.codegen_backend();
363+
let sess = &compiler.sess;
364+
let codegen_backend = &*compiler.codegen_backend;
365365

366366
// This implements `-Whelp`. It should be handled very early, like
367367
// `--help`/`-Zhelp`/`-Chelp`. This is the earliest it can run, because
@@ -453,8 +453,10 @@ fn run_compiler(
453453
return early_exit();
454454
}
455455

456-
let ongoing_codegen = queries.ongoing_codegen()?;
456+
let linker = queries.codegen_and_build_linker()?;
457457

458+
// This must run after monomorphization so that all generic types
459+
// have been instantiated.
458460
if sess.opts.unstable_opts.print_type_sizes {
459461
sess.code_stats.print_type_sizes();
460462
}
@@ -465,10 +467,11 @@ fn run_compiler(
465467
sess.code_stats.print_vtable_sizes(crate_name);
466468
}
467469

468-
let linker = queries.linker(ongoing_codegen)?;
469470
Ok(Some(linker))
470471
})?;
471472

473+
// Linking is done outside the `compiler.enter()` so that the
474+
// `GlobalCtxt` within `Queries` can be freed as early as possible.
472475
if let Some(linker) = linker {
473476
let _timer = sess.timer("link");
474477
linker.link(sess, codegen_backend)?
@@ -668,7 +671,7 @@ fn process_rlink(sess: &Session, compiler: &interface::Compiler) {
668671
};
669672
}
670673
};
671-
let result = compiler.codegen_backend().link(sess, codegen_results, &outputs);
674+
let result = compiler.codegen_backend.link(sess, codegen_results, &outputs);
672675
abort_on_err(result, sess);
673676
} else {
674677
sess.emit_fatal(RlinkNotAFile {})

compiler/rustc_interface/src/interface.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,12 @@ pub type Result<T> = result::Result<T, ErrorGuaranteed>;
3838
/// Can be used to run `rustc_interface` queries.
3939
/// Created by passing [`Config`] to [`run_compiler`].
4040
pub struct Compiler {
41-
sess: Session,
42-
codegen_backend: Box<dyn CodegenBackend>,
41+
pub sess: Session,
42+
pub codegen_backend: Box<dyn CodegenBackend>,
4343
pub(crate) override_queries: Option<fn(&Session, &mut Providers)>,
4444
}
4545

4646
impl Compiler {
47-
pub fn session(&self) -> &Session {
48-
&self.sess
49-
}
50-
pub fn codegen_backend(&self) -> &dyn CodegenBackend {
51-
&*self.codegen_backend
52-
}
5347
pub fn build_output_filenames(
5448
&self,
5549
sess: &Session,

compiler/rustc_interface/src/passes.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -645,10 +645,10 @@ pub fn create_global_ctxt<'tcx>(
645645
// incr. comp. yet.
646646
dep_graph.assert_ignored();
647647

648-
let sess = &compiler.session();
648+
let sess = &compiler.sess;
649649
let query_result_on_disk_cache = rustc_incremental::load_query_result_cache(sess);
650650

651-
let codegen_backend = compiler.codegen_backend();
651+
let codegen_backend = &compiler.codegen_backend;
652652
let mut providers = *DEFAULT_QUERY_PROVIDERS;
653653
codegen_backend.provide(&mut providers);
654654

compiler/rustc_interface/src/queries.rs

+27-35
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ use rustc_middle::dep_graph::DepGraph;
1717
use rustc_middle::ty::{GlobalCtxt, TyCtxt};
1818
use rustc_session::config::{self, CrateType, OutputFilenames, OutputType};
1919
use rustc_session::cstore::Untracked;
20-
use rustc_session::{output::find_crate_name, Session};
20+
use rustc_session::output::find_crate_name;
21+
use rustc_session::Session;
2122
use rustc_span::symbol::sym;
2223
use std::any::Any;
2324
use std::cell::{RefCell, RefMut};
@@ -101,25 +102,18 @@ impl<'tcx> Queries<'tcx> {
101102
}
102103
}
103104

104-
fn session(&self) -> &Session {
105-
self.compiler.session()
106-
}
107-
108-
fn codegen_backend(&self) -> &dyn CodegenBackend {
109-
self.compiler.codegen_backend()
110-
}
111-
112105
pub fn parse(&self) -> Result<QueryResult<'_, ast::Crate>> {
113-
self.parse
114-
.compute(|| passes::parse(self.session()).map_err(|mut parse_error| parse_error.emit()))
106+
self.parse.compute(|| {
107+
passes::parse(&self.compiler.sess).map_err(|mut parse_error| parse_error.emit())
108+
})
115109
}
116110

117111
#[deprecated = "pre_configure may be made private in the future. If you need it please open an issue with your use case."]
118112
pub fn pre_configure(&self) -> Result<QueryResult<'_, (ast::Crate, ast::AttrVec)>> {
119113
self.pre_configure.compute(|| {
120114
let mut krate = self.parse()?.steal();
121115

122-
let sess = self.session();
116+
let sess = &self.compiler.sess;
123117
rustc_builtin_macros::cmdline_attrs::inject(
124118
&mut krate,
125119
&sess.parse_sess,
@@ -134,7 +128,7 @@ impl<'tcx> Queries<'tcx> {
134128

135129
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, &'tcx GlobalCtxt<'tcx>>> {
136130
self.gcx.compute(|| {
137-
let sess = self.session();
131+
let sess = &self.compiler.sess;
138132
#[allow(deprecated)]
139133
let (krate, pre_configured_attrs) = self.pre_configure()?.steal();
140134

@@ -150,7 +144,7 @@ impl<'tcx> Queries<'tcx> {
150144
let dep_graph = setup_dep_graph(sess, crate_name, stable_crate_id)?;
151145

152146
let cstore = FreezeLock::new(Box::new(CStore::new(
153-
self.codegen_backend().metadata_loader(),
147+
self.compiler.codegen_backend.metadata_loader(),
154148
stable_crate_id,
155149
)) as _);
156150
let definitions = FreezeLock::new(Definitions::new(stable_crate_id));
@@ -186,22 +180,6 @@ impl<'tcx> Queries<'tcx> {
186180
})
187181
}
188182

189-
pub fn ongoing_codegen(&'tcx self) -> Result<Box<dyn Any>> {
190-
self.global_ctxt()?.enter(|tcx| {
191-
// Don't do code generation if there were any errors
192-
self.session().compile_status()?;
193-
194-
// If we have any delayed bugs, for example because we created TyKind::Error earlier,
195-
// it's likely that codegen will only cause more ICEs, obscuring the original problem
196-
self.session().diagnostic().flush_delayed();
197-
198-
// Hook for UI tests.
199-
Self::check_for_rustc_errors_attr(tcx);
200-
201-
Ok(passes::start_codegen(self.codegen_backend(), tcx))
202-
})
203-
}
204-
205183
/// Check for the `#[rustc_error]` annotation, which forces an error in codegen. This is used
206184
/// to write UI tests that actually test that compilation succeeds without reporting
207185
/// an error.
@@ -236,8 +214,20 @@ impl<'tcx> Queries<'tcx> {
236214
}
237215
}
238216

239-
pub fn linker(&'tcx self, ongoing_codegen: Box<dyn Any>) -> Result<Linker> {
217+
pub fn codegen_and_build_linker(&'tcx self) -> Result<Linker> {
240218
self.global_ctxt()?.enter(|tcx| {
219+
// Don't do code generation if there were any errors
220+
self.compiler.sess.compile_status()?;
221+
222+
// If we have any delayed bugs, for example because we created TyKind::Error earlier,
223+
// it's likely that codegen will only cause more ICEs, obscuring the original problem
224+
self.compiler.sess.diagnostic().flush_delayed();
225+
226+
// Hook for UI tests.
227+
Self::check_for_rustc_errors_attr(tcx);
228+
229+
let ongoing_codegen = passes::start_codegen(&*self.compiler.codegen_backend, tcx);
230+
241231
Ok(Linker {
242232
dep_graph: tcx.dep_graph.clone(),
243233
output_filenames: tcx.output_filenames(()).clone(),
@@ -304,6 +294,7 @@ impl Compiler {
304294
where
305295
F: for<'tcx> FnOnce(&'tcx Queries<'tcx>) -> T,
306296
{
297+
// Must declare `_timer` first so that it is dropped after `queries`.
307298
let mut _timer = None;
308299
let queries = Queries::new(self);
309300
let ret = f(&queries);
@@ -316,15 +307,16 @@ impl Compiler {
316307
// after this point, they'll show up as "<unknown>" in self-profiling data.
317308
{
318309
let _prof_timer =
319-
queries.session().prof.generic_activity("self_profile_alloc_query_strings");
310+
queries.compiler.sess.prof.generic_activity("self_profile_alloc_query_strings");
320311
gcx.enter(rustc_query_impl::alloc_self_profile_query_strings);
321312
}
322313

323-
self.session()
324-
.time("serialize_dep_graph", || gcx.enter(rustc_incremental::save_dep_graph));
314+
self.sess.time("serialize_dep_graph", || gcx.enter(rustc_incremental::save_dep_graph));
325315
}
326316

327-
_timer = Some(self.session().timer("free_global_ctxt"));
317+
// The timer's lifetime spans the dropping of `queries`, which contains
318+
// the global context.
319+
_timer = Some(self.sess.timer("free_global_ctxt"));
328320

329321
ret
330322
}

src/librustdoc/doctest.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -127,17 +127,17 @@ pub(crate) fn run(options: RustdocOptions) -> Result<(), ErrorGuaranteed> {
127127
options,
128128
false,
129129
opts,
130-
Some(compiler.session().parse_sess.clone_source_map()),
130+
Some(compiler.sess.parse_sess.clone_source_map()),
131131
None,
132132
enable_per_target_ignores,
133133
);
134134

135135
let mut hir_collector = HirCollector {
136-
sess: compiler.session(),
136+
sess: &compiler.sess,
137137
collector: &mut collector,
138138
map: tcx.hir(),
139139
codes: ErrorCodes::from(
140-
compiler.session().opts.unstable_features.is_nightly_build(),
140+
compiler.sess.opts.unstable_features.is_nightly_build(),
141141
),
142142
tcx,
143143
};
@@ -150,7 +150,7 @@ pub(crate) fn run(options: RustdocOptions) -> Result<(), ErrorGuaranteed> {
150150

151151
collector
152152
});
153-
if compiler.session().diagnostic().has_errors_or_lint_errors().is_some() {
153+
if compiler.sess.diagnostic().has_errors_or_lint_errors().is_some() {
154154
FatalError.raise();
155155
}
156156

src/librustdoc/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ fn main_args(
794794
let config = core::create_config(options, &render_options, using_internal_features);
795795

796796
interface::run_compiler(config, |compiler| {
797-
let sess = compiler.session();
797+
let sess = &compiler.sess;
798798

799799
if sess.opts.describe_lints {
800800
rustc_driver::describe_lints(sess);

tests/run-make-fulldeps/issue-19371/foo.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
6969
interface::run_compiler(config, |compiler| {
7070
let linker = compiler.enter(|queries| {
7171
queries.global_ctxt()?.enter(|tcx| tcx.analysis(()))?;
72-
let ongoing_codegen = queries.ongoing_codegen()?;
73-
queries.linker(ongoing_codegen)
72+
queries.codegen_and_build_linker()
7473
});
75-
linker.unwrap().link(compiler.session(), compiler.codegen_backend()).unwrap();
74+
linker.unwrap().link(&compiler.sess, &*compiler.codegen_backend).unwrap();
7675
});
7776
}

tests/run-make-fulldeps/obtain-borrowck/driver.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl rustc_driver::Callbacks for CompilerCalls {
6161
compiler: &Compiler,
6262
queries: &'tcx Queries<'tcx>,
6363
) -> Compilation {
64-
compiler.session().abort_if_errors();
64+
compiler.sess.abort_if_errors();
6565
queries.global_ctxt().unwrap().enter(|tcx| {
6666
// Collect definition ids of MIR bodies.
6767
let hir = tcx.hir();

0 commit comments

Comments
 (0)