@@ -31,25 +31,27 @@ use rustc::session::{config, DiagnosticOutput, Session};
31
31
use rustc:: session:: { early_error, early_warn} ;
32
32
use rustc:: ty:: TyCtxt ;
33
33
use rustc:: util:: common:: ErrorReported ;
34
+ use rustc_codegen_ssa:: CodegenResults ;
34
35
use rustc_codegen_utils:: codegen_backend:: CodegenBackend ;
35
36
use rustc_data_structures:: profiling:: print_time_passes_entry;
36
37
use rustc_data_structures:: sync:: SeqCst ;
37
38
use rustc_errors:: { registry:: Registry , PResult } ;
38
39
use rustc_feature:: { find_gated_cfg, UnstableFeatures } ;
39
40
use 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} ;
41
42
use rustc_interface:: { interface, Queries } ;
42
43
use rustc_lint:: LintStore ;
43
44
use rustc_metadata:: locator;
44
45
use rustc_save_analysis as save;
45
46
use rustc_save_analysis:: DumpHandler ;
46
- use rustc_serialize:: json:: ToJson ;
47
+ use rustc_serialize:: json:: { self , ToJson } ;
47
48
48
49
use std:: borrow:: Cow ;
49
50
use std:: cmp:: max;
50
51
use std:: default:: Default ;
51
52
use std:: env;
52
53
use std:: ffi:: OsString ;
54
+ use std:: fs;
53
55
use std:: io:: { self , Read , Write } ;
54
56
use std:: mem;
55
57
use std:: panic:: { self , catch_unwind} ;
@@ -286,7 +288,8 @@ pub fn run_compiler(
286
288
& matches,
287
289
compiler. input ( ) ,
288
290
)
289
- } ) ;
291
+ } )
292
+ . and_then ( || RustcDefaultCalls :: try_process_rlink ( sess, compiler) ) ;
290
293
291
294
if should_stop == Compilation :: Stop {
292
295
return sess. compile_status ( ) ;
@@ -593,6 +596,34 @@ fn show_content_with_pager(content: &String) {
593
596
}
594
597
595
598
impl 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
+
596
627
pub fn list_metadata (
597
628
sess : & Session ,
598
629
metadata_loader : & dyn MetadataLoader ,
@@ -668,7 +699,7 @@ impl RustcDefaultCalls {
668
699
println ! ( "{}" , id) ;
669
700
continue ;
670
701
}
671
- let crate_types = rustc_interface :: util :: collect_crate_types ( sess, attrs) ;
702
+ let crate_types = collect_crate_types ( sess, attrs) ;
672
703
for & style in & crate_types {
673
704
let fname = rustc_codegen_utils:: link:: filename_for_input (
674
705
sess, style, & id, & t_outputs,
0 commit comments