@@ -2136,18 +2136,24 @@ fn prefetch_mir(tcx: TyCtxt<'_>) {
2136
2136
2137
2137
#[ derive( Encodable , Decodable ) ]
2138
2138
pub struct EncodedMetadata {
2139
- raw_data : Vec < u8 > ,
2139
+ full : Vec < u8 > ,
2140
+ reference : Option < Vec < u8 > > ,
2140
2141
}
2141
2142
2142
2143
impl EncodedMetadata {
2143
2144
#[ inline]
2144
2145
pub fn new ( ) -> EncodedMetadata {
2145
- EncodedMetadata { raw_data : Vec :: new ( ) }
2146
+ EncodedMetadata { full : Vec :: new ( ) , reference : None }
2146
2147
}
2147
2148
2148
2149
#[ inline]
2149
- pub fn raw_data ( & self ) -> & [ u8 ] {
2150
- & self . raw_data
2150
+ pub fn full ( & self ) -> & [ u8 ] {
2151
+ & self . full
2152
+ }
2153
+
2154
+ #[ inline]
2155
+ pub fn maybe_reference ( & self ) -> & [ u8 ] {
2156
+ self . reference . as_ref ( ) . unwrap_or ( & self . full )
2151
2157
}
2152
2158
}
2153
2159
@@ -2173,20 +2179,26 @@ pub fn encode_metadata(tcx: TyCtxt<'_>) -> EncodedMetadata {
2173
2179
. 0
2174
2180
}
2175
2181
2176
- fn encode_metadata_impl ( tcx : TyCtxt < ' _ > ) -> EncodedMetadata {
2182
+ fn encode_metadata_header < ' a , ' tcx > (
2183
+ tcx : TyCtxt < ' tcx > ,
2184
+ hygiene_ctxt : & ' a HygieneEncodeContext ,
2185
+ ) -> EncodeContext < ' a , ' tcx > {
2177
2186
let mut encoder = opaque:: Encoder :: new ( vec ! [ ] ) ;
2178
2187
encoder. emit_raw_bytes ( METADATA_HEADER ) . unwrap ( ) ;
2179
2188
2189
+ encoder. emit_raw_bytes ( & tcx. crate_hash ( LOCAL_CRATE ) . as_u64 ( ) . to_le_bytes ( ) ) . unwrap ( ) ;
2190
+
2180
2191
// Will be filled with the root position after encoding everything.
2181
2192
encoder. emit_raw_bytes ( & [ 0 , 0 , 0 , 0 ] ) . unwrap ( ) ;
2182
2193
2194
+ // Reserved for future extension
2195
+ encoder. emit_raw_bytes ( & [ 0 , 0 , 0 , 0 ] ) . unwrap ( ) ;
2196
+
2183
2197
let source_map_files = tcx. sess . source_map ( ) . files ( ) ;
2184
2198
let source_file_cache = ( source_map_files[ 0 ] . clone ( ) , 0 ) ;
2185
2199
let required_source_files = Some ( GrowableBitSet :: with_capacity ( source_map_files. len ( ) ) ) ;
2186
2200
drop ( source_map_files) ;
2187
2201
2188
- let hygiene_ctxt = HygieneEncodeContext :: default ( ) ;
2189
-
2190
2202
let mut ecx = EncodeContext {
2191
2203
opaque : encoder,
2192
2204
tcx,
@@ -2199,27 +2211,43 @@ fn encode_metadata_impl(tcx: TyCtxt<'_>) -> EncodedMetadata {
2199
2211
interpret_allocs : Default :: default ( ) ,
2200
2212
required_source_files,
2201
2213
is_proc_macro : tcx. sess . crate_types ( ) . contains ( & CrateType :: ProcMacro ) ,
2202
- hygiene_ctxt : & hygiene_ctxt ,
2214
+ hygiene_ctxt,
2203
2215
} ;
2204
2216
2205
2217
// Encode the rustc version string in a predictable location.
2206
2218
rustc_version ( ) . encode ( & mut ecx) . unwrap ( ) ;
2207
2219
2220
+ ecx
2221
+ }
2222
+
2223
+ fn encode_metadata_impl ( tcx : TyCtxt < ' _ > ) -> EncodedMetadata {
2224
+ let hygiene_ctxt = HygieneEncodeContext :: default ( ) ;
2225
+ let mut ecx = encode_metadata_header ( tcx, & hygiene_ctxt) ;
2226
+
2208
2227
// Encode all the entries and extra information in the crate,
2209
2228
// culminating in the `CrateRoot` which points to all of it.
2210
2229
let root = ecx. encode_crate_root ( ) ;
2211
2230
2212
2231
let mut result = ecx. opaque . into_inner ( ) ;
2213
2232
2214
2233
// Encode the root position.
2215
- let header = METADATA_HEADER . len ( ) ;
2234
+ let header = METADATA_HEADER . len ( ) + 8 ;
2216
2235
let pos = root. position . get ( ) ;
2217
2236
result[ header..header + 4 ] . copy_from_slice ( & pos. to_le_bytes ( ) ) ;
2218
2237
2219
2238
// Record metadata size for self-profiling
2220
2239
tcx. prof . artifact_size ( "crate_metadata" , "crate_metadata" , result. len ( ) as u64 ) ;
2221
2240
2222
- EncodedMetadata { raw_data : result }
2241
+ let reference_result = if tcx. sess . opts . debugging_opts . split_metadata {
2242
+ let hygiene_ctxt = HygieneEncodeContext :: default ( ) ;
2243
+ let ecx = encode_metadata_header ( tcx, & hygiene_ctxt) ;
2244
+ // Don't fill in the root position for reference metadata
2245
+ Some ( ecx. opaque . into_inner ( ) )
2246
+ } else {
2247
+ None
2248
+ } ;
2249
+
2250
+ EncodedMetadata { full : result, reference : reference_result }
2223
2251
}
2224
2252
2225
2253
pub fn provide ( providers : & mut Providers ) {
0 commit comments