@@ -8,7 +8,7 @@ use std::sync::Arc;
88use rustc_data_structures:: fx:: { FxIndexMap , FxIndexSet } ;
99use rustc_data_structures:: memmap:: { Mmap , MmapMut } ;
1010use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
11- use rustc_data_structures:: sync:: { join , par_for_each_in } ;
11+ use rustc_data_structures:: sync:: { par_for_each_in , par_join } ;
1212use rustc_data_structures:: temp_dir:: MaybeTempDir ;
1313use rustc_data_structures:: thousands:: usize_with_underscores;
1414use rustc_feature:: Features ;
@@ -19,6 +19,7 @@ use rustc_hir::definitions::DefPathData;
1919use rustc_hir:: find_attr;
2020use rustc_hir_pretty:: id_to_string;
2121use rustc_middle:: dep_graph:: WorkProductId ;
22+ use rustc_middle:: ich:: StableHashingContext ;
2223use rustc_middle:: middle:: dependency_format:: Linkage ;
2324use rustc_middle:: mir:: interpret;
2425use rustc_middle:: query:: Providers ;
@@ -27,7 +28,6 @@ use rustc_middle::ty::AssocContainer;
2728use rustc_middle:: ty:: codec:: TyEncoder ;
2829use rustc_middle:: ty:: fast_reject:: { self , TreatParams } ;
2930use rustc_middle:: { bug, span_bug} ;
30- use rustc_query_system:: ich:: StableHashingContext ;
3131use rustc_serialize:: { Decodable , Decoder , Encodable , Encoder , opaque} ;
3232use rustc_session:: config:: { CrateType , OptLevel , TargetModifier } ;
3333use rustc_span:: hygiene:: HygieneEncodeContext ;
@@ -42,7 +42,7 @@ use crate::errors::{FailCreateFileEncoder, FailWriteFile};
4242use crate :: rmeta:: * ;
4343
4444// Struct to enable split borrows.
45- struct ContextEncoder < ' a > {
45+ pub ( super ) struct ContextEncoder < ' a > {
4646 opaque : opaque:: FileEncoder ,
4747 stable_hasher : StableHasher ,
4848 hcx : StableHashingContext < ' a > ,
@@ -120,9 +120,17 @@ impl<'a> Encoder for ContextEncoder<'a> {
120120
121121impl < ' a > ContextEncoder < ' a > {
122122 #[ inline]
123- fn position ( & self ) -> usize {
123+ pub ( super ) fn position ( & self ) -> usize {
124124 self . opaque . position ( )
125125 }
126+
127+ pub ( super ) fn write_m_with < const N : usize > ( & mut self , b : & [ u8 ; N ] , m : usize ) {
128+ ( b[ ..m] ) . hash_stable ( & mut self . hcx , & mut self . stable_hasher ) ;
129+ self . opaque . write_with ( |dest| {
130+ * dest = * b;
131+ m
132+ } ) ;
133+ }
126134}
127135
128136macro_rules! encoder_methods {
@@ -194,11 +202,6 @@ impl<'a, 'tcx> SpanEncoder for EncodeContext<'a, 'tcx> {
194202 }
195203
196204 fn encode_def_id ( & mut self , def_id : DefId ) {
197- HashStable :: < StableHashingContext < ' _ > > :: hash_stable (
198- & def_id,
199- & mut self . encoder . hcx ,
200- & mut self . encoder . stable_hasher ,
201- ) ;
202205 def_id. krate . encode ( self ) ;
203206 def_id. index . encode ( self ) ;
204207 }
@@ -231,17 +234,15 @@ impl<'a, 'tcx> SpanEncoder for EncodeContext<'a, 'tcx> {
231234 if offset < last_location {
232235 let needed = bytes_needed ( offset) ;
233236 SpanTag :: indirect ( true , needed as u8 ) . encode ( self ) ;
234- self . encoder . opaque . write_with ( |dest| {
235- * dest = offset. to_le_bytes ( ) ;
236- needed
237- } ) ;
237+ self . encoder . write_m_with ( & offset. to_le_bytes ( ) , needed) ;
238+ offset. hash_stable ( & mut self . encoder . hcx , & mut self . encoder . stable_hasher ) ;
238239 } else {
239240 let needed = bytes_needed ( last_location) ;
240241 SpanTag :: indirect ( false , needed as u8 ) . encode ( self ) ;
241- self . encoder . opaque . write_with ( |dest| {
242- * dest = last_location . to_le_bytes ( ) ;
243- needed
244- } ) ;
242+ self . encoder . write_m_with ( & last_location . to_le_bytes ( ) , needed ) ;
243+
244+ last_location
245+ . hash_stable ( & mut self . encoder . hcx , & mut self . encoder . stable_hasher ) ;
245246 }
246247 }
247248 Entry :: Vacant ( v) => {
@@ -648,7 +649,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
648649 adapted. set_some ( on_disk_index, self . lazy ( adapted_source_file) ) ;
649650 }
650651
651- adapted. encode ( & mut self . encoder . opaque )
652+ adapted. encode ( & mut self . encoder )
652653 }
653654
654655 fn encode_crate_root ( & mut self ) -> LazyValue < CrateRoot > {
@@ -732,7 +733,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
732733 // encode_def_path_table.
733734 let proc_macro_data = stat ! ( "proc-macro-data" , || self . encode_proc_macros( ) ) ;
734735
735- let tables = stat ! ( "tables" , || self . tables. encode( & mut self . encoder. opaque ) ) ;
736+ let tables = stat ! ( "tables" , || self . tables. encode( & mut self . encoder) ) ;
736737
737738 let debugger_visualizers =
738739 stat ! ( "debugger-visualizers" , || self . encode_debugger_visualizers( ) ) ;
@@ -2018,9 +2019,9 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
20182019 ) ;
20192020
20202021 (
2021- syntax_contexts. encode ( & mut self . encoder . opaque ) ,
2022- expn_data_table. encode ( & mut self . encoder . opaque ) ,
2023- expn_hash_table. encode ( & mut self . encoder . opaque ) ,
2022+ syntax_contexts. encode ( & mut self . encoder ) ,
2023+ expn_data_table. encode ( & mut self . encoder ) ,
2024+ expn_hash_table. encode ( & mut self . encoder ) ,
20242025 )
20252026 }
20262027
0 commit comments