Skip to content

Commit c3522d0

Browse files
committed
Move the resolver into a query
1 parent 37e2f4f commit c3522d0

File tree

8 files changed

+54
-31
lines changed

8 files changed

+54
-31
lines changed

compiler/rustc_codegen_ssa/src/back/metadata.rs

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use rustc_target::spec::{RelocModel, Target};
3333
/// <dt>dylib</dt>
3434
/// <dd>The metadata can be found in the `.rustc` section of the shared library.</dd>
3535
/// </dl>
36+
#[derive(Debug)]
3637
pub struct DefaultMetadataLoader;
3738

3839
fn load_metadata_with(

compiler/rustc_driver_impl/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ fn run_compiler(
320320
}
321321

322322
// Make sure name resolution and macro expansion is run.
323-
queries.global_ctxt()?;
323+
queries.global_ctxt()?.enter(|tcx| tcx.resolver_for_lowering(()));
324324

325325
if callbacks.after_expansion(compiler, queries) == Compilation::Stop {
326326
return early_exit();

compiler/rustc_interface/src/passes.rs

+31-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_ast::{self as ast, visit};
88
use rustc_borrowck as mir_borrowck;
99
use rustc_codegen_ssa::traits::CodegenBackend;
1010
use rustc_data_structures::parallel;
11+
use rustc_data_structures::steal::Steal;
1112
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
1213
use rustc_errors::PResult;
1314
use rustc_expand::base::{ExtCtxt, LintStoreExpand, ResolverExpand};
@@ -172,7 +173,7 @@ impl LintStoreExpand for LintStoreExpandImpl<'_> {
172173
/// harness if one is to be provided, injection of a dependency on the
173174
/// standard library and prelude, and name resolution.
174175
#[instrument(level = "trace", skip(tcx, krate, resolver))]
175-
pub fn configure_and_expand(
176+
fn configure_and_expand(
176177
tcx: TyCtxt<'_>,
177178
mut krate: ast::Crate,
178179
resolver: &mut Resolver<'_, '_>,
@@ -564,6 +565,34 @@ fn write_out_deps(
564565
}
565566
}
566567

568+
fn resolver_for_lowering<'tcx>(
569+
tcx: TyCtxt<'tcx>,
570+
(): (),
571+
) -> &'tcx Steal<(ty::ResolverAstLowering, Lrc<ast::Crate>)> {
572+
let arenas = Resolver::arenas();
573+
let krate = tcx.crate_for_resolver(()).steal();
574+
let mut resolver = Resolver::new(
575+
tcx,
576+
&krate,
577+
tcx.crate_name(LOCAL_CRATE),
578+
tcx.metadata_loader(()).steal(),
579+
&arenas,
580+
);
581+
let krate = configure_and_expand(tcx, krate, &mut resolver);
582+
583+
// Make sure we don't mutate the cstore from here on.
584+
tcx.untracked().cstore.leak();
585+
586+
let ty::ResolverOutputs {
587+
global_ctxt: untracked_resolutions,
588+
ast_lowering: untracked_resolver_for_lowering,
589+
} = resolver.into_outputs();
590+
591+
let feed = tcx.feed_unit_query();
592+
feed.resolutions(tcx.arena.alloc(untracked_resolutions));
593+
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, Lrc::new(krate))))
594+
}
595+
567596
fn output_filenames(tcx: TyCtxt<'_>, (): ()) -> Arc<OutputFilenames> {
568597
let sess = tcx.sess;
569598
let _timer = sess.timer("prepare_outputs");
@@ -618,6 +647,7 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
618647
providers.analysis = analysis;
619648
providers.hir_crate = rustc_ast_lowering::lower_to_hir;
620649
providers.output_filenames = output_filenames;
650+
providers.resolver_for_lowering = resolver_for_lowering;
621651
proc_macro_decls::provide(providers);
622652
rustc_const_eval::provide(providers);
623653
rustc_middle::hir::provide(providers);

compiler/rustc_interface/src/queries.rs

+4-27
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@ use rustc_lint::LintStore;
1616
use rustc_metadata::creader::CStore;
1717
use rustc_middle::arena::Arena;
1818
use rustc_middle::dep_graph::DepGraph;
19-
use rustc_middle::ty::{self, GlobalCtxt, TyCtxt};
19+
use rustc_middle::ty::{GlobalCtxt, TyCtxt};
2020
use rustc_query_impl::Queries as TcxQueries;
21-
use rustc_resolve::Resolver;
2221
use rustc_session::config::{self, OutputFilenames, OutputType};
2322
use rustc_session::cstore::Untracked;
2423
use rustc_session::{output::find_crate_name, Session};
@@ -216,34 +215,12 @@ impl<'tcx> Queries<'tcx> {
216215
qcx.enter(|tcx| {
217216
let feed = tcx.feed_local_crate();
218217
feed.crate_name(crate_name);
219-
let (krate, resolver_outputs) = {
220-
let _timer = sess.timer("configure_and_expand");
221-
222-
let arenas = Resolver::arenas();
223-
let mut resolver = Resolver::new(
224-
tcx,
225-
&krate,
226-
crate_name,
227-
self.codegen_backend().metadata_loader(),
228-
&arenas,
229-
);
230-
let krate = passes::configure_and_expand(tcx, krate, &mut resolver);
231-
232-
// Make sure we don't mutate the cstore from here on.
233-
tcx.untracked().cstore.leak();
234-
(Lrc::new(krate), resolver.into_outputs())
235-
};
236-
237-
let ty::ResolverOutputs {
238-
global_ctxt: untracked_resolutions,
239-
ast_lowering: untracked_resolver_for_lowering,
240-
} = resolver_outputs;
241218

242219
let feed = tcx.feed_unit_query();
243-
feed.resolver_for_lowering(
244-
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
220+
feed.crate_for_resolver(tcx.arena.alloc(Steal::new(krate)));
221+
feed.metadata_loader(
222+
tcx.arena.alloc(Steal::new(self.codegen_backend().metadata_loader())),
245223
);
246-
feed.resolutions(tcx.arena.alloc(untracked_resolutions));
247224
feed.features_query(tcx.sess.features_untracked());
248225
});
249226
Ok(qcx)

compiler/rustc_middle/src/arena.rs

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ macro_rules! arena_types {
3535
rustc_data_structures::sync::Lrc<rustc_ast::Crate>,
3636
)>,
3737
[] output_filenames: std::sync::Arc<rustc_session::config::OutputFilenames>,
38+
[] metadata_loader: rustc_data_structures::steal::Steal<Box<rustc_session::cstore::MetadataLoaderDyn>>,
39+
[] crate_for_resolver: rustc_data_structures::steal::Steal<rustc_ast::ast::Crate>,
3840
[] resolutions: rustc_middle::ty::ResolverGlobalCtxt,
3941
[decode] unsafety_check_result: rustc_middle::mir::UnsafetyCheckResult,
4042
[decode] code_region: rustc_middle::mir::coverage::CodeRegion,

compiler/rustc_middle/src/query/mod.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ rustc_queries! {
3333
}
3434

3535
query resolver_for_lowering(_: ()) -> &'tcx Steal<(ty::ResolverAstLowering, Lrc<ast::Crate>)> {
36-
feedable
36+
eval_always
3737
no_hash
3838
desc { "getting the resolver for lowering" }
3939
}
@@ -2077,6 +2077,18 @@ rustc_queries! {
20772077
desc { "looking up enabled feature gates" }
20782078
}
20792079

2080+
query metadata_loader((): ()) -> &'tcx Steal<Box<rustc_session::cstore::MetadataLoaderDyn>> {
2081+
feedable
2082+
no_hash
2083+
desc { "raw operations for metadata file access" }
2084+
}
2085+
2086+
query crate_for_resolver((): ()) -> &'tcx Steal<rustc_ast::ast::Crate> {
2087+
feedable
2088+
no_hash
2089+
desc { "the ast before macro expansion and name resolution" }
2090+
}
2091+
20802092
/// Attempt to resolve the given `DefId` to an `Instance`, for the
20812093
/// given generics args (`SubstsRef`), returning one of:
20822094
/// * `Ok(Some(instance))` on success

compiler/rustc_session/src/cstore.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ pub enum ExternCrateSource {
200200
/// At the time of this writing, there is only one backend and one way to store
201201
/// metadata in library -- this trait just serves to decouple rustc_metadata from
202202
/// the archive reader, which depends on LLVM.
203-
pub trait MetadataLoader {
203+
pub trait MetadataLoader: std::fmt::Debug {
204204
fn get_rlib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String>;
205205
fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String>;
206206
}

tests/ui/panics/default-backtrace-ice.stderr

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ error: the compiler unexpectedly panicked. this is a bug.
1313

1414

1515
query stack during panic:
16+
#0 [resolver_for_lowering] getting the resolver for lowering
1617
end of query stack

0 commit comments

Comments
 (0)