@@ -81,8 +81,8 @@ impl QueryContext for QueryCtxt<'_> {
8181 fn try_collect_active_jobs ( self ) -> Option < QueryMap < DepKind > > {
8282 let mut jobs = QueryMap :: default ( ) ;
8383
84- for query in & self . query_system . fns . query_structs {
85- ( query . try_collect_active_jobs ) ( self . tcx , & mut jobs) ;
84+ for collect in super :: TRY_COLLECT_ACTIVE_JOBS . iter ( ) {
85+ collect ( self . tcx , & mut jobs) ;
8686 }
8787
8888 Some ( jobs)
@@ -183,10 +183,8 @@ pub(super) fn encode_all_query_results<'tcx>(
183183 encoder : & mut CacheEncoder < ' _ , ' tcx > ,
184184 query_result_index : & mut EncodedDepNodeIndex ,
185185) {
186- for query in & tcx. query_system . fns . query_structs {
187- if let Some ( encode) = query. encode_query_results {
188- encode ( tcx, encoder, query_result_index) ;
189- }
186+ for encode in super :: ENCODE_QUERY_RESULTS . iter ( ) . copied ( ) . filter_map ( |e| e) {
187+ encode ( tcx, encoder, query_result_index) ;
190188 }
191189}
192190
@@ -476,6 +474,16 @@ where
476474 }
477475}
478476
477+ macro_rules! item_if_cached {
478+ ( [ ] $tokens: tt) => { } ;
479+ ( [ ( cache) $( $rest: tt) * ] { $( $tokens: tt) * } ) => {
480+ $( $tokens) *
481+ } ;
482+ ( [ $other: tt $( $modifiers: tt) * ] $tokens: tt) => {
483+ item_if_cached! { [ $( $modifiers) * ] $tokens }
484+ } ;
485+ }
486+
479487macro_rules! expand_if_cached {
480488 ( [ ] , $tokens: expr) => { {
481489 None
@@ -633,6 +641,43 @@ macro_rules! define_queries {
633641 restore:: <queries:: $name:: Value <' tcx>>( value)
634642 }
635643 }
644+
645+ pub fn try_collect_active_jobs<' tcx>( tcx: TyCtxt <' tcx>, qmap: & mut QueryMap <DepKind >) {
646+ let make_query = |tcx, key| {
647+ let kind = rustc_middle:: dep_graph:: DepKind :: $name;
648+ let name = stringify!( $name) ;
649+ $crate:: plumbing:: create_query_frame( tcx, rustc_middle:: query:: descs:: $name, key, kind, name)
650+ } ;
651+ tcx. query_system. states. $name. try_collect_active_jobs(
652+ tcx,
653+ make_query,
654+ qmap,
655+ ) . unwrap( ) ;
656+ }
657+
658+ pub fn alloc_self_profile_query_strings<' tcx>( tcx: TyCtxt <' tcx>, string_cache: & mut QueryKeyStringCache ) {
659+ $crate:: profiling_support:: alloc_self_profile_query_strings_for_query_cache(
660+ tcx,
661+ stringify!( $name) ,
662+ & tcx. query_system. caches. $name,
663+ string_cache,
664+ )
665+ }
666+
667+ item_if_cached! { [ $( $modifiers) * ] {
668+ pub fn encode_query_results<' tcx>(
669+ tcx: TyCtxt <' tcx>,
670+ encoder: & mut CacheEncoder <' _, ' tcx>,
671+ query_result_index: & mut EncodedDepNodeIndex
672+ ) {
673+ $crate:: plumbing:: encode_query_results:: <query_impl:: $name:: QueryType <' tcx>>(
674+ query_impl:: $name:: QueryType :: config( tcx) ,
675+ QueryCtxt :: new( tcx) ,
676+ encoder,
677+ query_result_index,
678+ )
679+ }
680+ } }
636681 } ) * }
637682
638683 pub ( crate ) fn engine( incremental: bool ) -> QueryEngine {
@@ -655,6 +700,23 @@ macro_rules! define_queries {
655700 }
656701 }
657702
703+ // These arrays are used for iteration and can't be indexed by `DepKind`.
704+
705+ const TRY_COLLECT_ACTIVE_JOBS : & [ for <' tcx> fn ( TyCtxt <' tcx>, & mut QueryMap <DepKind >) ] =
706+ & [ $( query_impl:: $name:: try_collect_active_jobs) ,* ] ;
707+
708+ const ALLOC_SELF_PROFILE_QUERY_STRINGS : & [
709+ for <' tcx> fn ( TyCtxt <' tcx>, & mut QueryKeyStringCache )
710+ ] = & [ $( query_impl:: $name:: alloc_self_profile_query_strings) ,* ] ;
711+
712+ const ENCODE_QUERY_RESULTS : & [
713+ Option <for <' tcx> fn (
714+ TyCtxt <' tcx>,
715+ & mut CacheEncoder <' _, ' tcx>,
716+ & mut EncodedDepNodeIndex )
717+ >
718+ ] = & [ $( expand_if_cached!( [ $( $modifiers) * ] , query_impl:: $name:: encode_query_results) ) ,* ] ;
719+
658720 #[ allow( nonstandard_style) ]
659721 mod query_callbacks {
660722 use super :: * ;
@@ -720,64 +782,6 @@ macro_rules! define_queries {
720782 } ) *
721783 }
722784
723- mod query_structs {
724- use super :: * ;
725- use rustc_middle:: query:: plumbing:: { QueryKeyStringCache , QueryStruct } ;
726- use rustc_middle:: dep_graph:: DepKind ;
727- use crate :: QueryConfigRestored ;
728-
729- pub ( super ) const fn dummy_query_struct<' tcx>( ) -> QueryStruct <' tcx> {
730- fn noop_try_collect_active_jobs( _: TyCtxt <' _>, _: & mut QueryMap <DepKind >) -> Option <( ) > {
731- None
732- }
733- fn noop_alloc_self_profile_query_strings( _: TyCtxt <' _>, _: & mut QueryKeyStringCache ) { }
734-
735- QueryStruct {
736- try_collect_active_jobs: noop_try_collect_active_jobs,
737- alloc_self_profile_query_strings: noop_alloc_self_profile_query_strings,
738- encode_query_results: None ,
739- }
740- }
741-
742- pub ( super ) use dummy_query_struct as Null ;
743- pub ( super ) use dummy_query_struct as Red ;
744- pub ( super ) use dummy_query_struct as TraitSelect ;
745- pub ( super ) use dummy_query_struct as CompileCodegenUnit ;
746- pub ( super ) use dummy_query_struct as CompileMonoItem ;
747-
748- $(
749- pub ( super ) const fn $name<' tcx>( ) -> QueryStruct <' tcx> { QueryStruct {
750- try_collect_active_jobs: |tcx, qmap| {
751- let make_query = |tcx, key| {
752- let kind = rustc_middle:: dep_graph:: DepKind :: $name;
753- let name = stringify!( $name) ;
754- $crate:: plumbing:: create_query_frame( tcx, rustc_middle:: query:: descs:: $name, key, kind, name)
755- } ;
756- tcx. query_system. states. $name. try_collect_active_jobs(
757- tcx,
758- make_query,
759- qmap,
760- )
761- } ,
762- alloc_self_profile_query_strings: |tcx, string_cache| {
763- $crate:: profiling_support:: alloc_self_profile_query_strings_for_query_cache(
764- tcx,
765- stringify!( $name) ,
766- & tcx. query_system. caches. $name,
767- string_cache,
768- )
769- } ,
770- encode_query_results: expand_if_cached!( [ $( $modifiers) * ] , |tcx, encoder, query_result_index|
771- $crate:: plumbing:: encode_query_results:: <query_impl:: $name:: QueryType <' tcx>>(
772- query_impl:: $name:: QueryType :: config( tcx) ,
773- QueryCtxt :: new( tcx) ,
774- encoder,
775- query_result_index,
776- )
777- ) ,
778- } } ) *
779- }
780-
781785 pub fn query_callbacks<' tcx>( arena: & ' tcx Arena <' tcx>) -> & ' tcx [ DepKindStruct <' tcx>] {
782786 arena. alloc_from_iter( make_dep_kind_array!( query_callbacks) )
783787 }
0 commit comments