Skip to content

Commit

Permalink
Auto merge of #64016 - nnethercote:Compiler-fiddling, r=<try>
Browse files Browse the repository at this point in the history
Streamline `Compiler`

A few commits to clean up `Compiler`.

r? @Zoxc
  • Loading branch information
bors committed Sep 7, 2019
2 parents ef54f57 + 92a0cbd commit 468729d
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 66 deletions.
7 changes: 1 addition & 6 deletions src/librustc_driver/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,17 +383,12 @@ pub fn run_compiler(
mem::drop(compiler.expansion()?.take());
}

compiler.ongoing_codegen()?;

// Drop GlobalCtxt after starting codegen to free memory
mem::drop(compiler.global_ctxt()?.take());
compiler.codegen_and_link()?;

if sess.opts.debugging_opts.print_type_sizes {
sess.code_stats.borrow().print_type_sizes();
}

compiler.link()?;

if sess.opts.debugging_opts.perf_stats {
sess.print_perf_stats();
}
Expand Down
4 changes: 0 additions & 4 deletions src/librustc_interface/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,6 @@ pub struct PluginInfo {
}

pub fn register_plugins<'a>(
compiler: &Compiler,
sess: &'a Session,
cstore: &'a CStore,
mut krate: ast::Crate,
Expand Down Expand Up @@ -263,9 +262,6 @@ pub fn register_plugins<'a>(
});
}

// If necessary, compute the dependency graph (in the background).
compiler.dep_graph_future().ok();

time(sess, "recursion limit", || {
middle::recursion_limit::update_limits(sess, &krate);
});
Expand Down
90 changes: 35 additions & 55 deletions src/librustc_interface/queries.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ use crate::interface::{Compiler, Result};
use crate::passes::{self, BoxedResolver, ExpansionResult, BoxedGlobalCtxt, PluginInfo};

use rustc_incremental::DepGraphFuture;
use rustc::session::config::{OutputFilenames, OutputType};
use rustc::session::config::OutputFilenames;
use rustc::util::common::{time, ErrorReported};
use rustc::hir;
use rustc::hir::def_id::LOCAL_CRATE;
use rustc::ty::steal::Steal;
use rustc::dep_graph::DepGraph;
use std::any::Any;
use std::cell::{Ref, RefMut, RefCell};
use std::mem;
use std::rc::Rc;
use std::sync::mpsc;
use std::any::Any;
use std::mem;
use syntax::{self, ast};

/// Represent the result of a query.
Expand Down Expand Up @@ -83,8 +83,7 @@ pub(crate) struct Queries {
codegen_channel: Query<(Steal<mpsc::Sender<Box<dyn Any + Send>>>,
Steal<mpsc::Receiver<Box<dyn Any + Send>>>)>,
global_ctxt: Query<BoxedGlobalCtxt>,
ongoing_codegen: Query<Box<dyn Any>>,
link: Query<()>,
codegen_and_link: Query<()>,
}

impl Compiler {
Expand Down Expand Up @@ -114,29 +113,38 @@ impl Compiler {
let crate_name = self.crate_name()?.peek().clone();
let krate = self.parse()?.take();

passes::register_plugins(
self,
let result = passes::register_plugins(
self.session(),
self.cstore(),
krate,
&crate_name,
)
);

// Compute the dependency graph (in the background). We want to do
// this as early as possible, to give the DepGraph maximum time to
// load before dep_graph() is called, but it also can't happen
// until after rustc_incremental::prepare_session_directory() is
// called, which happens within passes::register_plugins().
self.dep_graph_future().ok();

result
})
}

pub fn crate_name(&self) -> Result<&Query<String>> {
self.queries.crate_name.compute(|| {
let parse_result = self.parse()?;
let krate = parse_result.peek();
let result = match self.crate_name {
Ok(match self.crate_name {
Some(ref crate_name) => crate_name.clone(),
None => rustc_codegen_utils::link::find_crate_name(
Some(self.session()),
&krate.attrs,
&self.input
),
};
Ok(result)
None => {
let parse_result = self.parse()?;
let krate = parse_result.peek();
rustc_codegen_utils::link::find_crate_name(
Some(self.session()),
&krate.attrs,
&self.input
)
}
})
})
}

Expand Down Expand Up @@ -194,7 +202,6 @@ impl Compiler {

pub fn prepare_outputs(&self) -> Result<&Query<OutputFilenames>> {
self.queries.prepare_outputs.compute(|| {
self.lower_to_hir()?;
let krate = self.expansion()?;
let krate = krate.peek();
let crate_name = self.crate_name()?;
Expand Down Expand Up @@ -230,14 +237,14 @@ impl Compiler {
})
}

pub fn ongoing_codegen(&self) -> Result<&Query<Box<dyn Any>>> {
self.queries.ongoing_codegen.compute(|| {
pub fn codegen_and_link(&self) -> Result<&Query<()>> {
self.queries.codegen_and_link.compute(|| {
let rx = self.codegen_channel()?.peek().1.steal();
let outputs = self.prepare_outputs()?;
self.global_ctxt()?.peek_mut().enter(|tcx| {
let ongoing_codegen = self.global_ctxt()?.peek_mut().enter(|tcx| {
tcx.analysis(LOCAL_CRATE).ok();

// Don't do code generation if there were any errors
// Don't do code generation if there were any errors.
self.session().compile_status()?;

Ok(passes::start_codegen(
Expand All @@ -246,46 +253,19 @@ impl Compiler {
rx,
&*outputs.peek()
))
})
})
}

pub fn link(&self) -> Result<&Query<()>> {
self.queries.link.compute(|| {
let sess = self.session();
})?;

let ongoing_codegen = self.ongoing_codegen()?.take();
// Drop GlobalCtxt after starting codegen to free memory.
mem::drop(self.global_ctxt()?.take());

self.codegen_backend().join_codegen_and_link(
ongoing_codegen,
sess,
self.session(),
&*self.dep_graph()?.peek(),
&*self.prepare_outputs()?.peek(),
&*outputs.peek(),
).map_err(|_| ErrorReported)?;

Ok(())
})
}

pub fn compile(&self) -> Result<()> {
self.prepare_outputs()?;

if self.session().opts.output_types.contains_key(&OutputType::DepInfo)
&& self.session().opts.output_types.len() == 1
{
return Ok(())
}

self.global_ctxt()?;

// Drop AST after creating GlobalCtxt to free memory
mem::drop(self.expansion()?.take());

self.ongoing_codegen()?;

// Drop GlobalCtxt after starting codegen to free memory
mem::drop(self.global_ctxt()?.take());

self.link().map(|_| ())
}
}
2 changes: 1 addition & 1 deletion src/test/run-make-fulldeps/issue-19371/foo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
};

interface::run_compiler(config, |compiler| {
compiler.compile().ok();
compiler.codegen_and_link().ok();
});
}

0 comments on commit 468729d

Please sign in to comment.