Skip to main content

rustc_query_impl/
job.rs

1use std::io::Write;
2use std::ops::ControlFlow;
3use std::sync::Arc;
4use std::{iter, mem};
5
6use rustc_data_structures::fx::{FxHashMap, FxHashSet};
7use rustc_data_structures::hash_table::HashTable;
8use rustc_data_structures::sync::{DynSend, DynSync};
9use rustc_middle::queries::TaggedQueryKey;
10use rustc_middle::query::{
11    ActiveKeyStatus, QueryCache, QueryCycle, QueryJob, QueryJobId, QueryKey, QueryLatch,
12    QueryStackFrame, QueryVTable, QueryWaiter,
13};
14use rustc_middle::ty::TyCtxt;
15use rustc_span::{DUMMY_SP, Span};
16use tracing::debug;
17
18use crate::query_vtables::for_each_query_vtable;
19
20/// Map from query job IDs to job information collected by
21/// `collect_active_query_jobs`.
22#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for QueryJobMap<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "QueryJobMap",
            "map", &&self.map)
    }
}Debug, #[automatically_derived]
impl<'tcx> ::core::default::Default for QueryJobMap<'tcx> {
    #[inline]
    fn default() -> Self {
        QueryJobMap { map: ::core::default::Default::default() }
    }
}Default)]
23pub struct QueryJobMap<'tcx> {
24    map: FxHashMap<QueryJobId, QueryJobInfo<'tcx>>,
25}
26
27impl<'tcx> QueryJobMap<'tcx> {
28    /// Adds information about a job ID to the job map.
29    ///
30    /// Should only be called by `collect_active_query_jobs_inner`.
31    pub(crate) fn insert(&mut self, id: QueryJobId, info: QueryJobInfo<'tcx>) {
32        self.map.insert(id, info);
33    }
34
35    fn tagged_key_of(&self, id: QueryJobId) -> TaggedQueryKey<'tcx> {
36        self.map[&id].tagged_key
37    }
38
39    fn span_of(&self, id: QueryJobId) -> Span {
40        self.map[&id].job.span
41    }
42
43    fn parent_of(&self, id: QueryJobId) -> Option<QueryJobId> {
44        self.map[&id].job.parent
45    }
46
47    fn latch_of(&self, id: QueryJobId) -> Option<&QueryLatch<'tcx>> {
48        self.map[&id].job.latch.as_ref()
49    }
50}
51
52#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for QueryJobInfo<'tcx> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "QueryJobInfo",
            "tagged_key", &self.tagged_key, "job", &&self.job)
    }
}Debug)]
53pub(crate) struct QueryJobInfo<'tcx> {
54    pub(crate) tagged_key: TaggedQueryKey<'tcx>,
55    pub(crate) job: QueryJob<'tcx>,
56}
57
58#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CollectActiveJobsKind { }
#[automatically_derived]
impl ::core::clone::Clone for CollectActiveJobsKind {
    #[inline]
    fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CollectActiveJobsKind { }Copy)]
