/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

  1. #![feature(rustc_private)]
  2. #![deny(warnings)]
  3. extern crate rustc_codegen_ssa;
  4. extern crate rustc_data_structures;
  5. extern crate rustc_driver;
  6. extern crate rustc_errors;
  7. extern crate rustc_hir;
  8. extern crate rustc_metadata;
  9. extern crate rustc_middle;
  10. extern crate rustc_session;
  11. extern crate rustc_span;
  12. extern crate rustc_symbol_mangling;
  13. extern crate rustc_target;
  14. use rustc_codegen_ssa::traits::CodegenBackend;
  15. use rustc_codegen_ssa::{CodegenResults, CrateInfo};
  16. use rustc_data_structures::fx::FxHashMap;
  17. use rustc_errors::ErrorGuaranteed;
  18. use rustc_metadata::EncodedMetadata;
  19. use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
  20. use rustc_middle::ty::TyCtxt;
  21. use rustc_session::config::OutputFilenames;
  22. use rustc_session::Session;
  23. use std::any::Any;
  24. struct TheBackend;
  25. impl CodegenBackend for TheBackend {
  26. fn codegen_crate<'a, 'tcx>(
  27. &self,
  28. tcx: TyCtxt<'tcx>,
  29. metadata: EncodedMetadata,
  30. _need_metadata_module: bool,
  31. ) -> Box<dyn Any> {
  32. Box::new(CodegenResults {
  33. modules: vec![],
  34. allocator_module: None,
  35. metadata_module: None,
  36. metadata,
  37. crate_info: CrateInfo::new(tcx, "fake_target_cpu".to_string()),
  38. })
  39. }
  40. fn join_codegen(
  41. &self,
  42. ongoing_codegen: Box<dyn Any>,
  43. _sess: &Session,
  44. _outputs: &OutputFilenames,
  45. ) -> Result<(CodegenResults, FxHashMap<WorkProductId, WorkProduct>), ErrorGuaranteed> {
  46. let codegen_results = ongoing_codegen
  47. .downcast::<CodegenResults>()
  48. .expect("in join_codegen: ongoing_codegen is not a CodegenResults");
  49. Ok((*codegen_results, FxHashMap::default()))
  50. }
  51. fn link(
  52. &self,
  53. sess: &Session,
  54. codegen_results: CodegenResults,
  55. outputs: &OutputFilenames,
  56. ) -> Result<(), ErrorGuaranteed> {
  57. use rustc_session::{config::CrateType, output::out_filename};
  58. use std::io::Write;
  59. let crate_name = codegen_results.crate_info.local_crate_name;
  60. for &crate_type in sess.opts.crate_types.iter() {
  61. if crate_type != CrateType::Rlib {
  62. sess.fatal(&format!("Crate type is {:?}", crate_type));
  63. }
  64. let output_name = out_filename(sess, crate_type, &outputs, &*crate_name.as_str());
  65. let mut out_file = ::std::fs::File::create(output_name).unwrap();
  66. write!(out_file, "This has been \"compiled\" successfully.").unwrap();
  67. }
  68. Ok(())
  69. }
  70. }
  71. /// This is the entrypoint for a hot plugged rustc_codegen_llvm
  72. #[no_mangle]
  73. pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
  74. Box::new(TheBackend)
  75. }