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 641ff18d37e..5330470da16 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 @@ -3,9 +3,13 @@ extern crate syntax; extern crate rustc; extern crate rustc_codegen_utils; +#[macro_use] +extern crate rustc_data_structures; +extern crate rustc_target; use std::any::Any; -use std::sync::mpsc; +use std::sync::{Arc, mpsc}; +use std::path::Path; use syntax::symbol::Symbol; use rustc::session::Session; use rustc::session::config::OutputFilenames; @@ -14,21 +18,44 @@ use rustc::ty::query::Providers; use rustc::middle::cstore::MetadataLoader; use rustc::dep_graph::DepGraph; use rustc::util::common::ErrorReported; -use rustc_codegen_utils::codegen_backend::{CodegenBackend, MetadataOnlyCodegenBackend}; +use rustc_codegen_utils::codegen_backend::CodegenBackend; +use rustc_data_structures::sync::MetadataRef; +use rustc_data_structures::owning_ref::OwningRef; +use rustc_target::spec::Target; -struct TheBackend(Box); +pub struct NoLlvmMetadataLoader; + +impl MetadataLoader for NoLlvmMetadataLoader { + fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result { + let buf = std::fs::read(filename).map_err(|e| format!("metadata file open err: {:?}", e))?; + let buf: OwningRef, [u8]> = OwningRef::new(buf); + Ok(rustc_erase_owner!(buf.map_owner_box())) + } + + fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result { + self.get_rlib_metadata(target, filename) + } +} + +struct TheBackend; impl CodegenBackend for TheBackend { fn metadata_loader(&self) -> Box { - self.0.metadata_loader() + Box::new(NoLlvmMetadataLoader) } fn provide(&self, providers: &mut Providers) { - self.0.provide(providers); + rustc_codegen_utils::symbol_names::provide(providers); + + providers.target_features_whitelist = |_tcx, _cnum| { + Default::default() // Just a dummy + }; + providers.is_reachable_non_generic = |_tcx, _defid| true; + providers.exported_symbols = |_tcx, _crate| Arc::new(Vec::new()); } fn provide_extern(&self, providers: &mut Providers) { - self.0.provide_extern(providers); + providers.is_reachable_non_generic = |_tcx, _defid| true; } fn codegen_crate<'a, 'tcx>( @@ -69,5 +96,5 @@ impl CodegenBackend for TheBackend { /// This is the entrypoint for a hot plugged rustc_codegen_llvm #[no_mangle] pub fn __rustc_codegen_backend() -> Box { - Box::new(TheBackend(MetadataOnlyCodegenBackend::boxed())) + Box::new(TheBackend) }