3
3
//! manage the caches, and so forth.
4
4
5
5
use crate :: keys:: Key ;
6
- use crate :: on_disk_cache:: CacheDecoder ;
6
+ use crate :: on_disk_cache:: { CacheDecoder , CacheEncoder , EncodedDepNodeIndex } ;
7
+ use crate :: profiling_support:: QueryKeyStringCache ;
7
8
use crate :: { on_disk_cache, Queries } ;
8
9
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
9
10
use rustc_data_structures:: sync:: { AtomicU64 , Lock } ;
@@ -173,34 +174,14 @@ impl<'tcx> QueryCtxt<'tcx> {
173
174
174
175
pub ( super ) fn encode_query_results (
175
176
self ,
176
- encoder : & mut on_disk_cache :: CacheEncoder < ' _ , ' tcx > ,
177
- query_result_index : & mut on_disk_cache :: EncodedDepNodeIndex ,
177
+ encoder : & mut CacheEncoder < ' _ , ' tcx > ,
178
+ query_result_index : & mut EncodedDepNodeIndex ,
178
179
) {
179
- macro_rules! expand_if_cached {
180
- ( [ ] $encode: expr) => { } ;
181
- ( [ ( cache) $( $rest: tt) * ] $encode: expr) => {
182
- $encode
183
- } ;
184
- ( [ $other: tt $( $modifiers: tt) * ] $encode: expr) => {
185
- expand_if_cached!( [ $( $modifiers) * ] $encode)
186
- } ;
187
- }
188
-
189
- macro_rules! encode_queries {
190
- (
191
- $( $( #[ $attr: meta] ) *
192
- [ $( $modifiers: tt) * ] fn $query: ident( $( $K: tt) * ) -> $V: ty, ) * ) => {
193
- $(
194
- expand_if_cached!( [ $( $modifiers) * ] on_disk_cache:: encode_query_results:: <_, super :: queries:: $query<' _>>(
195
- self ,
196
- encoder,
197
- query_result_index
198
- ) ) ;
199
- ) *
180
+ for query in & self . queries . query_structs {
181
+ if let Some ( encode) = query. encode_query_results {
182
+ encode ( self , encoder, query_result_index) ;
200
183
}
201
184
}
202
-
203
- rustc_query_append ! ( encode_queries!) ;
204
185
}
205
186
206
187
pub fn try_print_query_stack (
@@ -213,6 +194,14 @@ impl<'tcx> QueryCtxt<'tcx> {
213
194
}
214
195
}
215
196
197
+ #[ derive( Clone , Copy ) ]
198
+ pub ( crate ) struct QueryStruct < ' tcx > {
199
+ pub try_collect_active_jobs : fn ( QueryCtxt < ' tcx > , & mut QueryMap ) -> Option < ( ) > ,
200
+ pub alloc_self_profile_query_strings : fn ( TyCtxt < ' tcx > , & mut QueryKeyStringCache ) ,
201
+ pub encode_query_results :
202
+ Option < fn ( QueryCtxt < ' tcx > , & mut CacheEncoder < ' _ , ' tcx > , & mut EncodedDepNodeIndex ) > ,
203
+ }
204
+
216
205
macro_rules! handle_cycle_error {
217
206
( [ ] ) => { {
218
207
rustc_query_system:: HandleCycleError :: Error
@@ -438,6 +427,18 @@ where
438
427
}
439
428
}
440
429
430
+ macro_rules! expand_if_cached {
431
+ ( [ ] , $tokens: expr) => { {
432
+ None
433
+ } } ;
434
+ ( [ ( cache) $( $rest: tt) * ] , $tokens: expr) => { {
435
+ Some ( $tokens)
436
+ } } ;
437
+ ( [ $other: tt $( $modifiers: tt) * ] , $tokens: expr) => {
438
+ expand_if_cached!( [ $( $modifiers) * ] , $tokens)
439
+ } ;
440
+ }
441
+
441
442
// NOTE: `$V` isn't used here, but we still need to match on it so it can be passed to other macros
442
443
// invoked by `rustc_query_append`.
443
444
macro_rules! define_queries {
@@ -571,6 +572,59 @@ macro_rules! define_queries {
571
572
} ) *
572
573
}
573
574
575
+ mod query_structs {
576
+ use rustc_middle:: ty:: TyCtxt ;
577
+ use $crate:: plumbing:: { QueryStruct , QueryCtxt } ;
578
+ use $crate:: profiling_support:: QueryKeyStringCache ;
579
+ use rustc_query_system:: query:: { QueryDescription , QueryMap } ;
580
+
581
+ pub ( super ) const fn dummy_query_struct<' tcx>( ) -> QueryStruct <' tcx> {
582
+ fn noop_try_collect_active_jobs( _: QueryCtxt <' _>, _: & mut QueryMap ) -> Option <( ) > {
583
+ None
584
+ }
585
+ fn noop_alloc_self_profile_query_strings( _: TyCtxt <' _>, _: & mut QueryKeyStringCache ) { }
586
+
587
+ QueryStruct {
588
+ try_collect_active_jobs: noop_try_collect_active_jobs,
589
+ alloc_self_profile_query_strings: noop_alloc_self_profile_query_strings,
590
+ encode_query_results: None ,
591
+ }
592
+ }
593
+
594
+ pub ( super ) use dummy_query_struct as Null ;
595
+ pub ( super ) use dummy_query_struct as Red ;
596
+ pub ( super ) use dummy_query_struct as TraitSelect ;
597
+ pub ( super ) use dummy_query_struct as CompileCodegenUnit ;
598
+ pub ( super ) use dummy_query_struct as CompileMonoItem ;
599
+
600
+ $(
601
+ pub ( super ) const fn $name<' tcx>( ) -> QueryStruct <' tcx> { QueryStruct {
602
+ try_collect_active_jobs: |tcx, qmap| {
603
+ let make_query = |tcx, key| {
604
+ let kind = rustc_middle:: dep_graph:: DepKind :: $name;
605
+ let name = stringify!( $name) ;
606
+ $crate:: plumbing:: create_query_frame( tcx, super :: queries:: $name:: describe, key, kind, name)
607
+ } ;
608
+ tcx. queries. $name. try_collect_active_jobs(
609
+ tcx,
610
+ make_query,
611
+ qmap,
612
+ )
613
+ } ,
614
+ alloc_self_profile_query_strings: |tcx, string_cache| {
615
+ $crate:: profiling_support:: alloc_self_profile_query_strings_for_query_cache(
616
+ tcx,
617
+ stringify!( $name) ,
618
+ & tcx. query_caches. $name,
619
+ string_cache,
620
+ )
621
+ } ,
622
+ encode_query_results: expand_if_cached!( [ $( $modifiers) * ] , |tcx, encoder, query_result_index|
623
+ $crate:: on_disk_cache:: encode_query_results:: <_, super :: queries:: $name<' _>>( tcx, encoder, query_result_index)
624
+ ) ,
625
+ } } ) *
626
+ }
627
+
574
628
pub fn query_callbacks<' tcx>( arena: & ' tcx Arena <' tcx>) -> & ' tcx [ DepKindStruct <' tcx>] {
575
629
arena. alloc_from_iter( make_dep_kind_array!( query_callbacks) )
576
630
}
@@ -585,9 +639,11 @@ impl<'tcx> Queries<'tcx> {
585
639
extern_providers : ExternProviders ,
586
640
on_disk_cache : Option < OnDiskCache < ' tcx > > ,
587
641
) -> Self {
642
+ use crate :: query_structs;
588
643
Queries {
589
644
local_providers : Box :: new ( local_providers) ,
590
645
extern_providers : Box :: new ( extern_providers) ,
646
+ query_structs : make_dep_kind_array ! ( query_structs) . to_vec ( ) ,
591
647
on_disk_cache,
592
648
jobs : AtomicU64 :: new ( 1 ) ,
593
649
..Queries :: default ( )
@@ -602,6 +658,7 @@ macro_rules! define_queries_struct {
602
658
pub struct Queries <' tcx> {
603
659
local_providers: Box <Providers >,
604
660
extern_providers: Box <ExternProviders >,
661
+ query_structs: Vec <$crate:: plumbing:: QueryStruct <' tcx>>,
605
662
606
663
pub on_disk_cache: Option <OnDiskCache <' tcx>>,
607
664
@@ -618,18 +675,9 @@ macro_rules! define_queries_struct {
618
675
let tcx = QueryCtxt { tcx, queries: self } ;
619
676
let mut jobs = QueryMap :: default ( ) ;
620
677
621
- $(
622
- let make_query = |tcx, key| {
623
- let kind = dep_graph:: DepKind :: $name;
624
- let name = stringify!( $name) ;
625
- $crate:: plumbing:: create_query_frame( tcx, queries:: $name:: describe, key, kind, name)
626
- } ;
627
- self . $name. try_collect_active_jobs(
628
- tcx,
629
- make_query,
630
- & mut jobs,
631
- ) ?;
632
- ) *
678
+ for query in & self . query_structs {
679
+ ( query. try_collect_active_jobs) ( tcx, & mut jobs) ;
680
+ }
633
681
634
682
Some ( jobs)
635
683
}
0 commit comments