diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2019-03-01 16:53:21 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2019-03-16 10:54:38 +0100 |
| commit | ca2ff089f37e3b3186df8f4b4bd85d82eb5facc7 (patch) | |
| tree | 8dede54a98ab2823ca0a4ec2ca18227825bff5f7 /src/librustc_codegen_utils/codegen_backend.rs | |
| parent | 52e885628e4317aa3f158622435927eb29b812e9 (diff) | |
| download | rust-ca2ff089f37e3b3186df8f4b4bd85d82eb5facc7.tar.gz rust-ca2ff089f37e3b3186df8f4b4bd85d82eb5facc7.zip | |
Remove MetadataOnlyCodegenBackend
Diffstat (limited to 'src/librustc_codegen_utils/codegen_backend.rs')
| -rw-r--r-- | src/librustc_codegen_utils/codegen_backend.rs | 146 |
1 files changed, 2 insertions, 144 deletions
diff --git a/src/librustc_codegen_utils/codegen_backend.rs b/src/librustc_codegen_utils/codegen_backend.rs index 29bcb4f2e64..56eaffb1ca3 100644 --- a/src/librustc_codegen_utils/codegen_backend.rs +++ b/src/librustc_codegen_utils/codegen_backend.rs @@ -10,27 +10,16 @@ #![feature(box_syntax)] use std::any::Any; -use std::io::Write; -use std::fs; -use std::path::Path; -use std::sync::{mpsc, Arc}; - -use rustc_data_structures::owning_ref::OwningRef; -use flate2::Compression; -use flate2::write::DeflateEncoder; +use std::sync::mpsc; use syntax::symbol::Symbol; -use rustc::hir::def_id::LOCAL_CRATE; use rustc::session::Session; use rustc::util::common::ErrorReported; -use rustc::session::config::{CrateType, OutputFilenames, PrintRequest}; +use rustc::session::config::{OutputFilenames, PrintRequest}; use rustc::ty::TyCtxt; use rustc::ty::query::Providers; -use rustc::middle::cstore::EncodedMetadata; use rustc::middle::cstore::MetadataLoader; use rustc::dep_graph::DepGraph; -use rustc_target::spec::Target; -use crate::link::out_filename; pub use rustc_data_structures::sync::MetadataRef; @@ -64,134 +53,3 @@ pub trait CodegenBackend { outputs: &OutputFilenames, ) -> Result<(), ErrorReported>; } - -pub struct NoLlvmMetadataLoader; - -impl MetadataLoader for NoLlvmMetadataLoader { - fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<MetadataRef, String> { - let buf = fs::read(filename).map_err(|e| format!("metadata file open err: {:?}", e))?; - let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf); - Ok(rustc_erase_owner!(buf.map_owner_box())) - } - - fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String> { - self.get_rlib_metadata(target, filename) - } -} - -pub struct MetadataOnlyCodegenBackend(()); -pub struct OngoingCodegen { - metadata: EncodedMetadata, - metadata_version: Vec<u8>, - crate_name: Symbol, -} - -impl MetadataOnlyCodegenBackend { - pub fn boxed() -> Box<dyn CodegenBackend> { - box MetadataOnlyCodegenBackend(()) - } -} - -impl CodegenBackend for MetadataOnlyCodegenBackend { - fn init(&self, sess: &Session) { - for cty in sess.opts.crate_types.iter() { - match *cty { - CrateType::Rlib | CrateType::Dylib | CrateType::Executable => {}, - _ => { - sess.diagnostic().warn( - &format!("LLVM unsupported, so output type {} is not supported", cty) - ); - }, - } - } - } - - fn metadata_loader(&self) -> Box<dyn MetadataLoader + Sync> { - box NoLlvmMetadataLoader - } - - fn provide(&self, providers: &mut Providers<'_>) { - crate::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<'_>) { - providers.is_reachable_non_generic = |_tcx, _defid| true; - } - - fn codegen_crate<'a, 'tcx>( - &self, - tcx: TyCtxt<'a, 'tcx, 'tcx>, - _rx: mpsc::Receiver<Box<dyn Any + Send>> - ) -> Box<dyn Any> { - use rustc_mir::monomorphize::item::MonoItem; - - crate::check_for_rustc_errors_attr(tcx); - crate::symbol_names_test::report_symbol_names(tcx); - rustc_incremental::assert_dep_graph(tcx); - rustc_incremental::assert_module_sources::assert_module_sources(tcx); - // FIXME: Fix this - // rustc::middle::dependency_format::calculate(tcx); - let _ = tcx.link_args(LOCAL_CRATE); - let _ = tcx.native_libraries(LOCAL_CRATE); - let (_, cgus) = tcx.collect_and_partition_mono_items(LOCAL_CRATE); - for (mono_item, _) in cgus.iter().flat_map(|cgu| cgu.items().iter()) { - if let MonoItem::Fn(inst) = mono_item { - let def_id = inst.def_id(); - if def_id.is_local() { - let _ = tcx.codegen_fn_attrs(def_id); - } - } - } - tcx.sess.abort_if_errors(); - - let metadata = tcx.encode_metadata(); - - box OngoingCodegen { - metadata, - metadata_version: tcx.metadata_encoding_version().to_vec(), - crate_name: tcx.crate_name(LOCAL_CRATE), - } - } - - fn join_codegen_and_link( - &self, - ongoing_codegen: Box<dyn Any>, - sess: &Session, - _dep_graph: &DepGraph, - outputs: &OutputFilenames, - ) -> Result<(), ErrorReported> { - let ongoing_codegen = ongoing_codegen.downcast::<OngoingCodegen>() - .expect("Expected MetadataOnlyCodegenBackend's OngoingCodegen, found Box<dyn Any>"); - for &crate_type in sess.opts.crate_types.iter() { - if crate_type != CrateType::Rlib && - crate_type != CrateType::Dylib { - continue; - } - let output_name = - out_filename(sess, crate_type, &outputs, &ongoing_codegen.crate_name.as_str()); - let mut compressed = ongoing_codegen.metadata_version.clone(); - let metadata = if crate_type == CrateType::Dylib { - DeflateEncoder::new(&mut compressed, Compression::fast()) - .write_all(&ongoing_codegen.metadata.raw_data) - .unwrap(); - &compressed - } else { - &ongoing_codegen.metadata.raw_data - }; - fs::write(&output_name, metadata).unwrap(); - } - - sess.abort_if_errors(); - if !sess.opts.crate_types.contains(&CrateType::Rlib) - && !sess.opts.crate_types.contains(&CrateType::Dylib) - { - sess.fatal("Executables are not supported by the metadata-only backend."); - } - Ok(()) - } -} |
