@@ -27,8 +27,7 @@ use rustc_middle::ty::codec::TyEncoder;
2727use rustc_middle:: ty:: fast_reject:: { self , SimplifiedType , TreatParams } ;
2828use rustc_middle:: ty:: query:: Providers ;
2929use rustc_middle:: ty:: { self , SymbolName , Ty , TyCtxt } ;
30- use rustc_serialize:: opaque:: MemEncoder ;
31- use rustc_serialize:: { Encodable , Encoder } ;
30+ use rustc_serialize:: { opaque, Encodable , Encoder } ;
3231use rustc_session:: config:: CrateType ;
3332use rustc_session:: cstore:: { ForeignModule , LinkagePreference , NativeLib } ;
3433use rustc_span:: hygiene:: { ExpnIndex , HygieneEncodeContext , MacroKind } ;
@@ -41,10 +40,11 @@ use std::borrow::Borrow;
4140use std:: hash:: Hash ;
4241use std:: iter;
4342use std:: num:: NonZeroUsize ;
43+ use std:: path:: Path ;
4444use tracing:: { debug, trace} ;
4545
4646pub ( super ) struct EncodeContext < ' a , ' tcx > {
47- opaque : MemEncoder ,
47+ opaque : opaque :: FileEncoder ,
4848 tcx : TyCtxt < ' tcx > ,
4949 feat : & ' tcx rustc_feature:: Features ,
5050
@@ -730,25 +730,26 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
730730 assert_eq ! ( total_bytes, computed_total_bytes) ;
731731
732732 if tcx. sess . meta_stats ( ) {
733- let mut zero_bytes = 0 ;
734- for e in self . opaque . data . iter ( ) {
735- if * e == 0 {
736- zero_bytes += 1 ;
737- }
738- }
733+ // let mut zero_bytes = 0;
734+ // for e in self.opaque.data.iter() {
735+ // if *e == 0 {
736+ // zero_bytes += 1;
737+ // }
738+ // }
739739
740740 let perc = |bytes| ( bytes * 100 ) as f64 / total_bytes as f64 ;
741741 let p = |label, bytes| {
742742 eprintln ! ( "{:>21}: {:>8} bytes ({:4.1}%)" , label, bytes, perc( bytes) ) ;
743743 } ;
744744
745745 eprintln ! ( "" ) ;
746- eprintln ! (
747- "{} metadata bytes, of which {} bytes ({:.1}%) are zero" ,
748- total_bytes,
749- zero_bytes,
750- perc( zero_bytes)
751- ) ;
746+ // FIXME print zero bytes
747+ //eprintln!(
748+ // "{} metadata bytes, of which {} bytes ({:.1}%) are zero",
749+ // total_bytes,
750+ // zero_bytes,
751+ // perc(zero_bytes)
752+ //);
752753 p ( "preamble" , preamble_bytes) ;
753754 p ( "dep" , dep_bytes) ;
754755 p ( "lib feature" , lib_feature_bytes) ;
@@ -2151,15 +2152,15 @@ impl EncodedMetadata {
21512152 }
21522153}
21532154
2154- pub fn encode_metadata ( tcx : TyCtxt < ' _ > ) -> EncodedMetadata {
2155+ pub fn encode_metadata ( tcx : TyCtxt < ' _ > , path : impl AsRef < Path > ) -> EncodedMetadata {
21552156 let _prof_timer = tcx. prof . verbose_generic_activity ( "generate_crate_metadata" ) ;
21562157
21572158 // Since encoding metadata is not in a query, and nothing is cached,
21582159 // there's no need to do dep-graph tracking for any of it.
21592160 tcx. dep_graph . assert_ignored ( ) ;
21602161
21612162 join (
2162- || encode_metadata_impl ( tcx) ,
2163+ || encode_metadata_impl ( tcx, path ) ,
21632164 || {
21642165 if tcx. sess . threads ( ) == 1 {
21652166 return ;
@@ -2173,8 +2174,9 @@ pub fn encode_metadata(tcx: TyCtxt<'_>) -> EncodedMetadata {
21732174 . 0
21742175}
21752176
2176- fn encode_metadata_impl ( tcx : TyCtxt < ' _ > ) -> EncodedMetadata {
2177- let mut encoder = MemEncoder :: new ( ) ;
2177+ fn encode_metadata_impl ( tcx : TyCtxt < ' _ > , path : impl AsRef < Path > ) -> EncodedMetadata {
2178+ let mut encoder = opaque:: FileEncoder :: new ( path. as_ref ( ) )
2179+ . unwrap_or_else ( |err| tcx. sess . fatal ( & format ! ( "failed to create file encoder: {}" , err) ) ) ;
21782180 encoder. emit_raw_bytes ( METADATA_HEADER ) ;
21792181
21802182 // Will be filled with the root position after encoding everything.
@@ -2209,7 +2211,8 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
22092211 // culminating in the `CrateRoot` which points to all of it.
22102212 let root = ecx. encode_crate_root ( ) ;
22112213
2212- let mut result = ecx. opaque . finish ( ) ;
2214+ ecx. opaque . flush ( ) ;
2215+ let mut result = std:: fs:: read ( path. as_ref ( ) ) . unwrap ( ) ;
22132216
22142217 // Encode the root position.
22152218 let header = METADATA_HEADER . len ( ) ;
@@ -2219,6 +2222,8 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
22192222 result[ header + 2 ] = ( pos >> 8 ) as u8 ;
22202223 result[ header + 3 ] = ( pos >> 0 ) as u8 ;
22212224
2225+ std:: fs:: write ( path, & result) . unwrap ( ) ;
2226+
22222227 // Record metadata size for self-profiling
22232228 tcx. prof . artifact_size ( "crate_metadata" , "crate_metadata" , result. len ( ) as u64 ) ;
22242229
0 commit comments