@@ -7,13 +7,16 @@ use crate::{on_disk_cache, Queries};
77use  rustc_data_structures:: stable_hasher:: { HashStable ,  StableHasher } ; 
88use  rustc_data_structures:: sync:: Lock ; 
99use  rustc_errors:: { Diagnostic ,  Handler } ; 
10- use  rustc_middle:: dep_graph:: { self ,  DepKind ,  DepNodeIndex ,  SerializedDepNodeIndex } ; 
10+ use  rustc_middle:: dep_graph:: { 
11+     self ,  DepKind ,  DepKindStruct ,  DepNode ,  DepNodeIndex ,  SerializedDepNodeIndex , 
12+ } ; 
1113use  rustc_middle:: ty:: tls:: { self ,  ImplicitCtxt } ; 
1214use  rustc_middle:: ty:: { self ,  TyCtxt } ; 
13- use  rustc_query_system:: dep_graph:: HasDepContext ; 
15+ use  rustc_query_system:: dep_graph:: { DepNodeParams ,   HasDepContext } ; 
1416use  rustc_query_system:: ich:: StableHashingContext ; 
1517use  rustc_query_system:: query:: { 
16-     QueryContext ,  QueryJobId ,  QueryMap ,  QuerySideEffects ,  QueryStackFrame , 
18+     force_query,  QueryConfig ,  QueryContext ,  QueryDescription ,  QueryJobId ,  QueryMap , 
19+     QuerySideEffects ,  QueryStackFrame , 
1720} ; 
1821use  std:: any:: Any ; 
1922use  std:: num:: NonZeroU64 ; 
@@ -298,6 +301,66 @@ pub(crate) fn create_query_frame<
298301    QueryStackFrame :: new ( name,  description,  span,  def_kind,  hash) 
299302} 
300303
304+ fn  try_load_from_on_disk_cache < ' tcx ,  Q > ( tcx :  TyCtxt < ' tcx > ,  dep_node :  DepNode ) 
305+ where 
306+     Q :  QueryDescription < QueryCtxt < ' tcx > > , 
307+     Q :: Key :  DepNodeParams < TyCtxt < ' tcx > > , 
308+ { 
309+     debug_assert ! ( tcx. dep_graph. is_green( & dep_node) ) ; 
310+ 
311+     let  key = Q :: Key :: recover ( tcx,  & dep_node) . unwrap_or_else ( || { 
312+         panic ! ( "Failed to recover key for {:?} with hash {}" ,  dep_node,  dep_node. hash) 
313+     } ) ; 
314+     if  Q :: cache_on_disk ( tcx,  & key)  { 
315+         let  _ = Q :: execute_query ( tcx,  key) ; 
316+     } 
317+ } 
318+ 
319+ fn  force_from_dep_node < ' tcx ,  Q > ( tcx :  TyCtxt < ' tcx > ,  dep_node :  DepNode )  -> bool 
320+ where 
321+     Q :  QueryDescription < QueryCtxt < ' tcx > > , 
322+     Q :: Key :  DepNodeParams < TyCtxt < ' tcx > > , 
323+ { 
324+     if  let  Some ( key)  = Q :: Key :: recover ( tcx,  & dep_node)  { 
325+         #[ cfg( debug_assertions) ]  
326+         let  _guard = tracing:: span!( tracing:: Level :: TRACE ,  stringify!( $name) ,  ?key) . entered ( ) ; 
327+         let  tcx = QueryCtxt :: from_tcx ( tcx) ; 
328+         force_query :: < Q ,  _ > ( tcx,  key,  dep_node) ; 
329+         true 
330+     }  else  { 
331+         false 
332+     } 
333+ } 
334+ 
335+ pub ( crate )  fn  query_callback < ' tcx ,  Q :  QueryConfig > ( 
336+     is_anon :  bool , 
337+     is_eval_always :  bool , 
338+ )  -> DepKindStruct < ' tcx > 
339+ where 
340+     Q :  QueryDescription < QueryCtxt < ' tcx > > , 
341+     Q :: Key :  DepNodeParams < TyCtxt < ' tcx > > , 
342+ { 
343+     let  fingerprint_style = Q :: Key :: fingerprint_style ( ) ; 
344+ 
345+     if  is_anon || !fingerprint_style. reconstructible ( )  { 
346+         return  DepKindStruct  { 
347+             is_anon, 
348+             is_eval_always, 
349+             fingerprint_style, 
350+             force_from_dep_node :  None , 
351+             try_load_from_on_disk_cache :  None , 
352+         } ; 
353+     } 
354+ 
355+     DepKindStruct  { 
356+         is_anon, 
357+         is_eval_always, 
358+         fingerprint_style, 
359+         force_from_dep_node :  Some ( force_from_dep_node :: < Q > ) , 
360+         try_load_from_on_disk_cache :  Some ( try_load_from_on_disk_cache :: < Q > ) , 
361+     } 
362+ } 
363+ 
301364// NOTE: `$V` isn't used here, but we still need to match on it so it can be passed to other macros 
302365// invoked by `rustc_query_append`. 
303366macro_rules!  define_queries { 
@@ -308,18 +371,6 @@ macro_rules! define_queries {
308371            input:  ( $( ( [ $( $modifiers) * ]  [ $( $attr) * ]  [ $name] ) ) * ) 
309372        } 
310373
311-         mod  make_query { 
312-             use  super :: * ; 
313- 
314-             // Create an eponymous constructor for each query. 
315-             $( #[ allow( nonstandard_style) ]  $( #[ $attr] ) * 
316-             pub  fn  $name<' tcx>( tcx:  QueryCtxt <' tcx>,  key:  <queries:: $name<' tcx> as  QueryConfig >:: Key )  -> QueryStackFrame  { 
317-                 let  kind = dep_graph:: DepKind :: $name; 
318-                 let  name = stringify!( $name) ; 
319-                 $crate:: plumbing:: create_query_frame( tcx,  queries:: $name:: describe,  key,  kind,  name) 
320-             } ) * 
321-         } 
322- 
323374        #[ allow( nonstandard_style) ] 
324375        mod  queries { 
325376            use  std:: marker:: PhantomData ; 
@@ -373,18 +424,19 @@ macro_rules! define_queries {
373424                    try_load_from_disk:  Self :: TRY_LOAD_FROM_DISK , 
374425                } 
375426            } 
427+ 
428+             fn  execute_query( tcx:  TyCtxt <' tcx>,  k:  Self :: Key )  -> Self :: Stored  { 
429+                 tcx. $name( k) 
430+             } 
376431        } ) * 
377432
378433        #[ allow( nonstandard_style) ] 
379434        mod  query_callbacks { 
380435            use  super :: * ; 
381-             use  rustc_middle:: dep_graph:: DepNode ; 
382-             use  rustc_query_system:: dep_graph:: DepNodeParams ; 
383-             use  rustc_query_system:: query:: { force_query,  QueryDescription } ; 
384436            use  rustc_query_system:: dep_graph:: FingerprintStyle ; 
385437
386438            // We use this for most things when incr. comp. is turned off. 
387-             pub  fn  Null ( )  -> DepKindStruct  { 
439+             pub  fn  Null < ' tcx> ( )  -> DepKindStruct < ' tcx>  { 
388440                DepKindStruct  { 
389441                    is_anon:  false , 
390442                    is_eval_always:  false , 
@@ -395,7 +447,7 @@ macro_rules! define_queries {
395447            } 
396448
397449            // We use this for the forever-red node. 
398-             pub  fn  Red ( )  -> DepKindStruct  { 
450+             pub  fn  Red < ' tcx> ( )  -> DepKindStruct < ' tcx>  { 
399451                DepKindStruct  { 
400452                    is_anon:  false , 
401453                    is_eval_always:  false , 
@@ -405,7 +457,7 @@ macro_rules! define_queries {
405457                } 
406458            } 
407459
408-             pub  fn  TraitSelect ( )  -> DepKindStruct  { 
460+             pub  fn  TraitSelect < ' tcx> ( )  -> DepKindStruct < ' tcx>  { 
409461                DepKindStruct  { 
410462                    is_anon:  true , 
411463                    is_eval_always:  false , 
@@ -415,7 +467,7 @@ macro_rules! define_queries {
415467                } 
416468            } 
417469
418-             pub  fn  CompileCodegenUnit ( )  -> DepKindStruct  { 
470+             pub  fn  CompileCodegenUnit < ' tcx> ( )  -> DepKindStruct < ' tcx>  { 
419471                DepKindStruct  { 
420472                    is_anon:  false , 
421473                    is_eval_always:  false , 
@@ -425,7 +477,7 @@ macro_rules! define_queries {
425477                } 
426478            } 
427479
428-             pub  fn  CompileMonoItem ( )  -> DepKindStruct  { 
480+             pub  fn  CompileMonoItem < ' tcx> ( )  -> DepKindStruct < ' tcx>  { 
429481                DepKindStruct  { 
430482                    is_anon:  false , 
431483                    is_eval_always:  false , 
@@ -435,60 +487,15 @@ macro_rules! define_queries {
435487                } 
436488            } 
437489
438-             $( pub ( crate )  fn  $name( ) -> DepKindStruct  { 
439-                 let  is_anon = is_anon!( [ $( $modifiers) * ] ) ; 
440-                 let  is_eval_always = is_eval_always!( [ $( $modifiers) * ] ) ; 
441- 
442-                 let  fingerprint_style =
443-                     <<queries:: $name<' _> as  QueryConfig >:: Key  as  DepNodeParams <TyCtxt <' _>>>:: fingerprint_style( ) ; 
444- 
445-                 if  is_anon || !fingerprint_style. reconstructible( )  { 
446-                     return  DepKindStruct  { 
447-                         is_anon, 
448-                         is_eval_always, 
449-                         fingerprint_style, 
450-                         force_from_dep_node:  None , 
451-                         try_load_from_on_disk_cache:  None , 
452-                     } 
453-                 } 
454- 
455-                 #[ inline( always) ] 
456-                 fn  recover<' tcx>( tcx:  TyCtxt <' tcx>,  dep_node:  DepNode )  -> Option <<queries:: $name<' tcx> as  QueryConfig >:: Key > { 
457-                     <<queries:: $name<' _> as  QueryConfig >:: Key  as  DepNodeParams <TyCtxt <' _>>>:: recover( tcx,  & dep_node) 
458-                 } 
459- 
460-                 fn  force_from_dep_node( tcx:  TyCtxt <' _>,  dep_node:  DepNode )  -> bool  { 
461-                     if  let  Some ( key)  = recover( tcx,  dep_node)  { 
462-                         #[ cfg( debug_assertions) ] 
463-                         let  _guard = tracing:: span!( tracing:: Level :: TRACE ,  stringify!( $name) ,  ?key) . entered( ) ; 
464-                         let  tcx = QueryCtxt :: from_tcx( tcx) ; 
465-                         force_query:: <queries:: $name<' _>,  _>( tcx,  key,  dep_node) ; 
466-                         true 
467-                     }  else { 
468-                         false 
469-                     } 
470-                 } 
471- 
472-                 fn  try_load_from_on_disk_cache( tcx:  TyCtxt <' _>,  dep_node:  DepNode )  { 
473-                     debug_assert!( tcx. dep_graph. is_green( & dep_node) ) ; 
474- 
475-                     let  key = recover( tcx,  dep_node) . unwrap_or_else( || panic!( "Failed to recover key for {:?} with hash {}" ,  dep_node,  dep_node. hash) ) ; 
476-                     if  queries:: $name:: cache_on_disk( tcx,  & key)  { 
477-                         let  _ = tcx. $name( key) ; 
478-                     } 
479-                 } 
480- 
481-                 DepKindStruct  { 
482-                     is_anon, 
483-                     is_eval_always, 
484-                     fingerprint_style, 
485-                     force_from_dep_node:  Some ( force_from_dep_node) , 
486-                     try_load_from_on_disk_cache:  Some ( try_load_from_on_disk_cache) , 
487-                 } 
490+             $( pub ( crate )  fn  $name<' tcx>( ) -> DepKindStruct <' tcx> { 
491+                 $crate:: plumbing:: query_callback:: <queries:: $name<' tcx>>( 
492+                     is_anon!( [ $( $modifiers) * ] ) , 
493+                     is_eval_always!( [ $( $modifiers) * ] ) , 
494+                 ) 
488495            } ) * 
489496        } 
490497
491-         pub  fn  query_callbacks<' tcx>( arena:  & ' tcx Arena <' tcx>)  -> & ' tcx [ DepKindStruct ]  { 
498+         pub  fn  query_callbacks<' tcx>( arena:  & ' tcx Arena <' tcx>)  -> & ' tcx [ DepKindStruct < ' tcx> ]  { 
492499            arena. alloc_from_iter( make_dep_kind_array!( query_callbacks) ) 
493500        } 
494501    } 
@@ -531,9 +538,14 @@ macro_rules! define_queries_struct {
531538                let  mut  jobs = QueryMap :: default ( ) ; 
532539
533540                $( 
541+                     let  make_query = |tcx,  key| { 
542+                         let  kind = dep_graph:: DepKind :: $name; 
543+                         let  name = stringify!( $name) ; 
544+                         $crate:: plumbing:: create_query_frame( tcx,  queries:: $name:: describe,  key,  kind,  name) 
545+                     } ; 
534546                    self . $name. try_collect_active_jobs( 
535547                        tcx, 
536-                         make_query:: $name , 
548+                         make_query, 
537549                        & mut  jobs, 
538550                    ) ?; 
539551                ) * 
0 commit comments