@@ -81,8 +81,8 @@ impl QueryContext for QueryCtxt<'_> {
81
81
fn try_collect_active_jobs ( self ) -> Option < QueryMap < DepKind > > {
82
82
let mut jobs = QueryMap :: default ( ) ;
83
83
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) ;
86
86
}
87
87
88
88
Some ( jobs)
@@ -183,10 +183,8 @@ pub(super) fn encode_all_query_results<'tcx>(
183
183
encoder : & mut CacheEncoder < ' _ , ' tcx > ,
184
184
query_result_index : & mut EncodedDepNodeIndex ,
185
185
) {
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) ;
190
188
}
191
189
}
192
190
@@ -476,6 +474,16 @@ where
476
474
}
477
475
}
478
476
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
+
479
487
macro_rules! expand_if_cached {
480
488
( [ ] , $tokens: expr) => { {
481
489
None
@@ -633,6 +641,43 @@ macro_rules! define_queries {
633
641
restore:: <queries:: $name:: Value <' tcx>>( value)
634
642
}
635
643
}
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
+ } }
636
681
} ) * }
637
682
638
683
pub ( crate ) fn engine( incremental: bool ) -> QueryEngine {
@@ -655,6 +700,23 @@ macro_rules! define_queries {
655
700
}
656
701
}
657
702
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
+
658
720
#[ allow( nonstandard_style) ]
659
721
mod query_callbacks {
660
722
use super :: * ;
@@ -720,64 +782,6 @@ macro_rules! define_queries {
720
782
} ) *
721
783
}
722
784
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
-
781
785
pub fn query_callbacks<' tcx>( arena: & ' tcx Arena <' tcx>) -> & ' tcx [ DepKindStruct <' tcx>] {
782
786
arena. alloc_from_iter( make_dep_kind_array!( query_callbacks) )
783
787
}
0 commit comments