1
Fork 0

Remove all but one call site of prepare_outputs and fetch the value from the TyCtxt instead

This commit is contained in:
Oli Scherer 2022-12-03 12:28:01 +00:00
parent ab75d777de
commit c38ff3b385
4 changed files with 17 additions and 19 deletions

View file

@ -968,12 +968,10 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
pub fn start_codegen<'tcx>( pub fn start_codegen<'tcx>(
codegen_backend: &dyn CodegenBackend, codegen_backend: &dyn CodegenBackend,
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
outputs: &OutputFilenames,
) -> Box<dyn Any> { ) -> Box<dyn Any> {
info!("Pre-codegen\n{:?}", tcx.debug_stats()); info!("Pre-codegen\n{:?}", tcx.debug_stats());
let (metadata, need_metadata_module) = let (metadata, need_metadata_module) = rustc_metadata::fs::encode_and_write_metadata(tcx);
rustc_metadata::fs::encode_and_write_metadata(tcx, outputs);
let codegen = tcx.sess.time("codegen_crate", move || { let codegen = tcx.sess.time("codegen_crate", move || {
codegen_backend.codegen_crate(tcx, metadata, need_metadata_module) codegen_backend.codegen_crate(tcx, metadata, need_metadata_module)
@ -989,7 +987,7 @@ pub fn start_codegen<'tcx>(
info!("Post-codegen\n{:?}", tcx.debug_stats()); info!("Post-codegen\n{:?}", tcx.debug_stats());
if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) { if tcx.sess.opts.output_types.contains_key(&OutputType::Mir) {
if let Err(error) = rustc_mir_transform::dump_mir::emit_mir(tcx, outputs) { if let Err(error) = rustc_mir_transform::dump_mir::emit_mir(tcx) {
tcx.sess.emit_err(CantEmitMIR { error }); tcx.sess.emit_err(CantEmitMIR { error });
tcx.sess.abort_if_errors(); tcx.sess.abort_if_errors();
} }

View file

@ -20,6 +20,7 @@ use rustc_span::symbol::sym;
use std::any::Any; use std::any::Any;
use std::cell::{Ref, RefCell, RefMut}; use std::cell::{Ref, RefCell, RefMut};
use std::rc::Rc; use std::rc::Rc;
use std::sync::Arc;
/// Represent the result of a query. /// Represent the result of a query.
/// ///
@ -214,7 +215,7 @@ impl<'tcx> Queries<'tcx> {
pub fn global_ctxt(&'tcx self) -> Result<&Query<QueryContext<'tcx>>> { pub fn global_ctxt(&'tcx self) -> Result<&Query<QueryContext<'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()?.take();
let dep_graph = self.dep_graph()?.peek().clone(); let dep_graph = self.dep_graph()?.peek().clone();
let (krate, resolver, lint_store) = self.expansion()?.take(); let (krate, resolver, lint_store) = self.expansion()?.take();
Ok(passes::create_global_ctxt( Ok(passes::create_global_ctxt(
@ -235,7 +236,6 @@ impl<'tcx> Queries<'tcx> {
pub fn ongoing_codegen(&'tcx self) -> Result<&Query<Box<dyn Any>>> { pub fn ongoing_codegen(&'tcx self) -> Result<&Query<Box<dyn Any>>> {
self.ongoing_codegen.compute(|| { self.ongoing_codegen.compute(|| {
let outputs = self.prepare_outputs()?;
self.global_ctxt()?.peek_mut().enter(|tcx| { self.global_ctxt()?.peek_mut().enter(|tcx| {
tcx.analysis(()).ok(); tcx.analysis(()).ok();
@ -249,7 +249,7 @@ impl<'tcx> Queries<'tcx> {
// Hook for UI tests. // Hook for UI tests.
Self::check_for_rustc_errors_attr(tcx); Self::check_for_rustc_errors_attr(tcx);
Ok(passes::start_codegen(&***self.codegen_backend(), tcx, &*outputs.peek())) Ok(passes::start_codegen(&***self.codegen_backend(), tcx))
}) })
}) })
} }
@ -293,8 +293,10 @@ impl<'tcx> Queries<'tcx> {
let codegen_backend = self.codegen_backend().clone(); let codegen_backend = self.codegen_backend().clone();
let dep_graph = self.dep_graph()?.peek().clone(); let dep_graph = self.dep_graph()?.peek().clone();
let prepare_outputs = self.prepare_outputs()?.take(); let (crate_hash, prepare_outputs) = self
let crate_hash = self.global_ctxt()?.peek_mut().enter(|tcx| tcx.crate_hash(LOCAL_CRATE)); .global_ctxt()?
.peek_mut()
.enter(|tcx| (tcx.crate_hash(LOCAL_CRATE), tcx.output_filenames(()).clone()));
let ongoing_codegen = self.ongoing_codegen()?.take(); let ongoing_codegen = self.ongoing_codegen()?.take();
Ok(Linker { Ok(Linker {
@ -316,7 +318,7 @@ pub struct Linker {
// compilation outputs // compilation outputs
dep_graph: DepGraph, dep_graph: DepGraph,
prepare_outputs: OutputFilenames, prepare_outputs: Arc<OutputFilenames>,
crate_hash: Svh, crate_hash: Svh,
ongoing_codegen: Box<dyn Any>, ongoing_codegen: Box<dyn Any>,
} }

View file

@ -6,7 +6,7 @@ use crate::{encode_metadata, EncodedMetadata};
use rustc_data_structures::temp_dir::MaybeTempDir; use rustc_data_structures::temp_dir::MaybeTempDir;
use rustc_hir::def_id::LOCAL_CRATE; use rustc_hir::def_id::LOCAL_CRATE;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_session::config::{CrateType, OutputFilenames, OutputType}; use rustc_session::config::{CrateType, OutputType};
use rustc_session::output::filename_for_metadata; use rustc_session::output::filename_for_metadata;
use rustc_session::Session; use rustc_session::Session;
use tempfile::Builder as TempFileBuilder; use tempfile::Builder as TempFileBuilder;
@ -38,10 +38,7 @@ pub fn emit_wrapper_file(
out_filename out_filename
} }
pub fn encode_and_write_metadata( pub fn encode_and_write_metadata(tcx: TyCtxt<'_>) -> (EncodedMetadata, bool) {
tcx: TyCtxt<'_>,
outputs: &OutputFilenames,
) -> (EncodedMetadata, bool) {
#[derive(PartialEq, Eq, PartialOrd, Ord)] #[derive(PartialEq, Eq, PartialOrd, Ord)]
enum MetadataKind { enum MetadataKind {
None, None,
@ -64,7 +61,8 @@ pub fn encode_and_write_metadata(
.unwrap_or(MetadataKind::None); .unwrap_or(MetadataKind::None);
let crate_name = tcx.crate_name(LOCAL_CRATE); let crate_name = tcx.crate_name(LOCAL_CRATE);
let out_filename = filename_for_metadata(tcx.sess, crate_name.as_str(), outputs); let out_filename =
filename_for_metadata(tcx.sess, crate_name.as_str(), tcx.output_filenames(()));
// To avoid races with another rustc process scanning the output directory, // To avoid races with another rustc process scanning the output directory,
// we need to write the file somewhere else and atomically move it to its // we need to write the file somewhere else and atomically move it to its
// final destination, with an `fs::rename` call. In order for the rename to // final destination, with an `fs::rename` call. In order for the rename to

View file

@ -8,7 +8,7 @@ use crate::MirPass;
use rustc_middle::mir::write_mir_pretty; use rustc_middle::mir::write_mir_pretty;
use rustc_middle::mir::Body; use rustc_middle::mir::Body;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_session::config::{OutputFilenames, OutputType}; use rustc_session::config::OutputType;
pub struct Marker(pub &'static str); pub struct Marker(pub &'static str);
@ -20,8 +20,8 @@ impl<'tcx> MirPass<'tcx> for Marker {
fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) {} fn run_pass(&self, _tcx: TyCtxt<'tcx>, _body: &mut Body<'tcx>) {}
} }
pub fn emit_mir(tcx: TyCtxt<'_>, outputs: &OutputFilenames) -> io::Result<()> { pub fn emit_mir(tcx: TyCtxt<'_>) -> io::Result<()> {
let path = outputs.path(OutputType::Mir); let path = tcx.output_filenames(()).path(OutputType::Mir);
let mut f = io::BufWriter::new(File::create(&path)?); let mut f = io::BufWriter::new(File::create(&path)?);
write_mir_pretty(tcx, None, &mut f)?; write_mir_pretty(tcx, None, &mut f)?;
Ok(()) Ok(())