/src/test/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs
https://gitlab.com/rust-lang/rust · Rust · 82 lines · 74 code · 7 blank · 1 comment · 4 complexity · 42b75d342885eaf023bc0111e0eac9b8 MD5 · raw file
- #![feature(rustc_private)]
- #![deny(warnings)]
- extern crate rustc_codegen_ssa;
- extern crate rustc_data_structures;
- extern crate rustc_driver;
- extern crate rustc_errors;
- extern crate rustc_hir;
- extern crate rustc_metadata;
- extern crate rustc_middle;
- extern crate rustc_session;
- extern crate rustc_span;
- extern crate rustc_symbol_mangling;
- extern crate rustc_target;
- use rustc_codegen_ssa::traits::CodegenBackend;
- use rustc_codegen_ssa::{CodegenResults, CrateInfo};
- use rustc_data_structures::fx::FxHashMap;
- use rustc_errors::ErrorGuaranteed;
- use rustc_metadata::EncodedMetadata;
- use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
- use rustc_middle::ty::TyCtxt;
- use rustc_session::config::OutputFilenames;
- use rustc_session::Session;
- use std::any::Any;
- struct TheBackend;
- impl CodegenBackend for TheBackend {
- fn codegen_crate<'a, 'tcx>(
- &self,
- tcx: TyCtxt<'tcx>,
- metadata: EncodedMetadata,
- _need_metadata_module: bool,
- ) -> Box<dyn Any> {
- Box::new(CodegenResults {
- modules: vec![],
- allocator_module: None,
- metadata_module: None,
- metadata,
- crate_info: CrateInfo::new(tcx, "fake_target_cpu".to_string()),
- })
- }
- fn join_codegen(
- &self,
- ongoing_codegen: Box<dyn Any>,
- _sess: &Session,
- _outputs: &OutputFilenames,
- ) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorGuaranteed> {
- let codegen_results = ongoing_codegen
- .downcast::<CodegenResults>()
- .expect("in join_codegen: ongoing_codegen is not a CodegenResults");
- Ok((*codegen_results, FxHashMap::default()))
- }
- fn link(
- &self,
- sess: &Session,
- codegen_results: CodegenResults,
- outputs: &OutputFilenames,
- ) -> Result<(), ErrorGuaranteed> {
- use rustc_session::{config::CrateType, output::out_filename};
- use std::io::Write;
- let crate_name = codegen_results.crate_info.local_crate_name;
- for &crate_type in sess.opts.crate_types.iter() {
- if crate_type != CrateType::Rlib {
- sess.fatal(&format!("Crate type is {:?}", crate_type));
- }
- let output_name = out_filename(sess, crate_type, &outputs, &*crate_name.as_str());
- let mut out_file = ::std::fs::File::create(output_name).unwrap();
- write!(out_file, "This has been \"compiled\" successfully.").unwrap();
- }
- Ok(())
- }
- }
- /// This is the entrypoint for a hot plugged rustc_codegen_llvm
- #[no_mangle]
- pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
- Box::new(TheBackend)
- }