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_errors::DiagCtxtHandle;
10use rustc_middle::queries::TaggedQueryKey;
11use rustc_middle::query::{
12    ActiveKeyStatus, Cycle, QueryCache, QueryJob, QueryJobId, QueryKey, QueryLatch,
13    QueryStackFrame, QueryVTable, QueryWaiter,
14};
15use rustc_middle::ty::TyCtxt;
16use rustc_span::{DUMMY_SP, Span};
17use tracing::debug;
18
19use crate::query_vtables::for_each_query_vtable;
20
21/// Map from query job IDs to job information collected by
22/// `collect_active_query_jobs`.
23#[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() -> QueryJobMap<'tcx> {
        QueryJobMap { map: ::core::default::Default::default() }
    }
}Default)]
24pub struct QueryJobMap<'tcx> {
25    map: FxHashMap<QueryJobId, QueryJobInfo<'tcx>>,
26}
27
28impl<'tcx> QueryJobMap<'tcx> {
29    /// Adds information about a job ID to the job map.
30    ///
31    /// Should only be called by `collect_active_query_jobs_inner`.
32    pub(crate) fn insert(&mut self, id: QueryJobId, info: QueryJobInfo<'tcx>) {
33        self.map.insert(id, info);
34    }
35
36    fn tagged_key_of(&self, id: QueryJobId) -> TaggedQueryKey<'tcx> {
37        self.map[&id].tagged_key
38    }
39
40    fn span_of(&self, id: QueryJobId) -> Span {
41        self.map[&id].job.span
42    }
43
44    fn parent_of(&self, id: QueryJobId) -> Option<QueryJobId> {
45        self.map[&id].job.parent
46    }
47
48    fn latch_of(&self, id: QueryJobId) -> Option<&QueryLatch<'tcx>> {
49        self.map[&id].job.latch.as_ref()
50    }
51}
52
53#[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)]
54pub(crate) struct QueryJobInfo<'tcx> {
55    pub(crate) tagged_key: TaggedQueryKey<'tcx>,
56    pub(crate) job: QueryJob<'tcx>,
57}
58
59#[derive(#[automatically_derived]
impl ::core::clone::Clone for CollectActiveJobsKind {
    #[inline]
    fn clone(&self) -> CollectActiveJobsKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CollectActiveJobsKind { }Copy)]
