@@ -26,25 +26,27 @@ use rustc::session::{config, DiagnosticOutput, Session};
2626use rustc:: session:: { early_error, early_warn} ;
2727use rustc:: ty:: TyCtxt ;
2828use rustc:: util:: common:: ErrorReported ;
29+ use rustc_codegen_ssa:: CodegenResults ;
2930use rustc_codegen_utils:: codegen_backend:: CodegenBackend ;
3031use rustc_data_structures:: profiling:: print_time_passes_entry;
3132use rustc_data_structures:: sync:: SeqCst ;
3233use rustc_errors:: { registry:: Registry , PResult } ;
3334use rustc_feature:: { find_gated_cfg, UnstableFeatures } ;
3435use rustc_hir:: def_id:: LOCAL_CRATE ;
35- use rustc_interface:: util:: get_builtin_codegen_backend;
36+ use rustc_interface:: util:: { collect_crate_types , get_builtin_codegen_backend} ;
3637use rustc_interface:: { interface, Queries } ;
3738use rustc_lint:: LintStore ;
3839use rustc_metadata:: locator;
3940use rustc_save_analysis as save;
4041use rustc_save_analysis:: DumpHandler ;
41- use rustc_serialize:: json:: ToJson ;
42+ use rustc_serialize:: json:: { self , ToJson } ;
4243
4344use std:: borrow:: Cow ;
4445use std:: cmp:: max;
4546use std:: default:: Default ;
4647use std:: env;
4748use std:: ffi:: OsString ;
49+ use std:: fs;
4850use std:: io:: { self , Read , Write } ;
4951use std:: mem;
5052use std:: panic:: { self , catch_unwind} ;
@@ -281,7 +283,8 @@ pub fn run_compiler(
281283 & matches,
282284 compiler. input ( ) ,
283285 )
284- } ) ;
286+ } )
287+ . and_then ( || RustcDefaultCalls :: try_process_rlink ( sess, compiler) ) ;
285288
286289 if should_stop == Compilation :: Stop {
287290 return sess. compile_status ( ) ;
@@ -588,6 +591,34 @@ fn show_content_with_pager(content: &String) {
588591}
589592
590593impl RustcDefaultCalls {
594+ fn process_rlink ( sess : & Session , compiler : & interface:: Compiler ) -> Result < ( ) , ErrorReported > {
595+ if let Input :: File ( file) = compiler. input ( ) {
596+ // FIXME: #![crate_type] and #![crate_name] support not implemented yet
597+ let attrs = vec ! [ ] ;
598+ sess. crate_types . set ( collect_crate_types ( sess, & attrs) ) ;
599+ let outputs = compiler. build_output_filenames ( & sess, & attrs) ;
600+ let rlink_data = fs:: read_to_string ( file) . unwrap_or_else ( |err| {
601+ sess. fatal ( & format ! ( "failed to read rlink file: {}" , err) ) ;
602+ } ) ;
603+ let codegen_results: CodegenResults = json:: decode ( & rlink_data) . unwrap_or_else ( |err| {
604+ sess. fatal ( & format ! ( "failed to decode rlink: {}" , err) ) ;
605+ } ) ;
606+ compiler. codegen_backend ( ) . link ( & sess, Box :: new ( codegen_results) , & outputs)
607+ } else {
608+ sess. fatal ( & format ! ( "rlink must be a file" ) )
609+ }
610+ }
611+
612+ pub fn try_process_rlink ( sess : & Session , compiler : & interface:: Compiler ) -> Compilation {
613+ if sess. opts . debugging_opts . link_only {
614+ let result = RustcDefaultCalls :: process_rlink ( sess, compiler) ;
615+ abort_on_err ( result, sess) ;
616+ Compilation :: Stop
617+ } else {
618+ Compilation :: Continue
619+ }
620+ }
621+
591622 pub fn list_metadata (
592623 sess : & Session ,
593624 metadata_loader : & dyn MetadataLoader ,
@@ -663,7 +694,7 @@ impl RustcDefaultCalls {
663694 println ! ( "{}" , id) ;
664695 continue ;
665696 }
666- let crate_types = rustc_interface :: util :: collect_crate_types ( sess, attrs) ;
697+ let crate_types = collect_crate_types ( sess, attrs) ;
667698 for & style in & crate_types {
668699 let fname = rustc_codegen_utils:: link:: filename_for_input (
669700 sess, style, & id, & t_outputs,
0 commit comments