22
22
#![ feature( box_syntax) ]
23
23
24
24
use std:: any:: Any ;
25
- use std:: io:: prelude:: * ;
26
- use std:: io:: { self , Cursor } ;
25
+ use std:: io:: { self , Write } ;
27
26
use std:: fs:: File ;
28
27
use std:: path:: Path ;
29
- use std:: sync:: mpsc;
28
+ use std:: sync:: { mpsc, Arc } ;
30
29
31
30
use rustc_data_structures:: owning_ref:: OwningRef ;
32
31
use rustc_data_structures:: sync:: Lrc ;
33
- use ar:: { Archive , Builder , Header } ;
34
32
use flate2:: Compression ;
35
33
use flate2:: write:: DeflateEncoder ;
36
34
@@ -81,89 +79,21 @@ pub trait CodegenBackend {
81
79
) -> Result < ( ) , CompileIncomplete > ;
82
80
}
83
81
84
- pub struct DummyCodegenBackend ;
85
-
86
- impl CodegenBackend for DummyCodegenBackend {
87
- fn metadata_loader ( & self ) -> Box < MetadataLoader + Sync > {
88
- box DummyMetadataLoader ( ( ) )
89
- }
90
-
91
- fn provide ( & self , _providers : & mut Providers ) {
92
- bug ! ( "DummyCodegenBackend::provide" ) ;
93
- }
94
-
95
- fn provide_extern ( & self , _providers : & mut Providers ) {
96
- bug ! ( "DummyCodegenBackend::provide_extern" ) ;
97
- }
98
-
99
- fn codegen_crate < ' a , ' tcx > (
100
- & self ,
101
- _tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
102
- _rx : mpsc:: Receiver < Box < Any + Send > >
103
- ) -> Box < Any > {
104
- bug ! ( "DummyCodegenBackend::codegen_backend" ) ;
105
- }
106
-
107
- fn join_codegen_and_link (
108
- & self ,
109
- _ongoing_codegen : Box < Any > ,
110
- _sess : & Session ,
111
- _dep_graph : & DepGraph ,
112
- _outputs : & OutputFilenames ,
113
- ) -> Result < ( ) , CompileIncomplete > {
114
- bug ! ( "DummyCodegenBackend::join_codegen_and_link" ) ;
115
- }
116
- }
117
-
118
- pub struct DummyMetadataLoader ( ( ) ) ;
119
-
120
- impl MetadataLoader for DummyMetadataLoader {
121
- fn get_rlib_metadata (
122
- & self ,
123
- _target : & Target ,
124
- _filename : & Path
125
- ) -> Result < MetadataRef , String > {
126
- bug ! ( "DummyMetadataLoader::get_rlib_metadata" ) ;
127
- }
128
-
129
- fn get_dylib_metadata (
130
- & self ,
131
- _target : & Target ,
132
- _filename : & Path
133
- ) -> Result < MetadataRef , String > {
134
- bug ! ( "DummyMetadataLoader::get_dylib_metadata" ) ;
135
- }
136
- }
137
-
138
82
pub struct NoLlvmMetadataLoader ;
139
83
140
84
impl MetadataLoader for NoLlvmMetadataLoader {
141
85
fn get_rlib_metadata ( & self , _: & Target , filename : & Path ) -> Result < MetadataRef , String > {
142
- let file = File :: open ( filename)
86
+ let mut file = File :: open ( filename)
143
87
. map_err ( |e| format ! ( "metadata file open err: {:?}" , e) ) ?;
144
- let mut archive = Archive :: new ( file) ;
145
-
146
- while let Some ( entry_result) = archive. next_entry ( ) {
147
- let mut entry = entry_result
148
- . map_err ( |e| format ! ( "metadata section read err: {:?}" , e) ) ?;
149
- if entry. header ( ) . identifier ( ) == "rust.metadata.bin" {
150
- let mut buf = Vec :: new ( ) ;
151
- io:: copy ( & mut entry, & mut buf) . unwrap ( ) ;
152
- let buf: OwningRef < Vec < u8 > , [ u8 ] > = OwningRef :: new ( buf) . into ( ) ;
153
- return Ok ( rustc_erase_owner ! ( buf. map_owner_box( ) ) ) ;
154
- }
155
- }
156
88
157
- Err ( "Couldn't find metadata section" . to_string ( ) )
89
+ let mut buf = Vec :: new ( ) ;
90
+ io:: copy ( & mut file, & mut buf) . unwrap ( ) ;
91
+ let buf: OwningRef < Vec < u8 > , [ u8 ] > = OwningRef :: new ( buf) . into ( ) ;
92
+ return Ok ( rustc_erase_owner ! ( buf. map_owner_box( ) ) ) ;
158
93
}
159
94
160
- fn get_dylib_metadata (
161
- & self ,
162
- _target : & Target ,
163
- _filename : & Path ,
164
- ) -> Result < MetadataRef , String > {
165
- // FIXME: Support reading dylibs from llvm enabled rustc
166
- self . get_rlib_metadata ( _target, _filename)
95
+ fn get_dylib_metadata ( & self , target : & Target , filename : & Path ) -> Result < MetadataRef , String > {
96
+ self . get_rlib_metadata ( target, filename)
167
97
}
168
98
}
169
99
@@ -205,8 +135,13 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
205
135
providers. target_features_whitelist = |_tcx, _cnum| {
206
136
Lrc :: new ( FxHashMap ( ) ) // Just a dummy
207
137
} ;
138
+ providers. is_reachable_non_generic = |_tcx, _defid| true ;
139
+ providers. exported_symbols = |_tcx, _crate| Arc :: new ( Vec :: new ( ) ) ;
140
+ providers. wasm_custom_sections = |_tcx, _crate| Lrc :: new ( Vec :: new ( ) ) ;
141
+ }
142
+ fn provide_extern ( & self , providers : & mut Providers ) {
143
+ providers. is_reachable_non_generic = |_tcx, _defid| true ;
208
144
}
209
- fn provide_extern ( & self , _providers : & mut Providers ) { }
210
145
211
146
fn codegen_crate < ' a , ' tcx > (
212
147
& self ,
@@ -225,7 +160,8 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
225
160
collector:: MonoItemCollectionMode :: Eager
226
161
) . 0 . iter ( )
227
162
) ;
228
- :: rustc:: middle:: dependency_format:: calculate ( tcx) ;
163
+ // FIXME: Fix this
164
+ // ::rustc::middle::dependency_format::calculate(tcx);
229
165
let _ = tcx. link_args ( LOCAL_CRATE ) ;
230
166
let _ = tcx. native_libraries ( LOCAL_CRATE ) ;
231
167
for mono_item in
@@ -280,9 +216,8 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
280
216
} else {
281
217
& ongoing_codegen. metadata . raw_data
282
218
} ;
283
- let mut builder = Builder :: new ( File :: create ( & output_name) . unwrap ( ) ) ;
284
- let header = Header :: new ( "rust.metadata.bin" . to_string ( ) , metadata. len ( ) as u64 ) ;
285
- builder. append ( & header, Cursor :: new ( metadata) ) . unwrap ( ) ;
219
+ let mut file = File :: create ( & output_name) . unwrap ( ) ;
220
+ file. write_all ( metadata) . unwrap ( ) ;
286
221
}
287
222
288
223
sess. abort_if_errors ( ) ;
0 commit comments