Skip to content

Commit 69f26b7

Browse files
committed
Use fixed type for CodegenResults
This also moves the -Zno-link implementation to rustc_interface
1 parent f141acf commit 69f26b7

File tree

4 files changed

+23
-27
lines changed

4 files changed

+23
-27
lines changed

compiler/rustc_codegen_llvm/src/lib.rs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@ use rustc_errors::{ErrorReported, FatalError, Handler};
2828
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
2929
use rustc_middle::middle::cstore::{EncodedMetadata, MetadataLoaderDyn};
3030
use rustc_middle::ty::{self, TyCtxt};
31-
use rustc_serialize::json;
32-
use rustc_session::config::{self, OptLevel, OutputFilenames, PrintRequest};
31+
use rustc_session::config::{OptLevel, OutputFilenames, PrintRequest};
3332
use rustc_session::Session;
3433
use rustc_span::symbol::Symbol;
3534

3635
use std::any::Any;
3736
use std::ffi::CStr;
38-
use std::fs;
3937
use std::sync::Arc;
4038

4139
mod back {
@@ -275,7 +273,7 @@ impl CodegenBackend for LlvmCodegenBackend {
275273
&self,
276274
ongoing_codegen: Box<dyn Any>,
277275
sess: &Session,
278-
) -> Result<(Box<dyn Any>, FxHashMap<WorkProductId, WorkProduct>), ErrorReported> {
276+
) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorReported> {
279277
let (codegen_results, work_products) = ongoing_codegen
280278
.downcast::<rustc_codegen_ssa::back::write::OngoingCodegen<LlvmCodegenBackend>>()
281279
.expect("Expected LlvmCodegenBackend's OngoingCodegen, found Box<Any>")
@@ -284,31 +282,15 @@ impl CodegenBackend for LlvmCodegenBackend {
284282
rustc_codegen_ssa::back::write::dump_incremental_data(&codegen_results);
285283
}
286284

287-
Ok((Box::new(codegen_results), work_products))
285+
Ok((codegen_results, work_products))
288286
}
289287

290288
fn link(
291289
&self,
292290
sess: &Session,
293-
codegen_results: Box<dyn Any>,
291+
codegen_results: CodegenResults,
294292
outputs: &OutputFilenames,
295293
) -> Result<(), ErrorReported> {
296-
let codegen_results = codegen_results
297-
.downcast::<CodegenResults>()
298-
.expect("Expected CodegenResults, found Box<Any>");
299-
300-
if sess.opts.debugging_opts.no_link {
301-
// FIXME: use a binary format to encode the `.rlink` file
302-
let rlink_data = json::encode(&codegen_results).map_err(|err| {
303-
sess.fatal(&format!("failed to encode rlink: {}", err));
304-
})?;
305-
let rlink_file = outputs.with_extension(config::RLINK_EXT);
306-
fs::write(&rlink_file, rlink_data).map_err(|err| {
307-
sess.fatal(&format!("failed to write file {}: {}", rlink_file.display(), err));
308-
})?;
309-
return Ok(());
310-
}
311-
312294
// Run the linker on any artifacts that resulted from the LLVM run.
313295
// This should produce either a finished executable or library.
314296
sess.time("link_crate", || {

compiler/rustc_codegen_ssa/src/traits/backend.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::write::WriteBackendMethods;
22
use super::CodegenObject;
3-
use crate::ModuleCodegen;
3+
use crate::{CodegenResults, ModuleCodegen};
44

55
use rustc_ast::expand::allocator::AllocatorKind;
66
use rustc_data_structures::fx::FxHashMap;
@@ -81,7 +81,7 @@ pub trait CodegenBackend {
8181
&self,
8282
ongoing_codegen: Box<dyn Any>,
8383
sess: &Session,
84-
) -> Result<(Box<dyn Any>, FxHashMap<WorkProductId, WorkProduct>), ErrorReported>;
84+
) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorReported>;
8585

8686
/// This is called on the returned `Box<dyn Any>` from `join_codegen`
8787
///
@@ -91,7 +91,7 @@ pub trait CodegenBackend {
9191
fn link(
9292
&self,
9393
sess: &Session,
94-
codegen_results: Box<dyn Any>,
94+
codegen_results: CodegenResults,
9595
outputs: &OutputFilenames,
9696
) -> Result<(), ErrorReported>;
9797
}

compiler/rustc_driver/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ impl RustcDefaultCalls {
599599
let codegen_results: CodegenResults = json::decode(&rlink_data).unwrap_or_else(|err| {
600600
sess.fatal(&format!("failed to decode rlink: {}", err));
601601
});
602-
compiler.codegen_backend().link(&sess, Box::new(codegen_results), &outputs)
602+
compiler.codegen_backend().link(&sess, codegen_results, &outputs)
603603
} else {
604604
sess.fatal("rlink must be a file")
605605
}

compiler/rustc_interface/src/queries.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use rustc_middle::arena::Arena;
1414
use rustc_middle::dep_graph::DepGraph;
1515
use rustc_middle::ty::steal::Steal;
1616
use rustc_middle::ty::{GlobalCtxt, ResolverOutputs, TyCtxt};
17-
use rustc_session::config::{OutputFilenames, OutputType};
17+
use rustc_serialize::json;
18+
use rustc_session::config::{self, OutputFilenames, OutputType};
1819
use rustc_session::{output::find_crate_name, Session};
1920
use rustc_span::symbol::sym;
2021
use std::any::Any;
@@ -387,6 +388,19 @@ impl Linker {
387388
{
388389
return Ok(());
389390
}
391+
392+
if sess.opts.debugging_opts.no_link {
393+
// FIXME: use a binary format to encode the `.rlink` file
394+
let rlink_data = json::encode(&codegen_results).map_err(|err| {
395+
sess.fatal(&format!("failed to encode rlink: {}", err));
396+
})?;
397+
let rlink_file = self.prepare_outputs.with_extension(config::RLINK_EXT);
398+
std::fs::write(&rlink_file, rlink_data).map_err(|err| {
399+
sess.fatal(&format!("failed to write file {}: {}", rlink_file.display(), err));
400+
})?;
401+
return Ok(());
402+
}
403+
390404
self.codegen_backend.link(&self.sess, codegen_results, &self.prepare_outputs)
391405
}
392406
}

0 commit comments

Comments
 (0)