@@ -27,8 +27,7 @@ use rustc_middle::ty::codec::TyEncoder;
27
27
use rustc_middle:: ty:: fast_reject:: { self , SimplifiedType , TreatParams } ;
28
28
use rustc_middle:: ty:: query:: Providers ;
29
29
use 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 } ;
32
31
use rustc_session:: config:: CrateType ;
33
32
use rustc_session:: cstore:: { ForeignModule , LinkagePreference , NativeLib } ;
34
33
use rustc_span:: hygiene:: { ExpnIndex , HygieneEncodeContext , MacroKind } ;
@@ -41,10 +40,11 @@ use std::borrow::Borrow;
41
40
use std:: hash:: Hash ;
42
41
use std:: iter;
43
42
use std:: num:: NonZeroUsize ;
43
+ use std:: path:: Path ;
44
44
use tracing:: { debug, trace} ;
45
45
46
46
pub ( super ) struct EncodeContext < ' a , ' tcx > {
47
- opaque : MemEncoder ,
47
+ opaque : opaque :: FileEncoder ,
48
48
tcx : TyCtxt < ' tcx > ,
49
49
feat : & ' tcx rustc_feature:: Features ,
50
50
@@ -730,25 +730,26 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
730
730
assert_eq ! ( total_bytes, computed_total_bytes) ;
731
731
732
732
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
+ // }
739
739
740
740
let perc = |bytes| ( bytes * 100 ) as f64 / total_bytes as f64 ;
741
741
let p = |label, bytes| {
742
742
eprintln ! ( "{:>21}: {:>8} bytes ({:4.1}%)" , label, bytes, perc( bytes) ) ;
743
743
} ;
744
744
745
745
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
+ //);
752
753
p ( "preamble" , preamble_bytes) ;
753
754
p ( "dep" , dep_bytes) ;
754
755
p ( "lib feature" , lib_feature_bytes) ;
@@ -2151,15 +2152,15 @@ impl EncodedMetadata {
2151
2152
}
2152
2153
}
2153
2154
2154
- pub fn encode_metadata ( tcx : TyCtxt < ' _ > ) -> EncodedMetadata {
2155
+ pub fn encode_metadata ( tcx : TyCtxt < ' _ > , path : impl AsRef < Path > ) -> EncodedMetadata {
2155
2156
let _prof_timer = tcx. prof . verbose_generic_activity ( "generate_crate_metadata" ) ;
2156
2157
2157
2158
// Since encoding metadata is not in a query, and nothing is cached,
2158
2159
// there's no need to do dep-graph tracking for any of it.
2159
2160
tcx. dep_graph . assert_ignored ( ) ;
2160
2161
2161
2162
join (
2162
- || encode_metadata_impl ( tcx) ,
2163
+ || encode_metadata_impl ( tcx, path ) ,
2163
2164
|| {
2164
2165
if tcx. sess . threads ( ) == 1 {
2165
2166
return ;
@@ -2173,8 +2174,9 @@ pub fn encode_metadata(tcx: TyCtxt<'_>) -> EncodedMetadata {
2173
2174
. 0
2174
2175
}
2175
2176
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) ) ) ;
2178
2180
encoder. emit_raw_bytes ( METADATA_HEADER ) ;
2179
2181
2180
2182
// Will be filled with the root position after encoding everything.
@@ -2209,7 +2211,8 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
2209
2211
// culminating in the `CrateRoot` which points to all of it.
2210
2212
let root = ecx. encode_crate_root ( ) ;
2211
2213
2212
- let mut result = ecx. opaque . finish ( ) ;
2214
+ ecx. opaque . flush ( ) ;
2215
+ let mut result = std:: fs:: read ( path. as_ref ( ) ) . unwrap ( ) ;
2213
2216
2214
2217
// Encode the root position.
2215
2218
let header = METADATA_HEADER . len ( ) ;
@@ -2219,6 +2222,8 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
2219
2222
result[ header + 2 ] = ( pos >> 8 ) as u8 ;
2220
2223
result[ header + 3 ] = ( pos >> 0 ) as u8 ;
2221
2224
2225
+ std:: fs:: write ( path, & result) . unwrap ( ) ;
2226
+
2222
2227
// Record metadata size for self-profiling
2223
2228
tcx. prof . artifact_size ( "crate_metadata" , "crate_metadata" , result. len ( ) as u64 ) ;
2224
2229
0 commit comments