@@ -7,7 +7,6 @@ use rustc_data_structures::steal::Steal;
77use rustc_data_structures:: sync:: { AtomicU32 , AtomicU64 , Lock , Lrc , Ordering } ;
88use rustc_data_structures:: thin_vec:: ThinVec ;
99use rustc_data_structures:: unlikely;
10- use rustc_errors:: Diagnostic ;
1110use rustc_index:: vec:: IndexVec ;
1211use rustc_serialize:: opaque:: { FileEncodeResult , FileEncoder } ;
1312
@@ -235,21 +234,31 @@ impl DepGraph {
235234 cx : Ctxt ,
236235 arg : A ,
237236 token : QueryJobId ,
238- diagnostics : Option < & Lock < ThinVec < Diagnostic > > > ,
239237 task : fn ( Ctxt :: DepContext , A ) -> R ,
240238 hash_result : Option < fn ( & mut StableHashingContext < ' _ > , & R ) -> Fingerprint > ,
241239 ) -> ( 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 (
243243 key,
244244 cx,
245245 arg,
246246 |arg, task_deps| {
247- crate :: tls:: start_query ( token, diagnostics, task_deps, || {
247+ crate :: tls:: start_query ( token, Some ( & diagnostics) , task_deps, || {
248248 task ( * cx. dep_context ( ) , arg)
249249 } )
250250 } ,
251251 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)
253262 }
254263
255264 fn with_task_impl < Ctxt : HasDepContext , A : Debug , R > (
@@ -356,14 +365,26 @@ impl DepGraph {
356365 cx : Ctxt ,
357366 arg : A ,
358367 token : QueryJobId ,
359- diagnostics : Option < & Lock < ThinVec < Diagnostic > > > ,
360368 task : fn ( Ctxt :: DepContext , A ) -> R ,
361369 ) -> ( 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) ) ;
363372
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)
367388 }
368389
369390 fn with_anon_task_impl < Ctxt : DepContext , R > (
0 commit comments