@@ -7,7 +7,6 @@ use rustc_data_structures::steal::Steal;
7
7
use rustc_data_structures:: sync:: { AtomicU32 , AtomicU64 , Lock , Lrc , Ordering } ;
8
8
use rustc_data_structures:: thin_vec:: ThinVec ;
9
9
use rustc_data_structures:: unlikely;
10
- use rustc_errors:: Diagnostic ;
11
10
use rustc_index:: vec:: IndexVec ;
12
11
use rustc_serialize:: opaque:: { FileEncodeResult , FileEncoder } ;
13
12
@@ -235,21 +234,31 @@ impl DepGraph {
235
234
cx : Ctxt ,
236
235
arg : A ,
237
236
token : QueryJobId ,
238
- diagnostics : Option < & Lock < ThinVec < Diagnostic > > > ,
239
237
task : fn ( Ctxt :: DepContext , A ) -> R ,
240
238
hash_result : Option < fn ( & mut StableHashingContext < ' _ > , & R ) -> Fingerprint > ,
241
239
) -> ( R , DepNodeIndex ) {
242
- self . with_task_impl (
240
+ let prof_timer = cx. dep_context ( ) . profiler ( ) . query_provider ( ) ;
241
+ let diagnostics = Lock :: new ( ThinVec :: new ( ) ) ;
242
+ let ( result, dep_node_index) = self . with_task_impl (
243
243
key,
244
244
cx,
245
245
arg,
246
246
|arg, task_deps| {
247
- crate :: tls:: start_query ( token, diagnostics, task_deps, || {
247
+ crate :: tls:: start_query ( token, Some ( & diagnostics) , task_deps, || {
248
248
task ( * cx. dep_context ( ) , arg)
249
249
} )
250
250
} ,
251
251
hash_result,
252
- )
252
+ ) ;
253
+ let diagnostics = diagnostics. into_inner ( ) ;
254
+ let side_effects = QuerySideEffects { diagnostics } ;
255
+
256
+ prof_timer. finish_with_query_invocation_id ( dep_node_index. into ( ) ) ;
257
+
258
+ if unlikely ! ( !side_effects. is_empty( ) ) {
259
+ cx. store_side_effects ( dep_node_index, side_effects) ;
260
+ }
261
+ ( result, dep_node_index)
253
262
}
254
263
255
264
fn with_task_impl < Ctxt : HasDepContext , A : Debug , R > (
@@ -356,14 +365,26 @@ impl DepGraph {
356
365
cx : Ctxt ,
357
366
arg : A ,
358
367
token : QueryJobId ,
359
- diagnostics : Option < & Lock < ThinVec < Diagnostic > > > ,
360
368
task : fn ( Ctxt :: DepContext , A ) -> R ,
361
369
) -> ( R , DepNodeIndex ) {
362
- debug_assert ! ( !cx. dep_context( ) . is_eval_always( dep_kind) ) ;
370
+ let dcx = * cx. dep_context ( ) ;
371
+ debug_assert ! ( !dcx. is_eval_always( dep_kind) ) ;
363
372
364
- self . with_anon_task_impl ( * cx. dep_context ( ) , dep_kind, |task_deps| {
365
- crate :: tls:: start_query ( token, diagnostics, task_deps, || task ( * cx. dep_context ( ) , arg) )
366
- } )
373
+ let prof_timer = dcx. profiler ( ) . query_provider ( ) ;
374
+ let diagnostics = Lock :: new ( ThinVec :: new ( ) ) ;
375
+
376
+ let ( result, dep_node_index) = self . with_anon_task_impl ( dcx, dep_kind, |task_deps| {
377
+ crate :: tls:: start_query ( token, Some ( & diagnostics) , task_deps, || task ( dcx, arg) )
378
+ } ) ;
379
+ let diagnostics = diagnostics. into_inner ( ) ;
380
+
381
+ prof_timer. finish_with_query_invocation_id ( dep_node_index. into ( ) ) ;
382
+
383
+ let side_effects = QuerySideEffects { diagnostics } ;
384
+ if unlikely ! ( !side_effects. is_empty( ) ) {
385
+ cx. store_side_effects_for_anon_node ( dep_node_index, side_effects) ;
386
+ }
387
+ ( result, dep_node_index)
367
388
}
368
389
369
390
fn with_anon_task_impl < Ctxt : DepContext , R > (
0 commit comments