2222#![ feature( box_syntax) ]
2323
2424use std:: any:: Any ;
25- use std:: io:: prelude:: * ;
26- use std:: io:: { self , Cursor } ;
25+ use std:: io:: { self , Write } ;
2726use std:: fs:: File ;
2827use std:: path:: Path ;
29- use std:: sync:: mpsc;
28+ use std:: sync:: { mpsc, Arc } ;
3029
3130use rustc_data_structures:: owning_ref:: OwningRef ;
3231use rustc_data_structures:: sync:: Lrc ;
33- use ar:: { Archive , Builder , Header } ;
3432use flate2:: Compression ;
3533use flate2:: write:: DeflateEncoder ;
3634
@@ -81,89 +79,21 @@ pub trait CodegenBackend {
8179 ) -> Result < ( ) , CompileIncomplete > ;
8280}
8381
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-
13882pub struct NoLlvmMetadataLoader ;
13983
14084impl MetadataLoader for NoLlvmMetadataLoader {
14185 fn get_rlib_metadata ( & self , _: & Target , filename : & Path ) -> Result < MetadataRef , String > {
142- let file = File :: open ( filename)
86+ let mut file = File :: open ( filename)
14387 . 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- }
15688
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( ) ) ) ;
15893 }
15994
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)
16797 }
16898}
16999
@@ -205,8 +135,13 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
205135 providers. target_features_whitelist = |_tcx, _cnum| {
206136 Lrc :: new ( FxHashMap ( ) ) // Just a dummy
207137 } ;
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 ;
208144 }
209- fn provide_extern ( & self , _providers : & mut Providers ) { }
210145
211146 fn codegen_crate < ' a , ' tcx > (
212147 & self ,
@@ -225,7 +160,8 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
225160 collector:: MonoItemCollectionMode :: Eager
226161 ) . 0 . iter ( )
227162 ) ;
228- :: rustc:: middle:: dependency_format:: calculate ( tcx) ;
163+ // FIXME: Fix this
164+ // ::rustc::middle::dependency_format::calculate(tcx);
229165 let _ = tcx. link_args ( LOCAL_CRATE ) ;
230166 let _ = tcx. native_libraries ( LOCAL_CRATE ) ;
231167 for mono_item in
@@ -280,9 +216,8 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
280216 } else {
281217 & ongoing_codegen. metadata . raw_data
282218 } ;
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 ( ) ;
286221 }
287222
288223 sess. abort_if_errors ( ) ;
0 commit comments