From a4b7ed7a42c716ab9f05e351f003d589124fd55d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:18:58 +0200 Subject: Adding upstream version 1.68.2+dfsg1. Signed-off-by: Daniel Baumann --- .../hotplug_codegen_backend/Makefile | 26 +++++++ .../hotplug_codegen_backend/some_crate.rs | 2 + .../hotplug_codegen_backend/the_backend.rs | 82 ++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 tests/run-make-fulldeps/hotplug_codegen_backend/Makefile create mode 100644 tests/run-make-fulldeps/hotplug_codegen_backend/some_crate.rs create mode 100644 tests/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs (limited to 'tests/run-make-fulldeps/hotplug_codegen_backend') diff --git a/tests/run-make-fulldeps/hotplug_codegen_backend/Makefile b/tests/run-make-fulldeps/hotplug_codegen_backend/Makefile new file mode 100644 index 000000000..4cda243ff --- /dev/null +++ b/tests/run-make-fulldeps/hotplug_codegen_backend/Makefile @@ -0,0 +1,26 @@ +include ../tools.mk + +# ignore-stage1 + +# This test both exists as a check that -Zcodegen-backend is capable of loading external codegen +# backends and that this external codegen backend is only included in the dep info if +# -Zbinary-dep-depinfo is used. + +all: + /bin/echo || exit 0 # This test requires /bin/echo to exist + $(RUSTC) the_backend.rs --crate-name the_backend --crate-type dylib \ + -o $(TMPDIR)/the_backend.dylib + + $(RUSTC) some_crate.rs --crate-name some_crate --crate-type lib -o $(TMPDIR)/some_crate \ + -Z codegen-backend=$(TMPDIR)/the_backend.dylib -Z unstable-options \ + --emit link,dep-info + grep -x "This has been \"compiled\" successfully." $(TMPDIR)/libsome_crate.rlib + # don't declare a dependency on the codegen backend if -Zbinary-dep-depinfo isn't used. + grep -v "the_backend.dylib" $(TMPDIR)/some_crate.d + + $(RUSTC) some_crate.rs --crate-name some_crate --crate-type lib -o $(TMPDIR)/some_crate \ + -Z codegen-backend=$(TMPDIR)/the_backend.dylib -Z unstable-options \ + --emit link,dep-info -Zbinary-dep-depinfo + grep -x "This has been \"compiled\" successfully." $(TMPDIR)/libsome_crate.rlib + # but declare a dependency on the codegen backend if -Zbinary-dep-depinfo it used. + grep "the_backend.dylib" $(TMPDIR)/some_crate.d diff --git a/tests/run-make-fulldeps/hotplug_codegen_backend/some_crate.rs b/tests/run-make-fulldeps/hotplug_codegen_backend/some_crate.rs new file mode 100644 index 000000000..da27b7f34 --- /dev/null +++ b/tests/run-make-fulldeps/hotplug_codegen_backend/some_crate.rs @@ -0,0 +1,2 @@ +#![feature(no_core)] +#![no_core] diff --git a/tests/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs b/tests/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs new file mode 100644 index 000000000..3aa57d589 --- /dev/null +++ b/tests/run-make-fulldeps/hotplug_codegen_backend/the_backend.rs @@ -0,0 +1,82 @@ +#![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 { + 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, + _sess: &Session, + _outputs: &OutputFilenames, + ) -> Result<(CodegenResults, FxHashMap), ErrorGuaranteed> { + let codegen_results = ongoing_codegen + .downcast::() + .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); + 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 { + Box::new(TheBackend) +} -- cgit v1.2.3