1
Fork 0

Move AST crate.

This commit is contained in:
Camille GILLOT 2021-06-11 18:55:30 +02:00
parent c520cf2253
commit 2f28737ebe
4 changed files with 21 additions and 29 deletions

View file

@ -46,7 +46,6 @@ use std::ffi::OsString;
use std::fs; use std::fs;
use std::io::{self, Read, Write}; use std::io::{self, Read, Write};
use std::lazy::SyncLazy; use std::lazy::SyncLazy;
use std::mem;
use std::panic::{self, catch_unwind}; use std::panic::{self, catch_unwind};
use std::path::PathBuf; use std::path::PathBuf;
use std::process::{self, Command, Stdio}; use std::process::{self, Command, Stdio};
@ -316,12 +315,12 @@ fn run_compiler(
if let Some(ppm) = &sess.opts.pretty { if let Some(ppm) = &sess.opts.pretty {
if ppm.needs_ast_map() { if ppm.needs_ast_map() {
let expanded_crate = { &queries.expansion()?.peek().0 };
queries.global_ctxt()?.peek_mut().enter(|tcx| { queries.global_ctxt()?.peek_mut().enter(|tcx| {
let expanded_crate = queries.expansion()?.take().0;
pretty::print_after_hir_lowering( pretty::print_after_hir_lowering(
tcx, tcx,
compiler.input(), compiler.input(),
&expanded_crate, expanded_crate,
*ppm, *ppm,
compiler.output_file().as_ref().map(|p| &**p), compiler.output_file().as_ref().map(|p| &**p),
); );
@ -377,12 +376,6 @@ fn run_compiler(
queries.global_ctxt()?; queries.global_ctxt()?;
// Drop AST after creating GlobalCtxt to free memory
{
let _timer = sess.prof.generic_activity("drop_ast");
mem::drop(queries.expansion()?.take());
}
if sess.opts.debugging_opts.no_analysis || sess.opts.debugging_opts.ast_json { if sess.opts.debugging_opts.no_analysis || sess.opts.debugging_opts.ast_json {
return early_exit(); return early_exit();
} }

View file

@ -7,7 +7,6 @@ use rustc_ast::{self as ast, visit};
use rustc_codegen_ssa::back::link::emit_metadata; use rustc_codegen_ssa::back::link::emit_metadata;
use rustc_codegen_ssa::traits::CodegenBackend; use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_data_structures::parallel; use rustc_data_structures::parallel;
use rustc_data_structures::steal::Steal;
use rustc_data_structures::sync::{par_iter, Lrc, OnceCell, ParallelIterator, WorkerLocal}; use rustc_data_structures::sync::{par_iter, Lrc, OnceCell, ParallelIterator, WorkerLocal};
use rustc_data_structures::temp_dir::MaybeTempDir; use rustc_data_structures::temp_dir::MaybeTempDir;
use rustc_errors::{ErrorReported, PResult}; use rustc_errors::{ErrorReported, PResult};
@ -458,7 +457,7 @@ pub fn lower_to_hir<'res, 'tcx>(
sess: &'tcx Session, sess: &'tcx Session,
lint_store: &LintStore, lint_store: &LintStore,
resolver: &'res mut Resolver<'_>, resolver: &'res mut Resolver<'_>,
krate: &'res ast::Crate, krate: ast::Crate,
arena: &'tcx rustc_ast_lowering::Arena<'tcx>, arena: &'tcx rustc_ast_lowering::Arena<'tcx>,
) -> &'tcx Crate<'tcx> { ) -> &'tcx Crate<'tcx> {
// Lower AST to HIR. // Lower AST to HIR.
@ -485,6 +484,9 @@ pub fn lower_to_hir<'res, 'tcx>(
) )
}); });
// Drop AST to free memory
sess.time("drop_ast", || std::mem::drop(krate));
// Discard hygiene data, which isn't required after lowering to HIR. // Discard hygiene data, which isn't required after lowering to HIR.
if !sess.opts.debugging_opts.keep_hygiene_data { if !sess.opts.debugging_opts.keep_hygiene_data {
rustc_span::hygiene::clear_syntax_context_map(); rustc_span::hygiene::clear_syntax_context_map();
@ -577,7 +579,7 @@ fn escape_dep_env(symbol: Symbol) -> String {
fn write_out_deps( fn write_out_deps(
sess: &Session, sess: &Session,
boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>, boxed_resolver: &RefCell<BoxedResolver>,
outputs: &OutputFilenames, outputs: &OutputFilenames,
out_filenames: &[PathBuf], out_filenames: &[PathBuf],
) { ) {
@ -604,7 +606,7 @@ fn write_out_deps(
} }
if sess.binary_dep_depinfo() { if sess.binary_dep_depinfo() {
boxed_resolver.borrow().borrow_mut().access(|resolver| { boxed_resolver.borrow_mut().access(|resolver| {
for cnum in resolver.cstore().crates_untracked() { for cnum in resolver.cstore().crates_untracked() {
let source = resolver.cstore().crate_source_untracked(cnum); let source = resolver.cstore().crate_source_untracked(cnum);
if let Some((path, _)) = source.dylib { if let Some((path, _)) = source.dylib {
@ -673,7 +675,7 @@ pub fn prepare_outputs(
sess: &Session, sess: &Session,
compiler: &Compiler, compiler: &Compiler,
krate: &ast::Crate, krate: &ast::Crate,
boxed_resolver: &Steal<Rc<RefCell<BoxedResolver>>>, boxed_resolver: &RefCell<BoxedResolver>,
crate_name: &str, crate_name: &str,
) -> Result<OutputFilenames> { ) -> Result<OutputFilenames> {
let _timer = sess.timer("prepare_outputs"); let _timer = sess.timer("prepare_outputs");
@ -777,7 +779,7 @@ impl<'tcx> QueryContext<'tcx> {
pub fn create_global_ctxt<'tcx>( pub fn create_global_ctxt<'tcx>(
compiler: &'tcx Compiler, compiler: &'tcx Compiler,
lint_store: Lrc<LintStore>, lint_store: Lrc<LintStore>,
krate: &ast::Crate, krate: ast::Crate,
dep_graph: DepGraph, dep_graph: DepGraph,
resolver: Rc<RefCell<BoxedResolver>>, resolver: Rc<RefCell<BoxedResolver>>,
outputs: OutputFilenames, outputs: OutputFilenames,

View file

@ -3,7 +3,6 @@ use crate::passes::{self, BoxedResolver, QueryContext};
use rustc_ast as ast; use rustc_ast as ast;
use rustc_codegen_ssa::traits::CodegenBackend; use rustc_codegen_ssa::traits::CodegenBackend;
use rustc_data_structures::steal::Steal;
use rustc_data_structures::svh::Svh; use rustc_data_structures::svh::Svh;
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal}; use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
use rustc_errors::ErrorReported; use rustc_errors::ErrorReported;
@ -80,7 +79,7 @@ pub struct Queries<'tcx> {
parse: Query<ast::Crate>, parse: Query<ast::Crate>,
crate_name: Query<String>, crate_name: Query<String>,
register_plugins: Query<(ast::Crate, Lrc<LintStore>)>, register_plugins: Query<(ast::Crate, Lrc<LintStore>)>,
expansion: Query<(ast::Crate, Steal<Rc<RefCell<BoxedResolver>>>, Lrc<LintStore>)>, expansion: Query<(ast::Crate, Rc<RefCell<BoxedResolver>>, Lrc<LintStore>)>,
dep_graph: Query<DepGraph>, dep_graph: Query<DepGraph>,
prepare_outputs: Query<OutputFilenames>, prepare_outputs: Query<OutputFilenames>,
global_ctxt: Query<QueryContext<'tcx>>, global_ctxt: Query<QueryContext<'tcx>>,
@ -168,7 +167,7 @@ impl<'tcx> Queries<'tcx> {
pub fn expansion( pub fn expansion(
&self, &self,
) -> Result<&Query<(ast::Crate, Steal<Rc<RefCell<BoxedResolver>>>, Lrc<LintStore>)>> { ) -> Result<&Query<(ast::Crate, Rc<RefCell<BoxedResolver>>, Lrc<LintStore>)>> {
tracing::trace!("expansion"); tracing::trace!("expansion");
self.expansion.compute(|| { self.expansion.compute(|| {
let crate_name = self.crate_name()?.peek().clone(); let crate_name = self.crate_name()?.peek().clone();
@ -184,7 +183,7 @@ impl<'tcx> Queries<'tcx> {
let krate = resolver.access(|resolver| { let krate = resolver.access(|resolver| {
passes::configure_and_expand(&sess, &lint_store, krate, &crate_name, resolver) passes::configure_and_expand(&sess, &lint_store, krate, &crate_name, resolver)
})?; })?;
Ok((krate, Steal::new(Rc::new(RefCell::new(resolver))), lint_store)) Ok((krate, Rc::new(RefCell::new(resolver)), lint_store))
}) })
} }
@ -206,14 +205,13 @@ impl<'tcx> Queries<'tcx> {
pub fn prepare_outputs(&self) -> Result<&Query<OutputFilenames>> { pub fn prepare_outputs(&self) -> Result<&Query<OutputFilenames>> {
self.prepare_outputs.compute(|| { self.prepare_outputs.compute(|| {
let expansion_result = self.expansion()?; let (krate, boxed_resolver, _) = &*self.expansion()?.peek();
let (krate, boxed_resolver, _) = &*expansion_result.peek();
let crate_name = self.crate_name()?.peek(); let crate_name = self.crate_name()?.peek();
passes::prepare_outputs( passes::prepare_outputs(
self.session(), self.session(),
self.compiler, self.compiler,
&krate, krate,
&boxed_resolver, &*boxed_resolver,
&crate_name, &crate_name,
) )
}) })
@ -223,14 +221,14 @@ impl<'tcx> Queries<'tcx> {
self.global_ctxt.compute(|| { self.global_ctxt.compute(|| {
let crate_name = self.crate_name()?.peek().clone(); let crate_name = self.crate_name()?.peek().clone();
let outputs = self.prepare_outputs()?.peek().clone(); let outputs = self.prepare_outputs()?.peek().clone();
let (ref krate, ref resolver, ref lint_store) = &*self.expansion()?.peek();
let dep_graph = self.dep_graph()?.peek().clone(); let dep_graph = self.dep_graph()?.peek().clone();
let (krate, resolver, lint_store) = self.expansion()?.take();
Ok(passes::create_global_ctxt( Ok(passes::create_global_ctxt(
self.compiler, self.compiler,
lint_store.clone(), lint_store,
krate, krate,
dep_graph, dep_graph,
resolver.steal(), resolver,
outputs, outputs,
&crate_name, &crate_name,
&self.queries, &self.queries,

View file

@ -303,9 +303,8 @@ crate fn create_resolver<'a>(
queries: &Queries<'a>, queries: &Queries<'a>,
sess: &Session, sess: &Session,
) -> Rc<RefCell<interface::BoxedResolver>> { ) -> Rc<RefCell<interface::BoxedResolver>> {
let parts = abort_on_err(queries.expansion(), sess).peek(); let (krate, resolver, _) = &*abort_on_err(queries.expansion(), sess).peek();
let (krate, resolver, _) = &*parts; let resolver = resolver.clone();
let resolver = resolver.borrow().clone();
let mut loader = crate::passes::collect_intra_doc_links::IntraLinkCrateLoader::new(resolver); let mut loader = crate::passes::collect_intra_doc_links::IntraLinkCrateLoader::new(resolver);
ast::visit::walk_crate(&mut loader, krate); ast::visit::walk_crate(&mut loader, krate);