@@ -165,113 +165,113 @@ impl<'sess> OnDiskCache<'sess> {
165
165
where E : ty_codec:: TyEncoder
166
166
{
167
167
// Serializing the DepGraph should not modify it:
168
- let _in_ignore = tcx. dep_graph . in_ignore ( ) ;
169
-
170
- // Allocate FileMapIndices
171
- let ( file_to_file_index, file_index_to_stable_id) = {
172
- let mut file_to_file_index = FxHashMap ( ) ;
173
- let mut file_index_to_stable_id = FxHashMap ( ) ;
174
-
175
- for ( index, file) in tcx. sess . codemap ( ) . files ( ) . iter ( ) . enumerate ( ) {
176
- let index = FileMapIndex ( index as u32 ) ;
177
- let file_ptr: * const FileMap = & * * file as * const _ ;
178
- file_to_file_index. insert ( file_ptr, index) ;
179
- file_index_to_stable_id. insert ( index, StableFilemapId :: new ( & file) ) ;
180
- }
181
-
182
- ( file_to_file_index, file_index_to_stable_id)
183
- } ;
184
-
185
- let mut encoder = CacheEncoder {
186
- tcx,
187
- encoder,
188
- type_shorthands : FxHashMap ( ) ,
189
- predicate_shorthands : FxHashMap ( ) ,
190
- expn_info_shorthands : FxHashMap ( ) ,
191
- codemap : CachingCodemapView :: new ( tcx. sess . codemap ( ) ) ,
192
- file_to_file_index,
193
- } ;
194
-
195
- // Load everything into memory so we can write it out to the on-disk
196
- // cache. The vast majority of cacheable query results should already
197
- // be in memory, so this should be a cheap operation.
198
- tcx. dep_graph . exec_cache_promotions ( tcx) ;
199
-
200
- // Encode query results
201
- let mut query_result_index = EncodedQueryResultIndex :: new ( ) ;
202
-
203
- {
204
- use ty:: maps:: queries:: * ;
205
- let enc = & mut encoder;
206
- let qri = & mut query_result_index;
207
-
208
- // Encode TypeckTables
209
- encode_query_results :: < typeck_tables_of , _ > ( tcx, enc, qri) ?;
210
- encode_query_results :: < optimized_mir , _ > ( tcx, enc, qri) ?;
211
- encode_query_results :: < unsafety_check_result , _ > ( tcx, enc, qri) ?;
212
- encode_query_results :: < borrowck , _ > ( tcx, enc, qri) ?;
213
- encode_query_results :: < mir_borrowck , _ > ( tcx, enc, qri) ?;
214
- encode_query_results :: < mir_const_qualif , _ > ( tcx, enc, qri) ?;
215
- encode_query_results :: < def_symbol_name , _ > ( tcx, enc, qri) ?;
216
- encode_query_results :: < const_is_rvalue_promotable_to_static , _ > ( tcx, enc, qri) ?;
217
- encode_query_results :: < contains_extern_indicator , _ > ( tcx, enc, qri) ?;
218
- encode_query_results :: < symbol_name , _ > ( tcx, enc, qri) ?;
219
- encode_query_results :: < trans_fulfill_obligation , _ > ( tcx, enc, qri) ?;
220
- encode_query_results :: < check_match , _ > ( tcx, enc, qri) ?;
221
- }
168
+ tcx. dep_graph . with_ignore ( || {
169
+ // Allocate FileMapIndices
170
+ let ( file_to_file_index, file_index_to_stable_id) = {
171
+ let mut file_to_file_index = FxHashMap ( ) ;
172
+ let mut file_index_to_stable_id = FxHashMap ( ) ;
173
+
174
+ for ( index, file) in tcx. sess . codemap ( ) . files ( ) . iter ( ) . enumerate ( ) {
175
+ let index = FileMapIndex ( index as u32 ) ;
176
+ let file_ptr: * const FileMap = & * * file as * const _ ;
177
+ file_to_file_index. insert ( file_ptr, index) ;
178
+ file_index_to_stable_id. insert ( index, StableFilemapId :: new ( & file) ) ;
179
+ }
222
180
223
- // Encode diagnostics
224
- let diagnostics_index = {
225
- let mut diagnostics_index = EncodedDiagnosticsIndex :: new ( ) ;
226
-
227
- for ( dep_node_index, diagnostics) in self . current_diagnostics
228
- . borrow ( )
229
- . iter ( ) {
230
- let pos = AbsoluteBytePos :: new ( encoder. position ( ) ) ;
231
- // Let's make sure we get the expected type here:
232
- let diagnostics: & EncodedDiagnostics = diagnostics;
233
- let dep_node_index =
234
- SerializedDepNodeIndex :: new ( dep_node_index. index ( ) ) ;
235
- encoder. encode_tagged ( dep_node_index, diagnostics) ?;
236
- diagnostics_index. push ( ( dep_node_index, pos) ) ;
181
+ ( file_to_file_index, file_index_to_stable_id)
182
+ } ;
183
+
184
+ let mut encoder = CacheEncoder {
185
+ tcx,
186
+ encoder,
187
+ type_shorthands : FxHashMap ( ) ,
188
+ predicate_shorthands : FxHashMap ( ) ,
189
+ expn_info_shorthands : FxHashMap ( ) ,
190
+ codemap : CachingCodemapView :: new ( tcx. sess . codemap ( ) ) ,
191
+ file_to_file_index,
192
+ } ;
193
+
194
+ // Load everything into memory so we can write it out to the on-disk
195
+ // cache. The vast majority of cacheable query results should already
196
+ // be in memory, so this should be a cheap operation.
197
+ tcx. dep_graph . exec_cache_promotions ( tcx) ;
198
+
199
+ // Encode query results
200
+ let mut query_result_index = EncodedQueryResultIndex :: new ( ) ;
201
+
202
+ {
203
+ use ty:: maps:: queries:: * ;
204
+ let enc = & mut encoder;
205
+ let qri = & mut query_result_index;
206
+
207
+ // Encode TypeckTables
208
+ encode_query_results :: < typeck_tables_of , _ > ( tcx, enc, qri) ?;
209
+ encode_query_results :: < optimized_mir , _ > ( tcx, enc, qri) ?;
210
+ encode_query_results :: < unsafety_check_result , _ > ( tcx, enc, qri) ?;
211
+ encode_query_results :: < borrowck , _ > ( tcx, enc, qri) ?;
212
+ encode_query_results :: < mir_borrowck , _ > ( tcx, enc, qri) ?;
213
+ encode_query_results :: < mir_const_qualif , _ > ( tcx, enc, qri) ?;
214
+ encode_query_results :: < def_symbol_name , _ > ( tcx, enc, qri) ?;
215
+ encode_query_results :: < const_is_rvalue_promotable_to_static , _ > ( tcx, enc, qri) ?;
216
+ encode_query_results :: < contains_extern_indicator , _ > ( tcx, enc, qri) ?;
217
+ encode_query_results :: < symbol_name , _ > ( tcx, enc, qri) ?;
218
+ encode_query_results :: < trans_fulfill_obligation , _ > ( tcx, enc, qri) ?;
219
+ encode_query_results :: < check_match , _ > ( tcx, enc, qri) ?;
237
220
}
238
221
239
- diagnostics_index
240
- } ;
222
+ // Encode diagnostics
223
+ let diagnostics_index = {
224
+ let mut diagnostics_index = EncodedDiagnosticsIndex :: new ( ) ;
225
+
226
+ for ( dep_node_index, diagnostics) in self . current_diagnostics
227
+ . borrow ( )
228
+ . iter ( ) {
229
+ let pos = AbsoluteBytePos :: new ( encoder. position ( ) ) ;
230
+ // Let's make sure we get the expected type here:
231
+ let diagnostics: & EncodedDiagnostics = diagnostics;
232
+ let dep_node_index =
233
+ SerializedDepNodeIndex :: new ( dep_node_index. index ( ) ) ;
234
+ encoder. encode_tagged ( dep_node_index, diagnostics) ?;
235
+ diagnostics_index. push ( ( dep_node_index, pos) ) ;
236
+ }
241
237
242
- let sorted_cnums = sorted_cnums_including_local_crate ( tcx) ;
243
- let prev_cnums: Vec < _ > = sorted_cnums. iter ( ) . map ( |& cnum| {
244
- let crate_name = tcx. original_crate_name ( cnum) . as_str ( ) . to_string ( ) ;
245
- let crate_disambiguator = tcx. crate_disambiguator ( cnum) ;
246
- ( cnum. as_u32 ( ) , crate_name, crate_disambiguator)
247
- } ) . collect ( ) ;
248
-
249
- // Encode the file footer
250
- let footer_pos = encoder. position ( ) as u64 ;
251
- encoder. encode_tagged ( TAG_FILE_FOOTER , & Footer {
252
- file_index_to_stable_id,
253
- prev_cnums,
254
- query_result_index,
255
- diagnostics_index,
256
- } ) ?;
257
-
258
- // Encode the position of the footer as the last 8 bytes of the
259
- // file so we know where to look for it.
260
- IntEncodedWithFixedSize ( footer_pos) . encode ( encoder. encoder ) ?;
261
-
262
- // DO NOT WRITE ANYTHING TO THE ENCODER AFTER THIS POINT! The address
263
- // of the footer must be the last thing in the data stream.
264
-
265
- return Ok ( ( ) ) ;
266
-
267
- fn sorted_cnums_including_local_crate ( tcx : TyCtxt ) -> Vec < CrateNum > {
268
- let mut cnums = vec ! [ LOCAL_CRATE ] ;
269
- cnums. extend_from_slice ( & tcx. crates ( ) [ ..] ) ;
270
- cnums. sort_unstable ( ) ;
271
- // Just to be sure...
272
- cnums. dedup ( ) ;
273
- cnums
274
- }
238
+ diagnostics_index
239
+ } ;
240
+
241
+ let sorted_cnums = sorted_cnums_including_local_crate ( tcx) ;
242
+ let prev_cnums: Vec < _ > = sorted_cnums. iter ( ) . map ( |& cnum| {
243
+ let crate_name = tcx. original_crate_name ( cnum) . as_str ( ) . to_string ( ) ;
244
+ let crate_disambiguator = tcx. crate_disambiguator ( cnum) ;
245
+ ( cnum. as_u32 ( ) , crate_name, crate_disambiguator)
246
+ } ) . collect ( ) ;
247
+
248
+ // Encode the file footer
249
+ let footer_pos = encoder. position ( ) as u64 ;
250
+ encoder. encode_tagged ( TAG_FILE_FOOTER , & Footer {
251
+ file_index_to_stable_id,
252
+ prev_cnums,
253
+ query_result_index,
254
+ diagnostics_index,
255
+ } ) ?;
256
+
257
+ // Encode the position of the footer as the last 8 bytes of the
258
+ // file so we know where to look for it.
259
+ IntEncodedWithFixedSize ( footer_pos) . encode ( encoder. encoder ) ?;
260
+
261
+ // DO NOT WRITE ANYTHING TO THE ENCODER AFTER THIS POINT! The address
262
+ // of the footer must be the last thing in the data stream.
263
+
264
+ return Ok ( ( ) ) ;
265
+
266
+ fn sorted_cnums_including_local_crate ( tcx : TyCtxt ) -> Vec < CrateNum > {
267
+ let mut cnums = vec ! [ LOCAL_CRATE ] ;
268
+ cnums. extend_from_slice ( & tcx. crates ( ) [ ..] ) ;
269
+ cnums. sort_unstable ( ) ;
270
+ // Just to be sure...
271
+ cnums. dedup ( ) ;
272
+ cnums
273
+ }
274
+ } )
275
275
}
276
276
277
277
/// Load a diagnostic emitted during the previous compilation session.
@@ -380,30 +380,30 @@ impl<'sess> OnDiskCache<'sess> {
380
380
prev_cnums : & [ ( u32 , String , CrateDisambiguator ) ] )
381
381
-> IndexVec < CrateNum , Option < CrateNum > >
382
382
{
383
- let _in_ignore = tcx. dep_graph . in_ignore ( ) ;
384
-
385
- let current_cnums = tcx. all_crate_nums ( LOCAL_CRATE ) . iter ( ) . map ( |& cnum| {
386
- let crate_name = tcx. original_crate_name ( cnum)
387
- . as_str ( )
388
- . to_string ( ) ;
389
- let crate_disambiguator = tcx. crate_disambiguator ( cnum) ;
390
- ( ( crate_name, crate_disambiguator) , cnum)
391
- } ) . collect :: < FxHashMap < _ , _ > > ( ) ;
392
-
393
- let map_size = prev_cnums. iter ( )
394
- . map ( |& ( cnum, ..) | cnum)
395
- . max ( )
396
- . unwrap_or ( 0 ) + 1 ;
397
- let mut map = IndexVec :: new ( ) ;
398
- map. resize ( map_size as usize , None ) ;
399
-
400
- for & ( prev_cnum, ref crate_name, crate_disambiguator) in prev_cnums {
401
- let key = ( crate_name. clone ( ) , crate_disambiguator) ;
402
- map[ CrateNum :: from_u32 ( prev_cnum) ] = current_cnums. get ( & key) . cloned ( ) ;
403
- }
383
+ tcx. dep_graph . with_ignore ( || {
384
+ let current_cnums = tcx. all_crate_nums ( LOCAL_CRATE ) . iter ( ) . map ( |& cnum| {
385
+ let crate_name = tcx. original_crate_name ( cnum)
386
+ . as_str ( )
387
+ . to_string ( ) ;
388
+ let crate_disambiguator = tcx. crate_disambiguator ( cnum) ;
389
+ ( ( crate_name, crate_disambiguator) , cnum)
390
+ } ) . collect :: < FxHashMap < _ , _ > > ( ) ;
391
+
392
+ let map_size = prev_cnums. iter ( )
393
+ . map ( |& ( cnum, ..) | cnum)
394
+ . max ( )
395
+ . unwrap_or ( 0 ) + 1 ;
396
+ let mut map = IndexVec :: new ( ) ;
397
+ map. resize ( map_size as usize , None ) ;
398
+
399
+ for & ( prev_cnum, ref crate_name, crate_disambiguator) in prev_cnums {
400
+ let key = ( crate_name. clone ( ) , crate_disambiguator) ;
401
+ map[ CrateNum :: from_u32 ( prev_cnum) ] = current_cnums. get ( & key) . cloned ( ) ;
402
+ }
404
403
405
- map[ LOCAL_CRATE ] = Some ( LOCAL_CRATE ) ;
406
- map
404
+ map[ LOCAL_CRATE ] = Some ( LOCAL_CRATE ) ;
405
+ map
406
+ } )
407
407
}
408
408
}
409
409
0 commit comments