60pub enum CollectActiveJobsKind {
61    /// We need the full query job map, and we are willing to wait to obtain the query state
62    /// shard lock(s).
63    Full,
64
65    /// We need the full query job map, and we shouldn't need to wait to obtain the shard lock(s),
66    /// because we are in a place where nothing else could hold the shard lock(s).
67    FullNoContention,
68
69    /// We can get by without the full query job map, so we won't bother waiting to obtain the
70    /// shard lock(s) if they're not already unlocked.
71    PartialAllowed,
72}
73
74/// Returns a map of currently active query jobs, collected from all queries.
75pub fn collect_active_query_jobs<'tcx>(
76    tcx: TyCtxt<'tcx>,
77    collect_kind: CollectActiveJobsKind,
78) -> QueryJobMap<'tcx> {
79    let mut job_map = QueryJobMap::default();
80
81    {
    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.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.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_ids_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_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.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.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.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.global_backend_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.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);
};for_each_query_vtable!(ALL, tcx, |query| {
82        collect_active_query_jobs_inner(query, collect_kind, &mut job_map);
83    });
84
85    job_map
86}
87
88/// Internal plumbing for collecting the set of active jobs for this query.
89///
90/// Aborts if jobs can't be gathered as specified by `collect_kind`.
91fn collect_active_query_jobs_inner<'tcx, C>(
92    query: &'tcx QueryVTable<'tcx, C>,
93    collect_kind: CollectActiveJobsKind,
94    job_map: &mut QueryJobMap<'tcx>,
95) where
96    C: QueryCache<Key: QueryKey + DynSend + DynSync>,
97    QueryVTable<'tcx, C>: DynSync,
98{
99    let mut collect_shard_jobs = |shard: &HashTable<(C::Key, ActiveKeyStatus<'tcx>)>| {
100        for (key, status) in shard.iter() {
101            if let ActiveKeyStatus::Started(job) = status {
102                // It's fine to call `create_tagged_key` with the shard locked,
103                // because it's just a `TaggedQueryKey` variant constructor.
104                let tagged_key = (query.create_tagged_key)(*key);
105                job_map.insert(job.id, QueryJobInfo { tagged_key, job: job.clone() });
106            }
107        }
108    };
109
110    match collect_kind {
111        CollectActiveJobsKind::Full => {
112            for shard in query.state.active.lock_shards() {
113                collect_shard_jobs(&shard);
114            }
115        }
116        CollectActiveJobsKind::FullNoContention => {
117            for shard in query.state.active.try_lock_shards() {
118                match shard {
119                    Some(shard) => collect_shard_jobs(&shard),
120                    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),
121                }
122            }
123        }
124        CollectActiveJobsKind::PartialAllowed => {
125            for shard in query.state.active.try_lock_shards() {
126                match shard {
127                    Some(shard) => collect_shard_jobs(&shard),
128                    // This collection is best-effort (it is only used to print the query
129                    // stack on panic), so a contended shard is expected and fine to skip.
130                    // Emitting this at `warn!` would leak nondeterministically into the
131                    // panic output under the parallel front-end, where another thread may
132                    // still hold a shard lock, so keep it at `debug!`.
133                    None => {
    use ::tracing::__macro_support::Callsite as _;
    static __CALLSITE: ::tracing::callsite::DefaultCallsite =
        {
            static META: ::tracing::Metadata<'static> =
                {
                    ::tracing_core::metadata::Metadata::new("event compiler/rustc_query_impl/src/job.rs:133",
                        "rustc_query_impl::job", ::tracing::Level::DEBUG,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_query_impl/src/job.rs"),
                        ::tracing_core::__macro_support::Option::Some(133u32),
                        ::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),
134                }
135            }
136        }
137    }
138}
139
140pub(crate) fn find_cycle_in_stack<'tcx>(
141    id: QueryJobId,
142    job_map: QueryJobMap<'tcx>,
143    current_job: &Option<QueryJobId>,
144    span: Span,
145) -> Cycle<'tcx> {
146    // Find the waitee amongst `current_job` parents.
147    let mut frames = Vec::new();
148    let mut current_job = Option::clone(current_job);
149
150    while let Some(job) = current_job {
151        let info = &job_map.map[&job];
152        frames.push(QueryStackFrame { span: info.job.span, tagged_key: info.tagged_key });
153
154        if job == id {
155            frames.reverse();
156
157            // This is the end of the cycle. The span entry we included was for
158            // the usage of the cycle itself, and not part of the cycle.
159            // Replace it with the span which caused the cycle to form.
160            frames[0].span = span;
161            // Find out why the cycle itself was used.
162            let usage = try {
163                let parent = info.job.parent?;
164                QueryStackFrame { span: info.job.span, tagged_key: job_map.tagged_key_of(parent) }
165            };
166            return Cycle { usage, frames };
167        }
168
169        current_job = info.job.parent;
170    }
171
172    { ::core::panicking::panic_fmt(format_args!("did not find a cycle")); }panic!("did not find a cycle")
173}
174
175/// Finds the query job closest to the root that is for the same query method as `id`
176/// (but not necessarily the same query key), and returns information about it.
177#[cold]
178#[inline(never)]
179pub(crate) fn find_dep_kind_root<'tcx>(
180    tcx: TyCtxt<'tcx>,
181    id: QueryJobId,
182    job_map: QueryJobMap<'tcx>,
183) -> (Span, String, usize) {
184    let mut depth = 1;
185    let mut info = &job_map.map[&id];
186    // Two query jobs are for the same query method if they have the same
187    // `TaggedQueryKey` discriminant.
188    let expected_query = mem::discriminant::<TaggedQueryKey<'tcx>>(&info.tagged_key);
189    let mut last_info = info;
190
191    while let Some(id) = info.job.parent {
192        info = &job_map.map[&id];
193        if mem::discriminant(&info.tagged_key) == expected_query {
194            depth += 1;
195            last_info = info;
196        }
197    }
198    (last_info.job.span, last_info.tagged_key.description(tcx), depth)
199}
200
201/// The locaton of a resumable waiter. The usize is the index into waiters in the query's latch.
202/// We'll use this to remove the waiter using `QueryLatch::extract_waiter` if we're waking it up.
203type ResumableWaiterLocation = (QueryJobId, usize);
204
205/// This abstracts over non-resumable waiters which are found in `QueryJob`'s `parent` field
206/// and resumable waiters are in `latch` field.
207struct AbstractedWaiter {
208    /// The span corresponding to the reason for why we're waiting on this query.
209    span: Span,
210    /// The query which we are waiting from, if none the waiter is from a compiler root.
211    parent: Option<QueryJobId>,
212    resumable: Option<ResumableWaiterLocation>,
213}
214
215/// Returns all the non-resumable and resumable waiters of a query.
216/// This is used so we can uniformly loop over both non-resumable and resumable waiters.
217fn abstracted_waiters_of(job_map: &QueryJobMap<'_>, query: QueryJobId) -> Vec<AbstractedWaiter> {
218    let mut result = Vec::new();
219
220    // Add the parent which is a non-resumable waiter since it's on the same stack
221    result.push(AbstractedWaiter {
222        span: job_map.span_of(query),
223        parent: job_map.parent_of(query),
224        resumable: None,
225    });
226
227    // Add the explicit waiters which use condvars and are resumable
228    if let Some(latch) = job_map.latch_of(query) {
229        for (i, waiter) in latch.waiters.lock().as_ref().unwrap().iter().enumerate() {
230            result.push(AbstractedWaiter {
231                span: waiter.span,
232                parent: waiter.parent,
233                resumable: Some((query, i)),
234            });
235        }
236    }
237
238    result
239}
240
241/// Looks for a query cycle by doing a depth first search starting at `query`.
242/// `span` is the reason for the `query` to execute. This is initially DUMMY_SP.
243/// If a cycle is detected, this initial value is replaced with the span causing
244/// the cycle. `stack` will contain just the cycle on return if detected.
245fn find_cycle<'tcx>(
246    job_map: &QueryJobMap<'tcx>,
247    query: QueryJobId,
248    span: Span,
249    stack: &mut Vec<(Span, QueryJobId)>,
250    visited: &mut FxHashSet<QueryJobId>,
251) -> ControlFlow<Option<ResumableWaiterLocation>> {
252    if !visited.insert(query) {
253        return if let Some(pos) = stack.iter().position(|q| q.1 == query) {
254            // We detected a query cycle, fix up the initial span and return Some
255
256            // Remove previous stack entries
257            stack.drain(0..pos);
258            // Replace the span for the first query with the cycle cause
259            stack[0].0 = span;
260            ControlFlow::Break(None)
261        } else {
262            ControlFlow::Continue(())
263        };
264    }
265
266    // Query marked as visited is added it to the stack
267    stack.push((span, query));
268
269    // Visit all the waiters
270    for abstracted_waiter in abstracted_waiters_of(job_map, query) {
271        let Some(parent) = abstracted_waiter.parent else {
272            // Skip waiters which are not queries
273            continue;
274        };
275        if let ControlFlow::Break(maybe_resumable) =
276            find_cycle(job_map, parent, abstracted_waiter.span, stack, visited)
277        {
278            // Return the resumable waiter in `waiter.resumable` if present
279            return ControlFlow::Break(abstracted_waiter.resumable.or(maybe_resumable));
280        }
281    }
282
283    // Remove the entry in our stack since we didn't find a cycle
284    stack.pop();
285
286    ControlFlow::Continue(())
287}
288
289/// Finds out if there's a path to the compiler root (aka. code which isn't in a query)
290/// from `query` without going through any of the queries in `visited`.
291/// This is achieved with a depth first search.
292fn connected_to_root<'tcx>(
293    job_map: &QueryJobMap<'tcx>,
294    query: QueryJobId,
295    visited: &mut FxHashSet<QueryJobId>,
296) -> bool {
297    // We already visited this or we're deliberately ignoring it
298    if !visited.insert(query) {
299        return false;
300    }
301
302    // Visit all the waiters
303    for abstracted_waiter in abstracted_waiters_of(job_map, query) {
304        match abstracted_waiter.parent {
305            // This query is connected to the root
306            None => return true,
307            Some(parent) => {
308                if connected_to_root(job_map, parent, visited) {
309                    return true;
310                }
311            }
312        }
313    }
314
315    false
316}
317
318/// Processes a found query cycle into a `Cycle`
319fn process_cycle<'tcx>(job_map: &QueryJobMap<'tcx>, stack: Vec<(Span, QueryJobId)>) -> Cycle<'tcx> {
320    // The stack is a vector of pairs of spans and queries; reverse it so that
321    // the earlier entries require later entries
322    let (mut spans, queries): (Vec<_>, Vec<_>) = stack.into_iter().rev().unzip();
323
324    // Shift the spans so that queries are matched with the span for their waitee
325    spans.rotate_right(1);
326
327    // Zip them back together
328    let mut stack: Vec<_> = iter::zip(spans, queries).collect();
329
330    struct EntryPoint {
331        query_in_cycle: QueryJobId,
332        query_waiting_on_cycle: Option<(Span, QueryJobId)>,
333    }
334
335    // Find the queries in the cycle which are
336    // connected to queries outside the cycle
337    let entry_points = stack
338        .iter()
339        .filter_map(|&(_, query_in_cycle)| {
340            let mut entrypoint = false;
341            let mut query_waiting_on_cycle = None;
342
343            // Find a direct waiter who leads to the root
344            for abstracted_waiter in abstracted_waiters_of(job_map, query_in_cycle) {
345                let Some(parent) = abstracted_waiter.parent else {
346                    // The query in the cycle is directly connected to root.
347                    entrypoint = true;
348                    continue;
349                };
350
351                // Mark all the other queries in the cycle as already visited,
352                // so paths to the root through the cycle itself won't count.
353                let mut visited = FxHashSet::from_iter(stack.iter().map(|q| q.1));
354
355                if connected_to_root(job_map, parent, &mut visited) {
356                    query_waiting_on_cycle = Some((abstracted_waiter.span, parent));
357                    entrypoint = true;
358                    break;
359                }
360            }
361
362            entrypoint.then_some(EntryPoint { query_in_cycle, query_waiting_on_cycle })
363        })
364        .collect::<Vec<EntryPoint>>();
365
366    // Pick an entry point, preferring ones with waiters
367    let entry_point = entry_points
368        .iter()
369        .find(|entry_point| entry_point.query_waiting_on_cycle.is_some())
370        .unwrap_or(&entry_points[0]);
371
372    // Shift the stack so that our entry point is first
373    let entry_point_pos = stack.iter().position(|(_, query)| *query == entry_point.query_in_cycle);
374    if let Some(pos) = entry_point_pos {
375        stack.rotate_left(pos);
376    }
377
378    let usage = entry_point
379        .query_waiting_on_cycle
380        .map(|(span, job)| QueryStackFrame { span, tagged_key: job_map.tagged_key_of(job) });
381
382    // Create the cycle error
383    Cycle {
384        usage,
385        frames: stack
386            .iter()
387            .map(|&(span, job)| QueryStackFrame { span, tagged_key: job_map.tagged_key_of(job) })
388            .collect(),
389    }
390}
391
392/// Looks for a query cycle starting at `query`.
393/// Returns a waiter to resume if a cycle is found.
394fn find_and_process_cycle<'tcx>(
395    job_map: &QueryJobMap<'tcx>,
396    query: QueryJobId,
397) -> Option<Arc<QueryWaiter<'tcx>>> {
398    let mut visited = FxHashSet::default();
399    let mut stack = Vec::new();
400    if let ControlFlow::Break(resumable) =
401        find_cycle(job_map, query, DUMMY_SP, &mut stack, &mut visited)
402    {
403        // Create the cycle error
404        let error = process_cycle(job_map, stack);
405
406        // We unwrap `resumable` here since there must always be one
407        // edge which is resumable / waited using a query latch
408        let (waitee_query, waiter_idx) = resumable.unwrap();
409
410        // Extract the waiter we want to resume
411        let waiter = job_map.latch_of(waitee_query).unwrap().extract_waiter(waiter_idx);
412
413        // Set the cycle error so it will be picked up when resumed
414        *waiter.cycle.lock() = Some(error);
415
416        // Put the waiter on the list of things to resume
417        Some(waiter)
418    } else {
419        None
420    }
421}
422
423/// Detects query cycles by using depth first search over all active query jobs.
424/// If a query cycle is found it will break the cycle by finding an edge which
425/// uses a query latch and then resuming that waiter.
426///
427/// There may be multiple cycles involved in a deadlock, but this only breaks one at a time so
428/// there will be multiple rounds through the deadlock handler if multiple cycles are present.
429#[allow(rustc::potential_query_instability)]
430pub fn break_query_cycle<'tcx>(job_map: QueryJobMap<'tcx>, registry: &rustc_thread_pool::Registry) {
431    // Look for a cycle starting at each query job
432    let waiter = job_map
433        .map
434        .keys()
435        .find_map(|query| find_and_process_cycle(&job_map, *query))
436        .expect("unable to find a query cycle");
437
438    // Mark the thread we're about to wake up as unblocked.
439    rustc_thread_pool::mark_unblocked(registry);
440
441    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");
442}
443
444pub fn print_query_stack<'tcx>(
445    tcx: TyCtxt<'tcx>,
446    mut current_query: Option<QueryJobId>,
447    dcx: DiagCtxtHandle<'_>,
448    limit_frames: Option<usize>,
449    mut file: Option<std::fs::File>,
450) -> usize {
451    // Be careful relying on global state here: this code is called from
452    // a panic hook, which means that the global `DiagCtxt` may be in a weird
453    // state if it was responsible for triggering the panic.
454    let mut count_printed = 0;
455    let mut count_total = 0;
456
457    // Make use of a partial query job map if we fail to take locks collecting active queries.
458    let job_map = collect_active_query_jobs(tcx, CollectActiveJobsKind::PartialAllowed);
459
460    if let Some(ref mut file) = file {
461        let _ = file.write_fmt(format_args!("\n\nquery stack during panic:\n"))writeln!(file, "\n\nquery stack during panic:");
462    }
463    while let Some(query) = current_query {
464        let Some(query_info) = job_map.map.get(&query) else {
465            break;
466        };
467        let description = query_info.tagged_key.description(tcx);
468        if Some(count_printed) < limit_frames || limit_frames.is_none() {
469            // Only print to stderr as many stack frames as `num_frames` when present.
470            dcx.struct_failure_note(::alloc::__export::must_use({
        ::alloc::fmt::format(format_args!("#{1} [{0}] {2}",
                query_info.tagged_key.query_name(), count_printed,
                description))
    })format!(
471                "#{count_printed} [{query_name}] {description}",
472                query_name = query_info.tagged_key.query_name(),
473            ))
474            .with_span(query_info.job.span)
475            .emit();
476            count_printed += 1;
477        }
478
479        if let Some(ref mut file) = file {
480            let _ = file.write_fmt(format_args!("#{1} [{0}] {2}\n",
        query_info.tagged_key.query_name(), count_total, description))writeln!(
481                file,
482                "#{count_total} [{query_name}] {description}",
483                query_name = query_info.tagged_key.query_name(),
484            );
485        }
486
487        current_query = query_info.job.parent;
488        count_total += 1;
489    }
490
491    if let Some(ref mut file) = file {
492        let _ = file.write_fmt(format_args!("end of query stack\n"))writeln!(file, "end of query stack");
493    }
494    count_total
495}