Skip to content

Commit 21f4c07

Browse files
committed
Remove BoxedResolver
1 parent 43a5cc3 commit 21f4c07

File tree

3 files changed

+18
-102
lines changed

3 files changed

+18
-102
lines changed

compiler/rustc_interface/src/interface.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
pub use crate::passes::BoxedResolver;
21
use crate::util;
32

43
use rustc_ast::token;

compiler/rustc_interface/src/passes.rs

Lines changed: 2 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_a
2323
use rustc_passes::{self, hir_stats, layout_test};
2424
use rustc_plugin_impl as plugin;
2525
use rustc_query_impl::{OnDiskCache, Queries as TcxQueries};
26-
use rustc_resolve::{Resolver, ResolverArenas};
26+
use rustc_resolve::Resolver;
2727
use rustc_session::config::{CrateType, Input, OutputFilenames, OutputType};
28-
use rustc_session::cstore::{CrateStoreDyn, MetadataLoader, MetadataLoaderDyn, Untracked};
28+
use rustc_session::cstore::{CrateStoreDyn, MetadataLoader, Untracked};
2929
use rustc_session::output::filename_for_input;
3030
use rustc_session::search_paths::PathKind;
3131
use rustc_session::{Limit, Session};
@@ -37,9 +37,7 @@ use rustc_trait_selection::traits;
3737
use std::any::Any;
3838
use std::ffi::OsString;
3939
use std::io::{self, BufWriter, Write};
40-
use std::marker::PhantomPinned;
4140
use std::path::{Path, PathBuf};
42-
use std::pin::Pin;
4341
use std::sync::{Arc, LazyLock};
4442
use std::{env, fs, iter};
4543

@@ -73,90 +71,6 @@ fn count_nodes(krate: &ast::Crate) -> usize {
7371
counter.count
7472
}
7573

76-
pub use boxed_resolver::BoxedResolver;
77-
mod boxed_resolver {
78-
use super::*;
79-
80-
pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>);
81-
82-
struct BoxedResolverInner {
83-
session: Lrc<Session>,
84-
resolver_arenas: Option<ResolverArenas<'static>>,
85-
resolver: Option<Resolver<'static, 'static>>,
86-
_pin: PhantomPinned,
87-
}
88-
89-
// Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
90-
// then resolver_arenas and session.
91-
impl Drop for BoxedResolverInner {
92-
fn drop(&mut self) {
93-
self.resolver.take();
94-
self.resolver_arenas.take();
95-
}
96-
}
97-
98-
impl BoxedResolver {
99-
pub(super) fn new(
100-
session: Lrc<Session>,
101-
make_resolver: impl for<'a, 'tcx> FnOnce(
102-
&'tcx Session,
103-
&'a ResolverArenas<'a>,
104-
) -> Resolver<'a, 'tcx>,
105-
) -> BoxedResolver {
106-
let mut boxed_resolver = Box::new(BoxedResolverInner {
107-
session,
108-
resolver_arenas: Some(Resolver::arenas()),
109-
resolver: None,
110-
_pin: PhantomPinned,
111-
});
112-
// SAFETY: `make_resolver` takes a resolver arena with an arbitrary lifetime and
113-
// returns a resolver with the same lifetime as the arena. We ensure that the arena
114-
// outlives the resolver in the drop impl and elsewhere so these transmutes are sound.
115-
unsafe {
116-
let resolver = make_resolver(
117-
std::mem::transmute::<&Session, &Session>(&boxed_resolver.session),
118-
std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>(
119-
boxed_resolver.resolver_arenas.as_ref().unwrap(),
120-
),
121-
);
122-
boxed_resolver.resolver = Some(resolver);
123-
BoxedResolver(Pin::new_unchecked(boxed_resolver))
124-
}
125-
}
126-
127-
pub fn access<F: for<'a, 'tcx> FnOnce(&mut Resolver<'a, 'tcx>) -> R, R>(
128-
&mut self,
129-
f: F,
130-
) -> R {
131-
// SAFETY: The resolver doesn't need to be pinned.
132-
let mut resolver = unsafe {
133-
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
134-
};
135-
f((&mut *resolver).as_mut().unwrap())
136-
}
137-
138-
pub fn into_outputs(mut self) -> ty::ResolverOutputs {
139-
// SAFETY: The resolver doesn't need to be pinned.
140-
let mut resolver = unsafe {
141-
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
142-
};
143-
resolver.take().unwrap().into_outputs()
144-
}
145-
}
146-
}
147-
148-
pub fn create_resolver(
149-
sess: Lrc<Session>,
150-
metadata_loader: Box<MetadataLoaderDyn>,
151-
krate: &ast::Crate,
152-
crate_name: Symbol,
153-
) -> BoxedResolver {
154-
trace!("create_resolver");
155-
BoxedResolver::new(sess, move |sess, resolver_arenas| {
156-
Resolver::new(sess, krate, crate_name, metadata_loader, resolver_arenas)
157-
})
158-
}
159-
16074
pub fn register_plugins<'a>(
16175
sess: &'a Session,
16276
metadata_loader: &'a dyn MetadataLoader,

