]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_driver/lib.rs
Auto merge of #69156 - ecstatic-morse:unified-dataflow-impls2, r=eddyb
[rust.git] / src / librustc_driver / lib.rs
index 019ff431bcb97d2f56ecfc05a6abba63aff89134..f68ea7e0770324bb9fb3fc2c4e4c94769b43f723 100644 (file)
@@ -5,12 +5,7 @@
 //! This API is completely unstable and subject to change.
 
 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
-#![feature(box_syntax)]
-#![cfg_attr(unix, feature(libc))]
 #![feature(nll)]
-#![feature(set_stdio)]
-#![feature(no_debug)]
-#![feature(integer_atomics)]
 #![recursion_limit = "256"]
 
 pub extern crate getopts;
 use rustc::session::{early_error, early_warn};
 use rustc::ty::TyCtxt;
 use rustc::util::common::ErrorReported;
+use rustc_codegen_ssa::CodegenResults;
 use rustc_codegen_utils::codegen_backend::CodegenBackend;
 use rustc_data_structures::profiling::print_time_passes_entry;
 use rustc_data_structures::sync::SeqCst;
 use rustc_errors::{registry::Registry, PResult};
 use rustc_feature::{find_gated_cfg, UnstableFeatures};
 use rustc_hir::def_id::LOCAL_CRATE;
-use rustc_interface::util::get_builtin_codegen_backend;
+use rustc_interface::util::{collect_crate_types, get_builtin_codegen_backend};
 use rustc_interface::{interface, Queries};
 use rustc_lint::LintStore;
 use rustc_metadata::locator;
 use rustc_save_analysis as save;
 use rustc_save_analysis::DumpHandler;
-use rustc_serialize::json::ToJson;
+use rustc_serialize::json::{self, ToJson};
 
 use std::borrow::Cow;
 use std::cmp::max;
 use std::default::Default;
 use std::env;
 use std::ffi::OsString;
+use std::fs;
 use std::io::{self, Read, Write};
 use std::mem;
 use std::panic::{self, catch_unwind};
@@ -123,10 +120,6 @@ fn after_analysis<'tcx>(
     }
 }
 
-pub struct DefaultCallbacks;
-
-impl Callbacks for DefaultCallbacks {}
-
 #[derive(Default)]
 pub struct TimePassesCallbacks {
     time_passes: bool,
@@ -286,7 +279,8 @@ pub fn run_compiler(
                 &matches,
                 compiler.input(),
             )
-        });
+        })
+        .and_then(|| RustcDefaultCalls::try_process_rlink(sess, compiler));
 
         if should_stop == Compilation::Stop {
             return sess.compile_status();
@@ -593,6 +587,34 @@ fn show_content_with_pager(content: &String) {
 }
 
 impl RustcDefaultCalls {
+    fn process_rlink(sess: &Session, compiler: &interface::Compiler) -> Result<(), ErrorReported> {
+        if let Input::File(file) = compiler.input() {
+            // FIXME: #![crate_type] and #![crate_name] support not implemented yet
+            let attrs = vec![];
+            sess.crate_types.set(collect_crate_types(sess, &attrs));
+            let outputs = compiler.build_output_filenames(&sess, &attrs);
+            let rlink_data = fs::read_to_string(file).unwrap_or_else(|err| {
+                sess.fatal(&format!("failed to read rlink file: {}", err));
+            });
+            let codegen_results: CodegenResults = json::decode(&rlink_data).unwrap_or_else(|err| {
+                sess.fatal(&format!("failed to decode rlink: {}", err));
+            });
+            compiler.codegen_backend().link(&sess, Box::new(codegen_results), &outputs)
+        } else {
+            sess.fatal(&format!("rlink must be a file"))
+        }
+    }
+
+    pub fn try_process_rlink(sess: &Session, compiler: &interface::Compiler) -> Compilation {
+        if sess.opts.debugging_opts.link_only {
+            let result = RustcDefaultCalls::process_rlink(sess, compiler);
+            abort_on_err(result, sess);
+            Compilation::Stop
+        } else {
+            Compilation::Continue
+        }
+    }
+
     pub fn list_metadata(
         sess: &Session,
         metadata_loader: &dyn MetadataLoader,
@@ -668,7 +690,7 @@ fn print_crate_info(
                         println!("{}", id);
                         continue;
                     }
-                    let crate_types = rustc_interface::util::collect_crate_types(sess, attrs);
+                    let crate_types = collect_crate_types(sess, attrs);
                     for &style in &crate_types {
                         let fname = rustc_codegen_utils::link::filename_for_input(
                             sess, style, &id, &t_outputs,