@@ -31,25 +31,27 @@ use rustc::session::{config, DiagnosticOutput, Session};
3131use rustc:: session:: { early_error, early_warn} ;
3232use rustc:: ty:: TyCtxt ;
3333use rustc:: util:: common:: ErrorReported ;
34+ use rustc_codegen_ssa:: CodegenResults ;
3435use rustc_codegen_utils:: codegen_backend:: CodegenBackend ;
3536use rustc_data_structures:: profiling:: print_time_passes_entry;
3637use rustc_data_structures:: sync:: SeqCst ;
3738use rustc_errors:: { registry:: Registry , PResult } ;
3839use rustc_feature:: { find_gated_cfg, UnstableFeatures } ;
3940use rustc_hir:: def_id:: LOCAL_CRATE ;
40- use rustc_interface:: util:: get_builtin_codegen_backend;
41+ use rustc_interface:: util:: { collect_crate_types , get_builtin_codegen_backend} ;
4142use rustc_interface:: { interface, Queries } ;
4243use rustc_lint:: LintStore ;
4344use rustc_metadata:: locator;
4445use rustc_save_analysis as save;
4546use rustc_save_analysis:: DumpHandler ;
46- use rustc_serialize:: json:: ToJson ;
47+ use rustc_serialize:: json:: { self , ToJson } ;
4748
4849use std:: borrow:: Cow ;
4950use std:: cmp:: max;
5051use std:: default:: Default ;
5152use std:: env;
5253use std:: ffi:: OsString ;
54+ use std:: fs;
5355use std:: io:: { self , Read , Write } ;
5456use std:: mem;
5557use std:: panic:: { self , catch_unwind} ;
@@ -286,7 +288,8 @@ pub fn run_compiler(
286288 & matches,
287289 compiler. input ( ) ,
288290 )
289- } ) ;
291+ } )
292+ . and_then ( || RustcDefaultCalls :: try_process_rlink ( sess, compiler) ) ;
290293
291294 if should_stop == Compilation :: Stop {
292295 return sess. compile_status ( ) ;
@@ -593,6 +596,34 @@ fn show_content_with_pager(content: &String) {
593596}
594597
595598impl RustcDefaultCalls {
599+ fn process_rlink ( sess : & Session , compiler : & interface:: Compiler ) -> Result < ( ) , ErrorReported > {
600+ if let Input :: File ( file) = compiler. input ( ) {
601+ // FIXME: #![crate_type] and #![crate_name] support not implemented yet
602+ let attrs = vec ! [ ] ;
603+ sess. crate_types . set ( collect_crate_types ( sess, & attrs) ) ;
604+ let outputs = compiler. build_output_filenames ( & sess, & attrs) ;
605+ let rlink_data = fs:: read_to_string ( file) . unwrap_or_else ( |err| {
606+ sess. fatal ( & format ! ( "failed to read rlink file: {}" , err) ) ;
607+ } ) ;
608+ let codegen_results: CodegenResults = json:: decode ( & rlink_data) . unwrap_or_else ( |err| {
609+ sess. fatal ( & format ! ( "failed to decode rlink: {}" , err) ) ;
610+ } ) ;
611+ compiler. codegen_backend ( ) . link ( & sess, Box :: new ( codegen_results) , & outputs)
612+ } else {
613+ sess. fatal ( & format ! ( "rlink must be a file" ) )
614+ }
615+ }
616+
617+ pub fn try_process_rlink ( sess : & Session , compiler : & interface:: Compiler ) -> Compilation {
618+ if sess. opts . debugging_opts . link_only {
619+ let result = RustcDefaultCalls :: process_rlink ( sess, compiler) ;
620+ abort_on_err ( result, sess) ;
621+ Compilation :: Stop
622+ } else {
623+ Compilation :: Continue
624+ }
625+ }
626+
596627 pub fn list_metadata (
597628 sess : & Session ,
598629 metadata_loader : & dyn MetadataLoader ,
@@ -668,7 +699,7 @@ impl RustcDefaultCalls {
668699 println ! ( "{}" , id) ;
669700 continue ;
670701 }
671- let crate_types = rustc_interface :: util :: collect_crate_types ( sess, attrs) ;
702+ let crate_types = collect_crate_types ( sess, attrs) ;
672703 for & style in & crate_types {
673704 let fname = rustc_codegen_utils:: link:: filename_for_input (
674705 sess, style, & id, & t_outputs,
0 commit comments