pub backtrace_on_ice: bool,
// llvm codegen options
- pub llvm_enabled: bool,
pub llvm_assertions: bool,
pub llvm_optimize: bool,
pub llvm_release_debuginfo: bool,
#[derive(Deserialize, Default)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
struct Llvm {
- enabled: Option<bool>,
ccache: Option<StringOrBool>,
ninja: Option<bool>,
assertions: Option<bool>,
pub fn default_opts() -> Config {
let mut config = Config::default();
- config.llvm_enabled = true;
config.llvm_optimize = true;
config.llvm_version_check = true;
config.use_jemalloc = true;
Some(StringOrBool::Bool(false)) | None => {}
}
set(&mut config.ninja, llvm.ninja);
- set(&mut config.llvm_enabled, llvm.enabled);
llvm_assertions = llvm.assertions;
set(&mut config.llvm_optimize, llvm.optimize);
set(&mut config.llvm_release_debuginfo, llvm.release_debuginfo);
#![feature(box_syntax)]
use std::any::Any;
-use std::io::prelude::*;
-use std::io::{self, Cursor};
+use std::io::{self, Write};
use std::fs::File;
use std::path::Path;
use std::sync::{mpsc, Arc};
use rustc_data_structures::owning_ref::OwningRef;
use rustc_data_structures::sync::Lrc;
-use ar::{Archive, Builder, Header};
-use flate2::Compression;
-use flate2::write::DeflateEncoder;
use syntax::symbol::Symbol;
use rustc::hir::def_id::LOCAL_CRATE;
) -> Result<(), CompileIncomplete>;
}
-pub struct DummyCodegenBackend;
-
-impl CodegenBackend for DummyCodegenBackend {
- fn metadata_loader(&self) -> Box<MetadataLoader + Sync> {
- box DummyMetadataLoader(())
- }
-
- fn provide(&self, _providers: &mut Providers) {
- bug!("DummyCodegenBackend::provide");
- }
-
- fn provide_extern(&self, _providers: &mut Providers) {
- bug!("DummyCodegenBackend::provide_extern");
- }
-
- fn codegen_crate<'a, 'tcx>(
- &self,
- _tcx: TyCtxt<'a, 'tcx, 'tcx>,
- _rx: mpsc::Receiver<Box<Any + Send>>
- ) -> Box<Any> {
- bug!("DummyCodegenBackend::codegen_backend");
- }
-
- fn join_codegen_and_link(
- &self,
- _ongoing_codegen: Box<Any>,
- _sess: &Session,
- _dep_graph: &DepGraph,
- _outputs: &OutputFilenames,
- ) -> Result<(), CompileIncomplete> {
- bug!("DummyCodegenBackend::join_codegen_and_link");
- }
-}
-
-pub struct DummyMetadataLoader(());
-
-impl MetadataLoader for DummyMetadataLoader {
- fn get_rlib_metadata(
- &self,
- _target: &Target,
- _filename: &Path
- ) -> Result<MetadataRef, String> {
- bug!("DummyMetadataLoader::get_rlib_metadata");
- }
-
- fn get_dylib_metadata(
- &self,
- _target: &Target,
- _filename: &Path
- ) -> Result<MetadataRef, String> {
- bug!("DummyMetadataLoader::get_dylib_metadata");
- }
-}
-
pub struct NoLlvmMetadataLoader;
impl MetadataLoader for NoLlvmMetadataLoader {
fn get_rlib_metadata(&self, _: &Target, filename: &Path) -> Result<MetadataRef, String> {
- let file = File::open(filename)
+ let mut file = File::open(filename)
.map_err(|e| format!("metadata file open err: {:?}", e))?;
- let mut archive = Archive::new(file);
- while let Some(entry_result) = archive.next_entry() {
- let mut entry = entry_result
- .map_err(|e| format!("metadata section read err: {:?}", e))?;
- if entry.header().identifier() == "rust.metadata.bin" {
- let mut buf = Vec::new();
- io::copy(&mut entry, &mut buf).unwrap();
- let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
- return Ok(rustc_erase_owner!(buf.map_owner_box()));
- }
- }
-
- Err("Couldn't find metadata section".to_string())
+ let mut buf = Vec::new();
+ io::copy(&mut file, &mut buf).unwrap();
+ let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
+ return Ok(rustc_erase_owner!(buf.map_owner_box()));
}
- fn get_dylib_metadata(
- &self,
- _target: &Target,
- _filename: &Path,
- ) -> Result<MetadataRef, String> {
- // FIXME: Support reading dylibs from llvm enabled rustc
- self.get_rlib_metadata(_target, _filename)
+ 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,
}
box OngoingCodegen {
metadata: metadata,
- metadata_version: tcx.metadata_encoding_version().to_vec(),
crate_name: tcx.crate_name(LOCAL_CRATE),
}
}
}
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::CrateTypeDylib {
- DeflateEncoder::new(&mut compressed, Compression::fast())
- .write_all(&ongoing_codegen.metadata.raw_data)
- .unwrap();
- &compressed
- } else {
- &ongoing_codegen.metadata.raw_data
- };
- let mut builder = Builder::new(File::create(&output_name).unwrap());
- let header = Header::new("rust.metadata.bin".to_string(), metadata.len() as u64);
- builder.append(&header, Cursor::new(metadata)).unwrap();
+ let metadata = &ongoing_codegen.metadata.raw_data;
+ let mut file = File::create(&output_name).unwrap();
+ file.write_all(metadata).unwrap();
}
sess.abort_if_errors();