3
3
extern crate rustc_codegen_ssa;
4
4
extern crate rustc_errors;
5
5
extern crate rustc_middle;
6
- #[ macro_use]
7
6
extern crate rustc_data_structures;
8
7
extern crate rustc_driver;
9
8
extern crate rustc_hir;
@@ -12,17 +11,19 @@ extern crate rustc_span;
12
11
extern crate rustc_symbol_mangling;
13
12
extern crate rustc_target;
14
13
14
+ use rustc_codegen_ssa:: back:: linker:: LinkerInfo ;
15
15
use rustc_codegen_ssa:: traits:: CodegenBackend ;
16
- use rustc_data_structures:: owning_ref:: OwningRef ;
16
+ use rustc_codegen_ssa:: { CodegenResults , CrateInfo } ;
17
+ use rustc_data_structures:: fx:: FxHashMap ;
17
18
use rustc_data_structures:: sync:: MetadataRef ;
18
19
use rustc_errors:: ErrorReported ;
19
20
use rustc_middle:: dep_graph:: DepGraph ;
21
+ use rustc_middle:: dep_graph:: { WorkProduct , WorkProductId } ;
20
22
use rustc_middle:: middle:: cstore:: { EncodedMetadata , MetadataLoader , MetadataLoaderDyn } ;
21
23
use rustc_middle:: ty:: query:: Providers ;
22
24
use rustc_middle:: ty:: TyCtxt ;
23
25
use rustc_session:: config:: OutputFilenames ;
24
26
use rustc_session:: Session ;
25
- use rustc_span:: symbol:: Symbol ;
26
27
use rustc_target:: spec:: Target ;
27
28
use std:: any:: Any ;
28
29
use std:: path:: Path ;
@@ -31,14 +32,11 @@ pub struct NoLlvmMetadataLoader;
31
32
32
33
impl MetadataLoader for NoLlvmMetadataLoader {
33
34
fn get_rlib_metadata ( & self , _: & Target , filename : & Path ) -> Result < MetadataRef , String > {
34
- let buf =
35
- std:: fs:: read ( filename) . map_err ( |e| format ! ( "metadata file open err: {:?}" , e) ) ?;
36
- let buf: OwningRef < Vec < u8 > , [ u8 ] > = OwningRef :: new ( buf) ;
37
- Ok ( rustc_erase_owner ! ( buf. map_owner_box( ) ) )
35
+ unreachable ! ( "some_crate.rs shouldn't depend on any external crates" ) ;
38
36
}
39
37
40
38
fn get_dylib_metadata ( & self , target : & Target , filename : & Path ) -> Result < MetadataRef , String > {
41
- self . get_rlib_metadata ( target , filename )
39
+ unreachable ! ( "some_crate.rs shouldn't depend on any external crates" ) ;
42
40
}
43
41
}
44
42
@@ -49,53 +47,49 @@ impl CodegenBackend for TheBackend {
49
47
Box :: new ( NoLlvmMetadataLoader )
50
48
}
51
49
52
- fn provide ( & self , providers : & mut Providers ) {
53
- rustc_symbol_mangling:: provide ( providers) ;
54
-
55
- providers. supported_target_features = |tcx, _cnum| {
56
- Default :: default ( ) // Just a dummy
57
- } ;
58
- providers. is_reachable_non_generic = |_tcx, _defid| true ;
59
- providers. exported_symbols = |_tcx, _crate| & [ ] ;
60
- }
61
-
62
- fn provide_extern ( & self , providers : & mut Providers ) {
63
- providers. is_reachable_non_generic = |_tcx, _defid| true ;
64
- }
50
+ fn provide ( & self , providers : & mut Providers ) { }
51
+ fn provide_extern ( & self , providers : & mut Providers ) { }
65
52
66
53
fn codegen_crate < ' a , ' tcx > (
67
54
& self ,
68
55
tcx : TyCtxt < ' tcx > ,
69
- _metadata : EncodedMetadata ,
56
+ metadata : EncodedMetadata ,
70
57
_need_metadata_module : bool ,
71
58
) -> Box < dyn Any > {
72
59
use rustc_hir:: def_id:: LOCAL_CRATE ;
73
60
74
- Box :: new ( tcx. crate_name ( LOCAL_CRATE ) as Symbol )
61
+ Box :: new ( CodegenResults {
62
+ crate_name : tcx. crate_name ( LOCAL_CRATE ) ,
63
+ modules : vec ! [ ] ,
64
+ allocator_module : None ,
65
+ metadata_module : None ,
66
+ metadata,
67
+ windows_subsystem : None ,
68
+ linker_info : LinkerInfo :: new ( tcx) ,
69
+ crate_info : CrateInfo :: new ( tcx) ,
70
+ } )
75
71
}
76
72
77
73
fn join_codegen (
78
74
& self ,
79
75
ongoing_codegen : Box < dyn Any > ,
80
76
_sess : & Session ,
81
- _dep_graph : & DepGraph ,
82
- ) -> Result < Box < dyn Any > , ErrorReported > {
83
- let crate_name = ongoing_codegen
84
- . downcast :: < Symbol > ( )
85
- . expect ( "in join_codegen: ongoing_codegen is not a Symbol" ) ;
86
- Ok ( crate_name)
77
+ ) -> Result < ( CodegenResults , FxHashMap < WorkProductId , WorkProduct > ) , ErrorReported > {
78
+ let codegen_results = ongoing_codegen
79
+ . downcast :: < CodegenResults > ( )
80
+ . expect ( "in join_codegen: ongoing_codegen is not a CodegenResults" ) ;
81
+ Ok ( ( * codegen_results, FxHashMap :: default ( ) ) )
87
82
}
88
83
89
84
fn link (
90
85
& self ,
91
86
sess : & Session ,
92
- codegen_results : Box < dyn Any > ,
87
+ codegen_results : CodegenResults ,
93
88
outputs : & OutputFilenames ,
94
89
) -> Result < ( ) , ErrorReported > {
95
90
use rustc_session:: { config:: CrateType , output:: out_filename} ;
96
91
use std:: io:: Write ;
97
- let crate_name =
98
- codegen_results. downcast :: < Symbol > ( ) . expect ( "in link: codegen_results is not a Symbol" ) ;
92
+ let crate_name = codegen_results. crate_name ;
99
93
for & crate_type in sess. opts . crate_types . iter ( ) {
100
94
if crate_type != CrateType :: Rlib {
101
95
sess. fatal ( & format ! ( "Crate type is {:?}" , crate_type) ) ;
0 commit comments