mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Remove BoxedResolver
This commit is contained in:
parent
43a5cc383d
commit
21f4c0723e
@ -1,4 +1,3 @@
|
||||
pub use crate::passes::BoxedResolver;
|
||||
use crate::util;
|
||||
|
||||
use rustc_ast::token;
|
||||
|
@ -23,9 +23,9 @@ use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str, validate_a
|
||||
use rustc_passes::{self, hir_stats, layout_test};
|
||||
use rustc_plugin_impl as plugin;
|
||||
use rustc_query_impl::{OnDiskCache, Queries as TcxQueries};
|
||||
use rustc_resolve::{Resolver, ResolverArenas};
|
||||
use rustc_resolve::Resolver;
|
||||
use rustc_session::config::{CrateType, Input, OutputFilenames, OutputType};
|
||||
use rustc_session::cstore::{CrateStoreDyn, MetadataLoader, MetadataLoaderDyn, Untracked};
|
||||
use rustc_session::cstore::{CrateStoreDyn, MetadataLoader, Untracked};
|
||||
use rustc_session::output::filename_for_input;
|
||||
use rustc_session::search_paths::PathKind;
|
||||
use rustc_session::{Limit, Session};
|
||||
@ -37,9 +37,7 @@ use rustc_trait_selection::traits;
|
||||
use std::any::Any;
|
||||
use std::ffi::OsString;
|
||||
use std::io::{self, BufWriter, Write};
|
||||
use std::marker::PhantomPinned;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::pin::Pin;
|
||||
use std::sync::{Arc, LazyLock};
|
||||
use std::{env, fs, iter};
|
||||
|
||||
@ -73,90 +71,6 @@ fn count_nodes(krate: &ast::Crate) -> usize {
|
||||
counter.count
|
||||
}
|
||||
|
||||
pub use boxed_resolver::BoxedResolver;
|
||||
mod boxed_resolver {
|
||||
use super::*;
|
||||
|
||||
pub struct BoxedResolver(Pin<Box<BoxedResolverInner>>);
|
||||
|
||||
struct BoxedResolverInner {
|
||||
session: Lrc<Session>,
|
||||
resolver_arenas: Option<ResolverArenas<'static>>,
|
||||
resolver: Option<Resolver<'static, 'static>>,
|
||||
_pin: PhantomPinned,
|
||||
}
|
||||
|
||||
// Note: Drop order is important to prevent dangling references. Resolver must be dropped first,
|
||||
// then resolver_arenas and session.
|
||||
impl Drop for BoxedResolverInner {
|
||||
fn drop(&mut self) {
|
||||
self.resolver.take();
|
||||
self.resolver_arenas.take();
|
||||
}
|
||||
}
|
||||
|
||||
impl BoxedResolver {
|
||||
pub(super) fn new(
|
||||
session: Lrc<Session>,
|
||||
make_resolver: impl for<'a, 'tcx> FnOnce(
|
||||
&'tcx Session,
|
||||
&'a ResolverArenas<'a>,
|
||||
) -> Resolver<'a, 'tcx>,
|
||||
) -> BoxedResolver {
|
||||
let mut boxed_resolver = Box::new(BoxedResolverInner {
|
||||
session,
|
||||
resolver_arenas: Some(Resolver::arenas()),
|
||||
resolver: None,
|
||||
_pin: PhantomPinned,
|
||||
});
|
||||
// SAFETY: `make_resolver` takes a resolver arena with an arbitrary lifetime and
|
||||
// returns a resolver with the same lifetime as the arena. We ensure that the arena
|
||||
// outlives the resolver in the drop impl and elsewhere so these transmutes are sound.
|
||||
unsafe {
|
||||
let resolver = make_resolver(
|
||||
std::mem::transmute::<&Session, &Session>(&boxed_resolver.session),
|
||||
std::mem::transmute::<&ResolverArenas<'_>, &ResolverArenas<'_>>(
|
||||
boxed_resolver.resolver_arenas.as_ref().unwrap(),
|
||||
),
|
||||
);
|
||||
boxed_resolver.resolver = Some(resolver);
|
||||
BoxedResolver(Pin::new_unchecked(boxed_resolver))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn access<F: for<'a, 'tcx> FnOnce(&mut Resolver<'a, 'tcx>) -> R, R>(
|
||||
&mut self,
|
||||
f: F,
|
||||
) -> R {
|
||||
// SAFETY: The resolver doesn't need to be pinned.
|
||||
let mut resolver = unsafe {
|
||||
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
|
||||
};
|
||||
f((&mut *resolver).as_mut().unwrap())
|
||||
}
|
||||
|
||||
pub fn into_outputs(mut self) -> ty::ResolverOutputs {
|
||||
// SAFETY: The resolver doesn't need to be pinned.
|
||||
let mut resolver = unsafe {
|
||||
self.0.as_mut().map_unchecked_mut(|boxed_resolver| &mut boxed_resolver.resolver)
|
||||
};
|
||||
resolver.take().unwrap().into_outputs()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_resolver(
|
||||
sess: Lrc<Session>,
|
||||
metadata_loader: Box<MetadataLoaderDyn>,
|
||||
krate: &ast::Crate,
|
||||
crate_name: Symbol,
|
||||
) -> BoxedResolver {
|
||||
trace!("create_resolver");
|
||||
BoxedResolver::new(sess, move |sess, resolver_arenas| {
|
||||
Resolver::new(sess, krate, crate_name, metadata_loader, resolver_arenas)
|
||||
})
|
||||
}
|
||||
|
||||
pub fn register_plugins<'a>(
|
||||
sess: &'a Session,
|
||||
metadata_loader: &'a dyn MetadataLoader,
|
||||
|
@ -1,6 +1,6 @@
|
||||
use crate::errors::{FailedWritingFile, RustcErrorFatal, RustcErrorUnexpectedAnnotation};
|
||||
use crate::interface::{Compiler, Result};
|
||||
use crate::passes::{self, BoxedResolver};
|
||||
use crate::passes;
|
||||
|
||||
use rustc_ast as ast;
|
||||
use rustc_codegen_ssa::traits::CodegenBackend;
|
||||
@ -13,8 +13,9 @@ use rustc_incremental::DepGraphFuture;
|
||||
use rustc_lint::LintStore;
|
||||
use rustc_middle::arena::Arena;
|
||||
use rustc_middle::dep_graph::DepGraph;
|
||||
use rustc_middle::ty::{self, GlobalCtxt, TyCtxt};
|
||||
use rustc_middle::ty::{self, GlobalCtxt, ResolverOutputs, TyCtxt};
|
||||
use rustc_query_impl::Queries as TcxQueries;
|
||||
use rustc_resolve::Resolver;
|
||||
use rustc_session::config::{self, OutputFilenames, OutputType};
|
||||
use rustc_session::{output::find_crate_name, Session};
|
||||
use rustc_span::symbol::sym;
|
||||
@ -87,7 +88,7 @@ pub struct Queries<'tcx> {
|
||||
parse: Query<ast::Crate>,
|
||||
crate_name: Query<Symbol>,
|
||||
register_plugins: Query<(ast::Crate, Lrc<LintStore>)>,
|
||||
expansion: Query<(Lrc<ast::Crate>, BoxedResolver, Lrc<LintStore>)>,
|
||||
expansion: Query<(Lrc<ast::Crate>, ResolverOutputs, Lrc<LintStore>)>,
|
||||
dep_graph: Query<DepGraph>,
|
||||
// This just points to what's in `gcx_cell`.
|
||||
gcx: Query<&'tcx GlobalCtxt<'tcx>>,
|
||||
@ -170,23 +171,25 @@ impl<'tcx> Queries<'tcx> {
|
||||
|
||||
pub fn expansion(
|
||||
&self,
|
||||
) -> Result<QueryResult<'_, (Lrc<ast::Crate>, BoxedResolver, Lrc<LintStore>)>> {
|
||||
) -> Result<QueryResult<'_, (Lrc<ast::Crate>, ResolverOutputs, Lrc<LintStore>)>> {
|
||||
trace!("expansion");
|
||||
self.expansion.compute(|| {
|
||||
let crate_name = *self.crate_name()?.borrow();
|
||||
let (krate, lint_store) = self.register_plugins()?.steal();
|
||||
let _timer = self.session().timer("configure_and_expand");
|
||||
let sess = self.session();
|
||||
let mut resolver = passes::create_resolver(
|
||||
sess.clone(),
|
||||
self.codegen_backend().metadata_loader(),
|
||||
|
||||
let arenas = Resolver::arenas();
|
||||
let mut resolver = Resolver::new(
|
||||
sess,
|
||||
&krate,
|
||||
crate_name,
|
||||
self.codegen_backend().metadata_loader(),
|
||||
&arenas,
|
||||
);
|
||||
let krate = resolver.access(|resolver| {
|
||||
passes::configure_and_expand(sess, &lint_store, krate, crate_name, resolver)
|
||||
})?;
|
||||
Ok((Lrc::new(krate), resolver, lint_store))
|
||||
let krate =
|
||||
passes::configure_and_expand(sess, &lint_store, krate, crate_name, &mut resolver)?;
|
||||
Ok((Lrc::new(krate), resolver.into_outputs(), lint_store))
|
||||
})
|
||||
}
|
||||
|
||||
@ -209,13 +212,13 @@ impl<'tcx> Queries<'tcx> {
|
||||
pub fn global_ctxt(&'tcx self) -> Result<QueryResult<'_, &'tcx GlobalCtxt<'tcx>>> {
|
||||
self.gcx.compute(|| {
|
||||
let crate_name = *self.crate_name()?.borrow();
|
||||
let (krate, resolver, lint_store) = self.expansion()?.steal();
|
||||
let (krate, resolver_outputs, lint_store) = self.expansion()?.steal();
|
||||
|
||||
let ty::ResolverOutputs {
|
||||
untracked,
|
||||
global_ctxt: untracked_resolutions,
|
||||
ast_lowering: untracked_resolver_for_lowering,
|
||||
} = resolver.into_outputs();
|
||||
} = resolver_outputs;
|
||||
|
||||
let gcx = passes::create_global_ctxt(
|
||||
self.compiler,
|
||||
|
Loading…
Reference in New Issue
Block a user