From: Victor Ding Date: Tue, 28 Jan 2020 13:16:14 +0000 (+1100) Subject: Split `join_codegen_and_link()` into two steps X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=ae51d2ba32a3dfa3811ee19164ef789eb734a38b;p=rust.git Split `join_codegen_and_link()` into two steps `join_codegen_and_link()` is split to `join_codegen()` and `link()`. --- diff --git a/src/librustc_codegen_llvm/lib.rs b/src/librustc_codegen_llvm/lib.rs index 70e3874035b..5de31a875c3 100644 --- a/src/librustc_codegen_llvm/lib.rs +++ b/src/librustc_codegen_llvm/lib.rs @@ -29,7 +29,7 @@ use rustc_codegen_ssa::back::lto::{LtoModuleCodegen, SerializedModule, ThinModule}; use rustc_codegen_ssa::back::write::{CodegenContext, FatLTOInput, ModuleConfig}; use rustc_codegen_ssa::traits::*; -use rustc_codegen_ssa::CompiledModule; +use rustc_codegen_ssa::{CodegenResults, CompiledModule}; use rustc_errors::{FatalError, Handler}; use std::any::Any; use std::ffi::CStr; @@ -39,7 +39,7 @@ use rustc::dep_graph::DepGraph; use rustc::middle::cstore::{EncodedMetadata, MetadataLoaderDyn}; -use rustc::session::config::{OptLevel, OutputFilenames, OutputType, PrintRequest}; +use rustc::session::config::{OptLevel, OutputFilenames, PrintRequest}; use rustc::session::Session; use rustc::ty::{self, TyCtxt}; use rustc::util::common::ErrorReported; @@ -270,13 +270,12 @@ fn codegen_crate<'tcx>( ) } - fn join_codegen_and_link( + fn join_codegen( &self, ongoing_codegen: Box, sess: &Session, dep_graph: &DepGraph, - outputs: &OutputFilenames, - ) -> Result<(), ErrorReported> { + ) -> Result, ErrorReported> { let (codegen_results, work_products) = ongoing_codegen .downcast::>() .expect("Expected LlvmCodegenBackend's OngoingCodegen, found Box") @@ -291,14 +290,18 @@ fn join_codegen_and_link( sess.compile_status()?; - if !sess - .opts - .output_types - .keys() - .any(|&i| i == OutputType::Exe || i == OutputType::Metadata) - { - return Ok(()); - } + Ok(Box::new(codegen_results)) + } + + fn link( + &self, + sess: &Session, + codegen_results: Box, + outputs: &OutputFilenames, + ) -> Result<(), ErrorReported> { + let codegen_results = codegen_results + .downcast::() + .expect("Expected CodegenResults, found Box"); if sess.opts.debugging_opts.no_link { // FIXME: use a binary format to encode the `.rlink` file diff --git a/src/librustc_codegen_utils/codegen_backend.rs b/src/librustc_codegen_utils/codegen_backend.rs index fecb3986e7e..96166e04c2e 100644 --- a/src/librustc_codegen_utils/codegen_backend.rs +++ b/src/librustc_codegen_utils/codegen_backend.rs @@ -43,11 +43,22 @@ fn codegen_crate<'tcx>( /// # Panics /// /// Panics when the passed `Box` was not returned by `codegen_backend`. - fn join_codegen_and_link( + fn join_codegen( &self, ongoing_codegen: Box, sess: &Session, dep_graph: &DepGraph, + ) -> Result, ErrorReported>; + + /// This is called on the returned `Box` from `join_codegen` + /// + /// # Panics + /// + /// Panics when the passed `Box` was not returned by `join_codegen`. + fn link( + &self, + sess: &Session, + codegen_results: Box, outputs: &OutputFilenames, ) -> Result<(), ErrorReported>; } diff --git a/src/librustc_interface/queries.rs b/src/librustc_interface/queries.rs index 0af9b17a299..2ac2845be91 100644 --- a/src/librustc_interface/queries.rs +++ b/src/librustc_interface/queries.rs @@ -310,19 +310,22 @@ pub struct Linker { impl Linker { pub fn link(self) -> Result<()> { - let r = self - .codegen_backend - .join_codegen_and_link( - self.ongoing_codegen, - &self.sess, - &self.dep_graph, - &self.prepare_outputs, - ) - .map_err(|_| ErrorReported); + let codegen_results = + self.codegen_backend.join_codegen(self.ongoing_codegen, &self.sess, &self.dep_graph)?; let prof = self.sess.prof.clone(); let dep_graph = self.dep_graph; prof.generic_activity("drop_dep_graph").run(move || drop(dep_graph)); - r + + if !self + .sess + .opts + .output_types + .keys() + .any(|&i| i == OutputType::Exe || i == OutputType::Metadata) + { + return Ok(()); + } + self.codegen_backend.link(&self.sess, codegen_results, &self.prepare_outputs) } } diff --git a/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs b/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs index 84bcd220ae7..07ef2424cc8 100644 --- a/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs +++ b/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs @@ -71,18 +71,28 @@ fn codegen_crate<'a, 'tcx>( Box::new(tcx.crate_name(LOCAL_CRATE) as Symbol) } - fn join_codegen_and_link( + fn join_codegen( &self, ongoing_codegen: Box, - sess: &Session, + _sess: &Session, _dep_graph: &DepGraph, + ) -> Result, ErrorReported> { + let crate_name = ongoing_codegen.downcast::() + .expect("in join_codegen: ongoing_codegen is not a Symbol"); + Ok(crate_name) + } + + fn link( + &self, + sess: &Session, + codegen_results: Box, outputs: &OutputFilenames, ) -> Result<(), ErrorReported> { use std::io::Write; use rustc::session::config::CrateType; use rustc_codegen_utils::link::out_filename; - let crate_name = ongoing_codegen.downcast::() - .expect("in join_codegen_and_link: ongoing_codegen is not a Symbol"); + let crate_name = codegen_results.downcast::() + .expect("in link: codegen_results is not a Symbol"); for &crate_type in sess.opts.crate_types.iter() { if crate_type != CrateType::Rlib { sess.fatal(&format!("Crate type is {:?}", crate_type));