compiler/rustc_interface/src/queries.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::errors::{FailedWritingFile, RustcErrorFatal, RustcErrorUnexpectedAnnotation};
22
use crate::interface::{Compiler, Result};
3-
use crate::passes::{self, BoxedResolver};
3+
use crate::passes;
44

55
use rustc_ast as ast;
66
use rustc_codegen_ssa::traits::CodegenBackend;
@@ -13,8 +13,9 @@ use rustc_incremental::DepGraphFuture;
1313
use rustc_lint::LintStore;
1414
use rustc_middle::arena::Arena;
1515
use rustc_middle::dep_graph::DepGraph;
16-
use rustc_middle::ty::{self, GlobalCtxt, TyCtxt};
16+
use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt};
1717
use rustc_query_impl::Queries as TcxQueries;
18+
use rustc_resolve::Resolver;
1819
use rustc_session::config::{self, OutputFilenames, OutputType};
1920
use rustc_session::{output::find_crate_name, Session};
2021
use rustc_span::symbol::sym;
@@ -87,7 +88,7 @@ pub struct Queries<'tcx> {
8788
parse: Query<ast::Crate>,
8889
crate_name: Query<Symbol>,
8990
register_plugins: Query<(ast::Crate, Lrc<LintStore>)>,
90-
expansion: Query<(Lrc<ast::Crate>, BoxedResolver, Lrc<LintStore>)>,
91+
expansion: Query<(Lrc<ast::Crate>, ResolverOutputs, Lrc<LintStore>)>,
9192
dep_graph: Query<DepGraph>,
9293
// This just points to what's in `gcx_cell`.
9394
gcx: Query<&'tcx GlobalCtxt<'tcx>>,
@@ -170,23 +171,25 @@ impl<'tcx> Queries<'tcx> {
170171

171172
pub fn expansion(
172173
&self,
173-
) -> Result<QueryResult<'_, (Lrc<ast::Crate>, BoxedResolver, Lrc<LintStore>)>> {
174+
) -> Result<QueryResult<'_, (Lrc<ast::Crate>, ResolverOutputs, Lrc<LintStore>)>> {
174175
trace!("expansion");
175176
self.expansion.compute(|| {
176177
let crate_name = *self.crate_name()?.borrow();
177178
let (krate, lint_store) = self.register_plugins()?.steal();
178179
let _timer = self.session().timer("configure_and_expand");
179180
let sess = self.session();
180-
let mut resolver = passes::create_resolver(
181-
sess.clone(),
182-
self.codegen_backend().metadata_loader(),
181+
182+
let arenas = Resolver::arenas();
183+
let mut resolver = Resolver::new(
184+
sess,
183185
&krate,
184186
crate_name,
187+
self.codegen_backend().metadata_loader(),
188+
&arenas,
185189
);
186-
let krate = resolver.access(|resolver| {
187-
passes::configure_and_expand(sess, &lint_store, krate, crate_name, resolver)
188-
})?;
189-
Ok((Lrc::new(krate), resolver, lint_store))
190+
let krate =
191+
passes::configure_and_expand(sess, &lint_store, krate, crate_name, &mut resolver)?;
192+
Ok((Lrc::new(krate), resolver.into_outputs(), lint_store))
190193
})
191194
}
192195

@@ -209,13 +212,13 @@ impl<'tcx> Queries<'tcx> {
209212
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, &'tcx GlobalCtxt<'tcx>>> {
210213
self.gcx.compute(|| {
211214
let crate_name = *self.crate_name()?.borrow();
212-
let (krate, resolver, lint_store) = self.expansion()?.steal();
215+
let (krate, resolver_outputs, lint_store) = self.expansion()?.steal();
213216

214217
let ty::ResolverOutputs {
215218
untracked,
216219
global_ctxt: untracked_resolutions,
217220
ast_lowering: untracked_resolver_for_lowering,
218-
} = resolver.into_outputs();
221+
} = resolver_outputs;
219222

220223
let gcx = passes::create_global_ctxt(
221224
self.compiler,

0 commit comments

Comments
 (0)