59pub enum CollectActiveJobsKind {
60    /// We need the full query job map, and we are willing to wait to obtain the query state
61    /// shard lock(s).
62    Full,
63
64    /// We need the full query job map, and we shouldn't need to wait to obtain the shard lock(s),
65    /// because we are in a place where nothing else could hold the shard lock(s).
66    FullNoContention,
67
68    /// We can get by without the full query job map, so we won't bother waiting to obtain the
69    /// shard lock(s) if they're not already unlocked.
70    PartialAllowed,
71}
72
73/// Returns a map of currently active query jobs, collected from all queries.
74pub fn collect_active_query_jobs<'tcx>(
75    tcx: TyCtxt<'tcx>,
76    collect_kind: CollectActiveJobsKind,
77) -> QueryJobMap<'tcx> {
78    let mut job_map = QueryJobMap::default();
79
80    {
    let tcx: rustc_middle::ty::TyCtxt<'_> = tcx;
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.derive_macro_expansion;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trigger_delayed_bug;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.registered_attr_tools;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.registered_lint_tools;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.early_lint_checks;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.env_var_os;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolutions;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolver_for_lowering_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.index_ast;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.source_span;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolve_type_relative_delegations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lower_to_hir;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_owner;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_crate_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_module_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_owner_parent_q;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.hir_attr_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_param_default;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_of_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of_opaque;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_of_opaque_hir_typeck;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_alias_is_checked;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.collect_return_position_impl_trait_in_trait_tys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_ty_origin;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.unsizing_params_for_adt;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.analysis;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_expectations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.generics_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.clauses_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_types_defined_by;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.nested_bodies_within;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_item_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_item_self_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_self_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.item_non_self_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_super_outlives;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.native_libraries;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.shallow_lint_levels_on;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lint_expectations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.skippable_lints;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.expn_that_defined;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_panic_runtime;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_representability;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_representability_adt_ty;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.params_in_repr;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.thir_body;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_keys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_const_qualif;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_built;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.thir_abstract_const;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_drops_elaborated_and_const_checked;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_for_ctfe;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_promoted;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.closure_typeinfo;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.closure_saved_names_of_captured_variables;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_coroutine_witnesses;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_coroutine_obligations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_potentially_region_dependent_goals;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.optimized_mir;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_eligible_for_coverage;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coverage_attr_on;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coverage_codegen_info;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.promoted_mir;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.erase_and_anonymize_regions_ty;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.wasm_import_module_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_explicit_clauses_and_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_clauses_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inferred_outlives_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_super_clauses_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_implied_clauses_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_supertraits_containing_assoc_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.const_conditions;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.explicit_implied_const_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_param_clauses;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_def;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_def;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_destructor;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_async_destructor;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_sizedness_constraint;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_dtorck_constraint;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.constness;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.asyncness;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_promotable_const_fn;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_by_move_body_def_id;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_for_closure;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coroutine_hidden_types;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_variances;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.variances_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inferred_outlives_crate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_item_def_ids;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_item_implementor_ids;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.associated_types_for_impl_traits_in_trait_or_impl;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_trait_header;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_is_fully_generic_for_reflection;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_self_is_guaranteed_unsized;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherent_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.incoherent_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_transmutes;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_offloads;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_unsafety;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_tail_calls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.assumed_wf_types;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.assumed_wf_types_for_rpitit;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_sig;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lint_mod;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_unused_traits;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_attrs;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_unstable_api_usage;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_privacy;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_liveness;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.live_symbols_and_ignored_derived_traits;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mod_deathness;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_type_wf;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coerce_unsized_info;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.typeck_root;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_trait_imports;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.coherent_trait;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_borrowck;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls_validity_check;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_inherent_impls_overlap_check;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.orphan_check_impl;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_callgraph_cyclic;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_inliner_callees;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.tag_for_variant;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_allocation_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_static_initializer;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_const_value_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.eval_to_valtree;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.valtree_to_const_val;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lit_to_const;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_match;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.effective_visibilities;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_private_in_public;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reachable_set;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.region_scope_tree;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_shims;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.symbol_name;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_span;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.def_ident_span;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.ty_span;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_stability;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_const_stability;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_default_body_stability;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.should_inherit_track_caller;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherited_align;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lookup_deprecation_entry;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_doc_hidden;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_doc_notable_trait;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.attrs_for_def;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_fn_attrs;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.asm_target_features;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_arg_idents;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.rendered_const;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.rendered_precise_capturing_args;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.impl_parent;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_mir_available;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.own_existential_vtable_entries;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.vtable_entries;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.first_method_vtable_slot;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.supertrait_vtable_slot;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.vtable_allocation;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_select_candidate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_local_trait_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.local_trait_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_impls_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specialization_graph_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dyn_compatibility_violations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_dyn_compatible;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.param_env;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.param_env_normalized_for_post_analysis;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_copy_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_use_cloned_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_sized_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_freeze_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unsafe_unpin_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unpin_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_async_drop_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.needs_drop_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.needs_async_drop_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_significant_drop_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_structural_eq_impl;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_drop_tys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_async_drop_tys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.adt_significant_drop_tys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.list_significant_drop_tys;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.layout_of;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_fn_ptr;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_instance_no_deduced_attrs;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fn_abi_of_instance_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dylib_dependency_formats;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dependency_formats;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_compiler_builtins;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_global_allocator;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_alloc_error_handler;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_panic_handler;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_profiler_runtime;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.has_ffi_unwind_calls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.required_panic_strategy;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.panic_in_drop_strategy;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_no_builtins;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.symbol_mangling_version;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.extern_crate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specialization_enabled_in;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.specializes;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.defaultness;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.default_field;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_well_formed;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.enforce_impl_non_lifetime_params_are_constrained;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reachable_non_generics;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_reachable_non_generic;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_unreachable_local_definition;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_monomorphizations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_monomorphizations_for;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_drop_glue_for;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upstream_async_drop_glue_for;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.foreign_modules;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.clashing_extern_declarations;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.entry_fn;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.proc_macro_decls_static;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_hash;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_host_hash;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.extra_filename;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_extern_paths;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implementations_of_trait;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_incoherent_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.native_library;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inherit_sig_for_delegation_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.delegation_user_specified_args;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolve_bound_vars;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.named_variable_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_late_bound_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.object_lifetime_default;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.late_bound_vars_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.opaque_captured_lifetimes;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.live_args_for_alias_from_outlives_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.args_known_to_outlive_alias_params;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.visibility;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inhabited_predicate_for_def;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.inhabited_predicate_type;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_opsem_inhabited_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_dep_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_name;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.module_children;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.num_extern_def_ids;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.lib_features;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stability_implications;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.intrinsic_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.get_lang_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_diagnostic_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_canonical_symbols;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.defined_lang_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.diagnostic_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.canonical_symbols;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.missing_lang_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.visible_parent_map;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trimmed_def_paths;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.missing_extern_crate_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_crate_source;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.debugger_visualizers;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.postorder_cnums;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_private_dep;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.allocator_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.alloc_error_handler_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.upvars_mentioned;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crates;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.used_crates;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.duplicate_crate_names;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.traits;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trait_impls_in_crate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stable_order_of_exportable_impls;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exportable_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exported_non_generic_symbols;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.exported_generic_symbols;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.collect_and_partition_mono_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_codegened_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.codegen_unit;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.backend_optimization_level;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.output_filenames;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_projection;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_free_alias;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.normalize_canonicalized_inherent_projection;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.try_normalize_generic_arg_after_erasing_regions;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implied_outlives_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.mir_borrowck_implied_outlives_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.dropck_outlives;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.evaluate_obligation;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_ascribe_user_type;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_prove_predicate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_ty;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_clause;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_poly_fn_sig;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.type_op_normalize_fn_sig;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.instantiate_and_check_impossible_clauses;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.is_impossible_associated_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.method_autoderef_steps;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.evaluate_root_goal_for_proof_tree_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_rust_target_features;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.implied_target_features;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.features_query;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.crate_for_resolver;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.resolve_instance_raw;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.reveal_opaque_types_in_bounds;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.limits;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.diagnostic_hir_wf_check;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_validity_requirement;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.compare_impl_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.deduced_param_attrs;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.doc_link_resolutions;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.doc_link_traits_in_scope;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.stripped_cfg_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.generics_require_sized_self;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.cross_crate_inlinable;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_mono_item;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.items_of_instance;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.size_estimate;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.anon_const_kind;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.trivial_const;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.sanitizer_settings_for;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.check_externally_implementable_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.externally_implementable_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.fake_doc_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
    let query: &rustc_middle::query::QueryVTable<'_, _> =
        &tcx.query_system.query_vtables.all_fake_doc_items;
    (|query|
            {
                collect_active_query_jobs_inner(query, collect_kind,
                    &mut job_map);
            })(query);
};for_each_query_vtable!(ALL, tcx, |query| {
81        collect_active_query_jobs_inner(query, collect_kind, &mut job_map);
82    });
83
84    job_map
85}
86
87/// Internal plumbing for collecting the set of active jobs for this query.
88///
89/// Aborts if jobs can't be gathered as specified by `collect_kind`.
90fn collect_active_query_jobs_inner<'tcx, C>(
91    query: &'tcx QueryVTable<'tcx, C>,
92    collect_kind: CollectActiveJobsKind,
93    job_map: &mut QueryJobMap<'tcx>,
94) where
95    C: QueryCache<Key: QueryKey + DynSend + DynSync>,
96    QueryVTable<'tcx, C>: DynSync,
97{
98    let mut collect_shard_jobs = |shard: &HashTable<(C::Key, ActiveKeyStatus<'tcx>)>| {
99        for (key, status) in shard.iter() {
100            if let ActiveKeyStatus::Started(job) = status {
101                // It's fine to call `create_tagged_key` with the shard locked,
102                // because it's just a `TaggedQueryKey` variant constructor.
103                let tagged_key = (query.create_tagged_key)(*key);
104                job_map.insert(job.id, QueryJobInfo { tagged_key, job: job.clone() });
105            }
106        }
107    };
108
109    match collect_kind {
110        CollectActiveJobsKind::Full => {
111            for shard in query.state.active.lock_shards() {
112                collect_shard_jobs(&shard);
113            }
114        }
115        CollectActiveJobsKind::FullNoContention => {
116            for shard in query.state.active.try_lock_shards() {
117                match shard {
118                    Some(shard) => collect_shard_jobs(&shard),
119                    None => {
    ::core::panicking::panic_fmt(format_args!("Failed to collect active jobs for query `{0}`!",
            query.name));
}panic!("Failed to collect active jobs for query `{}`!", query.name),
120                }
121            }
122        }
123        CollectActiveJobsKind::PartialAllowed => {
124            for shard in query.state.active.try_lock_shards() {
125                match shard {
126                    Some(shard) => collect_shard_jobs(&shard),
127                    // This collection is best-effort (it is only used to print the query
128                    // stack on panic), so a contended shard is expected and fine to skip.
129                    // Emitting this at `warn!` would leak nondeterministically into the
130                    // panic output under the parallel front-end, where another thread may
131                    // still hold a shard lock, so keep it at `debug!`.
132                    None => {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event /rustc-dev/1303417c416e1595173d9689e7394c31e136ae95/compiler/rustc_query_impl/src/job.rs:132",
                        "rustc_query_impl::job", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("/rustc-dev/1303417c416e1595173d9689e7394c31e136ae95/compiler/rustc_query_impl/src/job.rs"),
                        ::tracing_core::__macro_support::Option::Some(132u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_query_impl::job"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::DEBUG <=
                    ::tracing::level_filters::LevelFilter::current() &&
            {
                let interest = __CALLSITE.interest();
                !interest.is_never() &&
                    ::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
                        interest)
            };
    if enabled {
        (|value_set: ::tracing::field::ValueSet|
                    {
                        let meta = __CALLSITE.metadata();
                        ::tracing::Event::dispatch(meta, &value_set);
                        ;
                    })({
                #[allow(unused_imports)]
                use ::tracing::field::{debug, display, Value};
                __CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("Failed to collect active jobs for query `{0}`!",
                                                    query.name) as &dyn ::tracing::field::Value))])
            });
    } else { ; }
}debug!("Failed to collect active jobs for query `{}`!", query.name),
133                }
134            }
135        }
136    }
137}
138
139pub(crate) fn find_cycle_in_stack<'tcx>(
140    id: QueryJobId,
141    job_map: QueryJobMap<'tcx>,
142    current_job: &Option<QueryJobId>,
143    span: Span,
144) -> QueryCycle<'tcx> {
145    // Find the waitee amongst `current_job` parents.
146    let mut frames = Vec::new();
147    let mut current_job = Option::clone(current_job);
148
149    while let Some(job) = current_job {
150        let info = &job_map.map[&job];
151        frames.push(QueryStackFrame { span: info.job.span, tagged_key: info.tagged_key });
152
153        if job == id {
154            frames.reverse();
155
156            // This is the end of the cycle. The span entry we included was for
157            // the usage of the cycle itself, and not part of the cycle.
158            // Replace it with the span which caused the cycle to form.
159            frames[0].span = span;
160            // Find out why the cycle itself was used.
161            let usage = try {
162                let parent = info.job.parent?;
163                QueryStackFrame { span: info.job.span, tagged_key: job_map.tagged_key_of(parent) }
164            };
165            return QueryCycle { usage, frames };
166        }
167
168        current_job = info.job.parent;
169    }
170
171    { ::core::panicking::panic_fmt(format_args!("did not find a cycle")); }panic!("did not find a cycle")
172}
173
174/// Finds the query job closest to the root that is for the same query method as `id`
175/// (but not necessarily the same query key), and returns information about it.
176#[cold]
177#[inline(never)]
178pub(crate) fn find_dep_kind_root<'tcx>(
179    tcx: TyCtxt<'tcx>,
180    id: QueryJobId,
181    job_map: QueryJobMap<'tcx>,
182) -> (Span, String, usize) {
183    let mut depth = 1;
184    let mut info = &job_map.map[&id];
185    // Two query jobs are for the same query method if they have the same
186    // `TaggedQueryKey` discriminant.
187    let expected_query = mem::discriminant::<TaggedQueryKey<'tcx>>(&info.tagged_key);
188    let mut last_info = info;
189
190    while let Some(id) = info.job.parent {
191        info = &job_map.map[&id];
192        if mem::discriminant(&info.tagged_key) == expected_query {
193            depth += 1;
194            last_info = info;
195        }
196    }
197    (last_info.job.span, last_info.tagged_key.description(tcx), depth)
198}
199
200/// The locaton of a resumable waiter. The usize is the index into waiters in the query's latch.
201/// We'll use this to remove the waiter if we're waking it up in `find_and_process_cycle`.
202type ResumableWaiterLocation = (QueryJobId, usize);
203
204/// This abstracts over non-resumable waiters which are found in `QueryJob`'s `parent` field
205/// and resumable waiters are in `latch` field.
206struct AbstractedWaiter {
207    /// The span corresponding to the reason for why we're waiting on this query.
208    span: Span,
209    /// The query which we are waiting from, if none the waiter is from a compiler root.
210    parent: Option<QueryJobId>,
211    resumable: Option<ResumableWaiterLocation>,
212}
213
214/// Returns all the non-resumable and resumable waiters of a query.
215/// This is used so we can uniformly loop over both non-resumable and resumable waiters.
216fn abstracted_waiters_of(job_map: &QueryJobMap<'_>, query: QueryJobId) -> Vec<AbstractedWaiter> {
217    let mut result = Vec::new();
218
219    // Add the parent which is a non-resumable waiter since it's on the same stack
220    result.push(AbstractedWaiter {
221        span: job_map.span_of(query),
222        parent: job_map.parent_of(query),
223        resumable: None,
224    });
225
226    // Add the explicit waiters which use condvars and are resumable
227    if let Some(latch) = job_map.latch_of(query) {
228        for (i, waiter) in latch.waiters.lock().as_ref().unwrap().iter().enumerate() {
229            result.push(AbstractedWaiter {
230                span: waiter.span,
231                parent: waiter.parent,
232                resumable: Some((query, i)),
233            });
234        }
235    }
236
237    result
238}
239
240/// Looks for a query cycle by doing a depth first search starting at `query`.
241/// `span` is the reason for the `query` to execute. This is initially DUMMY_SP.
242/// If a cycle is detected, this initial value is replaced with the span causing
243/// the cycle. `stack` will contain just the cycle on return if detected.
244fn find_cycle<'tcx>(
245    job_map: &QueryJobMap<'tcx>,
246    query: QueryJobId,
247    span: Span,
248    stack: &mut Vec<(Span, QueryJobId)>,
249    visited: &mut FxHashSet<QueryJobId>,
250) -> ControlFlow<Option<ResumableWaiterLocation>> {
251    if !visited.insert(query) {
252        return if let Some(pos) = stack.iter().position(|q| q.1 == query) {
253            // We detected a query cycle, fix up the initial span and return Some
254
255            // Remove previous stack entries
256            stack.drain(0..pos);
257            // Replace the span for the first query with the cycle cause
258            stack[0].0 = span;
259            ControlFlow::Break(None)
260        } else {
261            ControlFlow::Continue(())
262        };
263    }
264
265    // Query marked as visited is added it to the stack
266    stack.push((span, query));
267
268    // Visit all the waiters
269    for abstracted_waiter in abstracted_waiters_of(job_map, query) {
270        let Some(parent) = abstracted_waiter.parent else {
271            // Skip waiters which are not queries
272            continue;
273        };
274        if let ControlFlow::Break(maybe_resumable) =
275            find_cycle(job_map, parent, abstracted_waiter.span, stack, visited)
276        {
277            // Return the resumable waiter in `waiter.resumable` if present
278            return ControlFlow::Break(abstracted_waiter.resumable.or(maybe_resumable));
279        }
280    }
281
282    // Remove the entry in our stack since we didn't find a cycle
283    stack.pop();
284
285    ControlFlow::Continue(())
286}
287
288/// Finds out if there's a path to the compiler root (aka. code which isn't in a query)
289/// from `query` without going through any of the queries in `visited`.
290/// This is achieved with a depth first search.
291fn connected_to_root<'tcx>(
292    job_map: &QueryJobMap<'tcx>,
293    query: QueryJobId,
294    visited: &mut FxHashSet<QueryJobId>,
295) -> bool {
296    // We already visited this or we're deliberately ignoring it
297    if !visited.insert(query) {
298        return false;
299    }
300
301    // Visit all the waiters
302    for abstracted_waiter in abstracted_waiters_of(job_map, query) {
303        match abstracted_waiter.parent {
304            // This query is connected to the root
305            None => return true,
306            Some(parent) => {
307                if connected_to_root(job_map, parent, visited) {
308                    return true;
309                }
310            }
311        }
312    }
313
314    false
315}
316
317/// Processes a found query cycle into a `Cycle`
318fn process_cycle<'tcx>(
319    job_map: &QueryJobMap<'tcx>,
320    stack: Vec<(Span, QueryJobId)>,
321) -> QueryCycle<'tcx> {
322    // The stack is a vector of pairs of spans and queries; reverse it so that
323    // the earlier entries require later entries
324    let (mut spans, queries): (Vec<_>, Vec<_>) = stack.into_iter().rev().unzip();
325
326    // Shift the spans so that queries are matched with the span for their waitee
327    spans.rotate_right(1);
328
329    // Zip them back together
330    let mut stack: Vec<_> = iter::zip(spans, queries).collect();
331
332    struct EntryPoint {
333        query_in_cycle: QueryJobId,
334        query_waiting_on_cycle: Option<(Span, QueryJobId)>,
335    }
336
337    // Find the queries in the cycle which are
338    // connected to queries outside the cycle
339    let entry_points = stack
340        .iter()
341        .filter_map(|&(_, query_in_cycle)| {
342            let mut entrypoint = false;
343            let mut query_waiting_on_cycle = None;
344
345            // Find a direct waiter who leads to the root
346            for abstracted_waiter in abstracted_waiters_of(job_map, query_in_cycle) {
347                let Some(parent) = abstracted_waiter.parent else {
348                    // The query in the cycle is directly connected to root.
349                    entrypoint = true;
350                    continue;
351                };
352
353                // Mark all the other queries in the cycle as already visited,
354                // so paths to the root through the cycle itself won't count.
355                let mut visited = FxHashSet::from_iter(stack.iter().map(|q| q.1));
356
357                if connected_to_root(job_map, parent, &mut visited) {
358                    query_waiting_on_cycle = Some((abstracted_waiter.span, parent));
359                    entrypoint = true;
360                    break;
361                }
362            }
363
364            entrypoint.then_some(EntryPoint { query_in_cycle, query_waiting_on_cycle })
365        })
366        .collect::<Vec<EntryPoint>>();
367
368    // Pick an entry point, preferring ones with waiters
369    let entry_point = entry_points
370        .iter()
371        .find(|entry_point| entry_point.query_waiting_on_cycle.is_some())
372        .unwrap_or(&entry_points[0]);
373
374    // Shift the stack so that our entry point is first
375    let entry_point_pos = stack.iter().position(|(_, query)| *query == entry_point.query_in_cycle);
376    if let Some(pos) = entry_point_pos {
377        stack.rotate_left(pos);
378    }
379
380    let usage = entry_point
381        .query_waiting_on_cycle
382        .map(|(span, job)| QueryStackFrame { span, tagged_key: job_map.tagged_key_of(job) });
383
384    // Create the cycle error
385    QueryCycle {
386        usage,
387        frames: stack
388            .iter()
389            .map(|&(span, job)| QueryStackFrame { span, tagged_key: job_map.tagged_key_of(job) })
390            .collect(),
391    }
392}
393
394/// Looks for a query cycle starting at `query`.
395/// Returns a waiter to resume if a cycle is found.
396fn find_and_process_cycle<'tcx>(
397    job_map: &QueryJobMap<'tcx>,
398    query: QueryJobId,
399) -> Option<Arc<QueryWaiter<'tcx>>> {
400    let mut visited = FxHashSet::default();
401    let mut stack = Vec::new();
402    if let ControlFlow::Break(resumable) =
403        find_cycle(job_map, query, DUMMY_SP, &mut stack, &mut visited)
404    {
405        // Create the cycle error
406        let error = process_cycle(job_map, stack);
407
408        // We unwrap `resumable` here since there must always be one
409        // edge which is resumable / waited using a query latch
410        let (waitee_query, waiter_idx) = resumable.unwrap();
411
412        // Extract the waiter we want to resume.
413        let waiter = {
414            let latch = job_map.latch_of(waitee_query).unwrap();
415            let mut waiters_guard = latch.waiters.lock();
416            let waiters = waiters_guard.as_mut().expect("non-empty waiters vec");
417            // Remove the waiter from the list of waiters.
418            waiters.remove(waiter_idx)
419        };
420
421        // Set the cycle error so it will be picked up when resumed
422        *waiter.cycle.lock() = Some(error);
423
424        // Put the waiter on the list of things to resume
425        Some(waiter)
426    } else {
427        None
428    }
429}
430
431/// Detects query cycles by using depth first search over all active query jobs.
432/// If a query cycle is found it will break the cycle by finding an edge which
433/// uses a query latch and then resuming that waiter.
434///
435/// There may be multiple cycles involved in a deadlock, but this only breaks one at a time so
436/// there will be multiple rounds through the deadlock handler if multiple cycles are present.
437#[allow(rustc::potential_query_instability)]
438pub fn break_query_cycle<'tcx>(job_map: QueryJobMap<'tcx>, registry: &rustc_thread_pool::Registry) {
439    // Look for a cycle starting at each query job
440    let waiter = job_map
441        .map
442        .keys()
443        .find_map(|query| find_and_process_cycle(&job_map, *query))
444        .expect("unable to find a query cycle");
445
446    // Mark the thread we're about to wake up as unblocked.
447    rustc_thread_pool::mark_unblocked(registry);
448
449    if !waiter.condvar.notify_one() {
    {
        ::core::panicking::panic_fmt(format_args!("unable to wake the waiter"));
    }
};assert!(waiter.condvar.notify_one(), "unable to wake the waiter");
450}
451
452pub fn print_query_stack<'tcx>(
453    tcx: TyCtxt<'tcx>,
454    mut current_query: Option<QueryJobId>,
455    limit_frames: Option<usize>,
456    mut file: Option<std::fs::File>,
457) -> usize {
458    // Be careful relying on global state here: this code is called from
459    // a panic hook, which means that the global `DiagCtxt` may be in a weird
460    // state if it was responsible for triggering the panic.
461    let mut count_printed = 0;
462    let mut count_total = 0;
463
464    // Make use of a partial query job map if we fail to take locks collecting active queries.
465    let job_map = collect_active_query_jobs(tcx, CollectActiveJobsKind::PartialAllowed);
466
467    if let Some(ref mut file) = file {
468        let _ = file.write_fmt(format_args!("\n\nquery stack during panic:\n"))writeln!(file, "\n\nquery stack during panic:");
469    }
470    while let Some(query) = current_query {
471        let Some(query_info) = job_map.map.get(&query) else {
472            break;
473        };
474        let description = query_info.tagged_key.description(tcx);
475        if Some(count_printed) < limit_frames || limit_frames.is_none() {
476            // Only print to stderr as many stack frames as `num_frames` when present.
477            {
    ::std::io::_eprint(format_args!("#{1} [{0}] {2}\n",
            query_info.tagged_key.query_name(), count_printed, description));
};eprintln!(
478                "#{count_printed} [{query_name}] {description}",
479                query_name = query_info.tagged_key.query_name(),
480            );
481            count_printed += 1;
482        }
483
484        if let Some(ref mut file) = file {
485            let _ = file.write_fmt(format_args!("#{1} [{0}] {2}\n",
        query_info.tagged_key.query_name(), count_total, description))writeln!(
486                file,
487                "#{count_total} [{query_name}] {description}",
488                query_name = query_info.tagged_key.query_name(),
489            );
490        }
491
492        current_query = query_info.job.parent;
493        count_total += 1;
494    }
495
496    if let Some(ref mut file) = file {
497        let _ = file.write_fmt(format_args!("end of query stack\n"))writeln!(file, "end of query stack");
498    }
499    count_total
500}