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 ;
2928use std:: sync:: { mpsc, Arc } ;
3029
3130use rustc_data_structures:: owning_ref:: OwningRef ;
3231use rustc_data_structures:: sync:: Lrc ;
33- use ar:: { Archive , Builder , Header } ;
34- use flate2:: Compression ;
35- use flate2:: write:: DeflateEncoder ;
3632
3733use syntax:: symbol:: Symbol ;
3834use rustc:: hir:: def_id:: LOCAL_CRATE ;
@@ -80,96 +76,27 @@ pub trait CodegenBackend {
8076 ) -> Result < ( ) , CompileIncomplete > ;
8177}
8278
83- pub struct DummyCodegenBackend ;
84-
85- impl CodegenBackend for DummyCodegenBackend {
86- fn metadata_loader ( & self ) -> Box < MetadataLoader + Sync > {
87- box DummyMetadataLoader ( ( ) )
88- }
89-
90- fn provide ( & self , _providers : & mut Providers ) {
91- bug ! ( "DummyCodegenBackend::provide" ) ;
92- }
93-
94- fn provide_extern ( & self , _providers : & mut Providers ) {
95- bug ! ( "DummyCodegenBackend::provide_extern" ) ;
96- }
97-
98- fn codegen_crate < ' a , ' tcx > (
99- & self ,
100- _tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
101- _rx : mpsc:: Receiver < Box < Any + Send > >
102- ) -> Box < Any > {
103- bug ! ( "DummyCodegenBackend::codegen_backend" ) ;
104- }
105-
106- fn join_codegen_and_link (
107- & self ,
108- _ongoing_codegen : Box < Any > ,
109- _sess : & Session ,
110- _dep_graph : & DepGraph ,
111- _outputs : & OutputFilenames ,
112- ) -> Result < ( ) , CompileIncomplete > {
113- bug ! ( "DummyCodegenBackend::join_codegen_and_link" ) ;
114- }
115- }
116-
117- pub struct DummyMetadataLoader ( ( ) ) ;
118-
119- impl MetadataLoader for DummyMetadataLoader {
120- fn get_rlib_metadata (
121- & self ,
122- _target : & Target ,
123- _filename : & Path
124- ) -> Result < MetadataRef , String > {
125- bug ! ( "DummyMetadataLoader::get_rlib_metadata" ) ;
126- }
127-
128- fn get_dylib_metadata (
129- & self ,
130- _target : & Target ,
131- _filename : & Path
132- ) -> Result < MetadataRef , String > {
133- bug ! ( "DummyMetadataLoader::get_dylib_metadata" ) ;
134- }
135- }
136-
13779pub struct NoLlvmMetadataLoader ;
13880
13981impl MetadataLoader for NoLlvmMetadataLoader {
14082 fn get_rlib_metadata ( & self , _: & Target , filename : & Path ) -> Result < MetadataRef , String > {
141- let file = File :: open ( filename)
83+ let mut file = File :: open ( filename)
14284 . map_err ( |e| format ! ( "metadata file open err: {:?}" , e) ) ?;
143- let mut archive = Archive :: new ( file) ;
14485
145- while let Some ( entry_result) = archive. next_entry ( ) {
146- let mut entry = entry_result
147- . map_err ( |e| format ! ( "metadata section read err: {:?}" , e) ) ?;
148- if entry. header ( ) . identifier ( ) == "rust.metadata.bin" {
149- let mut buf = Vec :: new ( ) ;
150- io:: copy ( & mut entry, & mut buf) . unwrap ( ) ;
151- let buf: OwningRef < Vec < u8 > , [ u8 ] > = OwningRef :: new ( buf) . into ( ) ;
152- return Ok ( rustc_erase_owner ! ( buf. map_owner_box( ) ) ) ;
153- }
154- }
155-
156- Err ( "Couldn't find metadata section" . to_string ( ) )
86+ let mut buf = Vec :: new ( ) ;
87+ io:: copy ( & mut file, & mut buf) . unwrap ( ) ;
88+ let buf: OwningRef < Vec < u8 > , [ u8 ] > = OwningRef :: new ( buf) . into ( ) ;
89+ return Ok ( rustc_erase_owner ! ( buf. map_owner_box( ) ) ) ;
15790 }
15891
159- fn get_dylib_metadata (
160- & self ,
161- _target : & Target ,
162- _filename : & Path ,
163- ) -> Result < MetadataRef , String > {
164- // FIXME: Support reading dylibs from llvm enabled rustc
165- self . get_rlib_metadata ( _target, _filename)
92+ fn get_dylib_metadata ( & self , target : & Target , filename : & Path ) -> Result < MetadataRef , String > {
93+ self . get_rlib_metadata ( target, filename)
16694 }
16795}
16896
16997pub struct MetadataOnlyCodegenBackend ( ( ) ) ;
17098pub struct OngoingCodegen {
17199 metadata : EncodedMetadata ,
172- metadata_version : Vec < u8 > ,
173100 crate_name : Symbol ,
174101}
175102
@@ -257,7 +184,6 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
257184
258185 box OngoingCodegen {
259186 metadata : metadata,
260- metadata_version : tcx. metadata_encoding_version ( ) . to_vec ( ) ,
261187 crate_name : tcx. crate_name ( LOCAL_CRATE ) ,
262188 }
263189 }
@@ -277,18 +203,9 @@ impl CodegenBackend for MetadataOnlyCodegenBackend {
277203 }
278204 let output_name =
279205 out_filename ( sess, crate_type, & outputs, & ongoing_codegen. crate_name . as_str ( ) ) ;
280- let mut compressed = ongoing_codegen. metadata_version . clone ( ) ;
281- let metadata = if crate_type == CrateType :: CrateTypeDylib {
282- DeflateEncoder :: new ( & mut compressed, Compression :: fast ( ) )
283- . write_all ( & ongoing_codegen. metadata . raw_data )
284- . unwrap ( ) ;
285- & compressed
286- } else {
287- & ongoing_codegen. metadata . raw_data
288- } ;
289- let mut builder = Builder :: new ( File :: create ( & output_name) . unwrap ( ) ) ;
290- let header = Header :: new ( "rust.metadata.bin" . to_string ( ) , metadata. len ( ) as u64 ) ;
291- builder. append ( & header, Cursor :: new ( metadata) ) . unwrap ( ) ;
206+ let metadata = & ongoing_codegen. metadata . raw_data ;
207+ let mut file = File :: create ( & output_name) . unwrap ( ) ;
208+ file. write_all ( metadata) . unwrap ( ) ;
292209 }
293210
294211 sess. abort_if_errors ( ) ;
0 commit comments