diff --git a/src/Cargo.lock b/src/Cargo.lock index 4940dfd0e65..6cb46c5c400 100644 --- a/src/Cargo.lock +++ b/src/Cargo.lock @@ -1343,6 +1343,7 @@ dependencies = [ "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "graphviz 0.0.0", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "rustc 0.0.0", "rustc_allocator 0.0.0", "rustc_back 0.0.0", diff --git a/src/librustc_driver/Cargo.toml b/src/librustc_driver/Cargo.toml index 04c0f9b3518..d6155f53485 100644 --- a/src/librustc_driver/Cargo.toml +++ b/src/librustc_driver/Cargo.toml @@ -12,6 +12,7 @@ crate-type = ["dylib"] arena = { path = "../libarena" } graphviz = { path = "../libgraphviz" } log = { version = "0.3", features = ["release_max_level_info"] } +owning_ref = "0.3.3" env_logger = { version = "0.4", default-features = false } rustc = { path = "../librustc" } rustc_allocator = { path = "../librustc_allocator" } diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index be257c8524b..0e92499e1e1 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -18,7 +18,9 @@ use rustc::session::CompileIncomplete; use rustc::session::config::{self, Input, OutputFilenames, OutputType}; use rustc::session::search_paths::PathKind; use rustc::lint; -use rustc::middle::{self, dependency_format, stability, reachable}; +use rustc::middle::{self, stability, reachable}; +#[cfg(feature="llvm")] +use rustc::middle::dependency_format; use rustc::middle::privacy::AccessLevels; use rustc::mir::transform::{MIR_CONST, MIR_VALIDATED, MIR_OPTIMIZED, Passes}; use rustc::ty::{self, TyCtxt, Resolutions, GlobalArenas}; @@ -71,6 +73,11 @@ pub fn compile_input(sess: &Session, output: &Option, addl_plugins: Option>, control: &CompileController) -> CompileResult { + #[cfg(feature="llvm")] + use rustc_trans::back::write::OngoingCrateTranslation; + #[cfg(not(feature="llvm"))] + type OngoingCrateTranslation = (); + macro_rules! controller_entry_point { ($point: ident, $tsess: expr, $make_state: expr, $phase_result: expr) => {{ let state = &mut $make_state; @@ -90,7 +97,7 @@ pub fn compile_input(sess: &Session, // We need nested scopes here, because the intermediate results can keep // large chunks of memory alive and we want to free them as soon as // possible to keep the peak memory usage low - let (outputs, trans) = { + let (outputs, trans): (OutputFilenames, OngoingCrateTranslation) = { let krate = match phase_1_parse_input(control, sess, input) { Ok(krate) => krate, Err(mut parse_error) => { @@ -213,8 +220,6 @@ pub fn compile_input(sess: &Session, #[cfg(feature="llvm")] let trans = phase_4_translate_to_llvm(tcx, analysis, incremental_hashes_map, &outputs); - #[cfg(not(feature="llvm"))] - let trans = { panic!("LLVM not supported by this rustc."); () }; if log_enabled!(::log::LogLevel::Info) { println!("Post-trans"); @@ -228,12 +233,25 @@ pub fn compile_input(sess: &Session, } } + #[cfg(not(feature="llvm"))] + { + let _ = incremental_hashes_map; + sess.err(&format!("LLVM is not supported by this rustc")); + sess.abort_if_errors(); + unreachable!(); + } + + #[cfg(feature="llvm")] Ok((outputs, trans)) })?? }; #[cfg(not(feature="llvm"))] - unreachable!(); + { + let _ = outputs; + let _ = trans; + unreachable!(); + } #[cfg(feature="llvm")] { @@ -505,6 +523,7 @@ impl<'a, 'tcx> CompileState<'a, 'tcx> { } } + #[cfg(feature="llvm")] fn state_when_compilation_done(input: &'a Input, session: &'tcx Session, out_dir: &'a Option, @@ -1145,7 +1164,12 @@ fn write_out_deps(sess: &Session, outputs: &OutputFilenames, crate_name: &str) { match *output_type { OutputType::Exe => { for output in sess.crate_types.borrow().iter() { - let p = ::rustc_trans_utils::link::filename_for_input(sess, *output, crate_name, outputs); + let p = ::rustc_trans_utils::link::filename_for_input( + sess, + *output, + crate_name, + outputs + ); out_filenames.push(p); } } @@ -1263,7 +1287,7 @@ pub fn collect_crate_types(session: &Session, attrs: &[ast::Attribute]) -> Vec Result, String> { use std::fs::File; use std::io; @@ -185,11 +188,11 @@ impl MetadataLoader for NoLLvmMetadataLoader { 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() == METADATA_FILENAME { + if entry.header().identifier() == "rust.metadata.bin" { let mut buf = Vec::new(); io::copy(&mut entry, &mut buf).unwrap(); let buf: OwningRef, [u8]> = OwningRef::new(buf).into(); - return Ok(buf.erase_owner()); + return Ok(buf.map_owner_box().erase_owner()); } } @@ -197,8 +200,8 @@ impl MetadataLoader for NoLLvmMetadataLoader { } fn get_dylib_metadata(&self, - target: &Target, - filename: &Path) + _target: &Target, + _filename: &Path) -> Result, String> { panic!("Dylib metadata loading not supported without LLVM") } @@ -207,6 +210,7 @@ impl MetadataLoader for NoLLvmMetadataLoader { // Parse args and run the compiler. This is the primary entry point for rustc. // See comments on CompilerCalls below for details about the callbacks argument. // The FileLoader provides a way to load files from sources other than the file system. +#[cfg_attr(not(feature="llvm"), allow(unused_mut))] pub fn run_compiler<'a>(args: &[String], callbacks: &mut CompilerCalls<'a>, file_loader: Option>, @@ -516,6 +520,7 @@ impl<'a> CompilerCalls<'a> for RustcDefaultCalls { Compilation::Continue } + #[cfg_attr(not(feature="llvm"), allow(unused_mut))] fn no_input(&mut self, matches: &getopts::Matches, sopts: &config::Options, @@ -743,7 +748,12 @@ impl RustcDefaultCalls { } let crate_types = driver::collect_crate_types(sess, attrs); for &style in &crate_types { - let fname = rustc_trans_utils::link::filename_for_input(sess, style, &id, &t_outputs); + let fname = rustc_trans_utils::link::filename_for_input( + sess, + style, + &id, + &t_outputs + ); println!("{}", fname.file_name() .unwrap() @@ -792,7 +802,7 @@ impl RustcDefaultCalls { } PrintRequest::RelocationModels => { println!("Available relocation models:"); - #[cfg(features="llvm")] + #[cfg(feature="llvm")] for &(name, _) in RELOC_MODEL_ARGS.iter() { println!(" {}", name); } @@ -800,7 +810,7 @@ impl RustcDefaultCalls { } PrintRequest::CodeModels => { println!("Available code models:"); - #[cfg(features="llvm")] + #[cfg(feature="llvm")] for &(name, _) in CODE_GEN_MODEL_ARGS.iter(){ println!(" {}", name); } diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index e2db1721b26..a9bd8ea9010 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -88,7 +88,8 @@ pub const RLIB_BYTECODE_OBJECT_V1_DATASIZE_OFFSET: usize = pub const RLIB_BYTECODE_OBJECT_V1_DATA_OFFSET: usize = RLIB_BYTECODE_OBJECT_V1_DATASIZE_OFFSET + 8; -pub use self::rustc_trans_utils::link::{find_crate_name, filename_for_input, default_output_for_target, invalid_output_for_target}; +pub use self::rustc_trans_utils::link::{find_crate_name, filename_for_input, + default_output_for_target, invalid_output_for_target}; pub fn build_link_meta(incremental_hashes_map: &IncrementalHashesMap) -> LinkMeta { let krate_dep_node = &DepNode::new_no_params(DepKind::Krate);