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