Skip to main content

rustc_query_impl/
execution.rs

1use std::hash::Hash;
2use std::mem::ManuallyDrop;
3
4use rustc_data_structures::hash_table::{Entry, HashTable};
5use rustc_data_structures::stack::ensure_sufficient_stack;
6use rustc_data_structures::sync::{DynSend, DynSync};
7use rustc_data_structures::{outline, sharded, sync};
8use rustc_errors::FatalError;
9use rustc_middle::dep_graph::{DepGraphData, DepNodeKey, SerializedDepNodeIndex};
10use rustc_middle::query::{
11    ActiveKeyStatus, Cycle, EnsureMode, QueryCache, QueryJob, QueryJobId, QueryKey, QueryLatch,
12    QueryMode, QueryState, QueryVTable,
13};
14use rustc_middle::ty::TyCtxt;
15use rustc_middle::verify_ich::incremental_verify_ich;
16use rustc_span::{DUMMY_SP, Span};
17use tracing::warn;
18
19use crate::dep_graph::{DepNode, DepNodeIndex};
20use crate::job::{QueryJobInfo, QueryJobMap, create_cycle_error, find_cycle_in_stack};
21use crate::plumbing::{current_query_job, loadable_from_disk, next_job_id, start_query};
22use crate::query_impl::for_each_query_vtable;
23
24#[inline]
25fn equivalent_key<K: Eq, V>(k: K) -> impl Fn(&(K, V)) -> bool {
26    move |x| x.0 == k
27}
28
29pub(crate) fn all_inactive<'tcx, K>(state: &QueryState<'tcx, K>) -> bool {
30    state.active.lock_shards().all(|shard| shard.is_empty())
31}
32
33#[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)]
34pub enum CollectActiveJobsKind {
35    /// We need the full query job map, and we are willing to wait to obtain the query state
36    /// shard lock(s).
37    Full,
38
39    /// We need the full query job map, and we shouldn't need to wait to obtain the shard lock(s),
40    /// because we are in a place where nothing else could hold the shard lock(s).
41    FullNoContention,
42
43    /// We can get by without the full query job map, so we won't bother waiting to obtain the
44    /// shard lock(s) if they're not already unlocked.
45    PartialAllowed,
46}
47
48/// Returns a map of currently active query jobs, collected from all queries.
49pub fn collect_active_query_jobs<'tcx>(
50    tcx: TyCtxt<'tcx>,
51    collect_kind: CollectActiveJobsKind,
52) -> QueryJobMap<'tcx> {
53    let mut job_map = QueryJobMap::default();
54
55    {
    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_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.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.hir_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.lower_delayed_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.delayed_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.local_def_id_to_hir_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.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.opt_hir_owner_nodes;
    (|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.opt_ast_lowering_delayed_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.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_lazy;
    (|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.predicates_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.lints_that_dont_need_to_run;
    (|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_predicates_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_predicates_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_predicates_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_predicates_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_predicates;
    (|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_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_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.typing_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.in_scope_traits_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.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.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.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.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.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.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_predicates;
    (|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.skip_move_check_fns;
    (|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| {
56        collect_active_query_jobs_inner(query, collect_kind, &mut job_map);
57    });
58
59    job_map
60}
61
62/// Internal plumbing for collecting the set of active jobs for this query.
63///
64/// Aborts if jobs can't be gathered as specified by `collect_kind`.
65fn collect_active_query_jobs_inner<'tcx, C>(
66    query: &'tcx QueryVTable<'tcx, C>,
67    collect_kind: CollectActiveJobsKind,
68    job_map: &mut QueryJobMap<'tcx>,
69) where
70    C: QueryCache<Key: QueryKey + DynSend + DynSync>,
71    QueryVTable<'tcx, C>: DynSync,
72{
73    let mut collect_shard_jobs = |shard: &HashTable<(C::Key, ActiveKeyStatus<'tcx>)>| {
74        for (key, status) in shard.iter() {
75            if let ActiveKeyStatus::Started(job) = status {
76                // It's fine to call `create_tagged_key` with the shard locked,
77                // because it's just a `TaggedQueryKey` variant constructor.
78                let tagged_key = (query.create_tagged_key)(*key);
79                job_map.insert(job.id, QueryJobInfo { tagged_key, job: job.clone() });
80            }
81        }
82    };
83
84    match collect_kind {
85        CollectActiveJobsKind::Full => {
86            for shard in query.state.active.lock_shards() {
87                collect_shard_jobs(&shard);
88            }
89        }
90        CollectActiveJobsKind::FullNoContention => {
91            for shard in query.state.active.try_lock_shards() {
92                match shard {
93                    Some(shard) => collect_shard_jobs(&shard),
94                    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),
95                }
96            }
97        }
98        CollectActiveJobsKind::PartialAllowed => {
99            for shard in query.state.active.try_lock_shards() {
100                match shard {
101                    Some(shard) => collect_shard_jobs(&shard),
102                    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/execution.rs:102",
                        "rustc_query_impl::execution", ::tracing::Level::WARN,
                        ::tracing_core::__macro_support::Option::Some("compiler/rustc_query_impl/src/execution.rs"),
                        ::tracing_core::__macro_support::Option::Some(102u32),
                        ::tracing_core::__macro_support::Option::Some("rustc_query_impl::execution"),
                        ::tracing_core::field::FieldSet::new(&["message"],
                            ::tracing_core::callsite::Identifier(&__CALLSITE)),
                        ::tracing::metadata::Kind::EVENT)
                };
            ::tracing::callsite::DefaultCallsite::new(&META)
        };
    let enabled =
        ::tracing::Level::WARN <= ::tracing::level_filters::STATIC_MAX_LEVEL
                &&
                ::tracing::Level::WARN <=
                    ::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};
                let mut iter = __CALLSITE.metadata().fields().iter();
                __CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
                                    ::tracing::__macro_support::Option::Some(&format_args!("Failed to collect active jobs for query `{0}`!",
                                                    query.name) as &dyn Value))])
            });
    } else { ; }
}warn!("Failed to collect active jobs for query `{}`!", query.name),
103                }
104            }
105        }
106    }
107}
108
109#[cold]
110#[inline(never)]
111fn handle_cycle<'tcx, C: QueryCache>(
112    query: &'tcx QueryVTable<'tcx, C>,
113    tcx: TyCtxt<'tcx>,
114    key: C::Key,
115    cycle: Cycle<'tcx>,
116) -> C::Value {
117    let error = create_cycle_error(tcx, &cycle);
118    (query.handle_cycle_error_fn)(tcx, key, cycle, error)
119}
120
121/// Guard object representing the responsibility to execute a query job and
122/// mark it as completed.
123///
124/// This will poison the relevant query key if it is dropped without calling
125/// [`Self::complete`].
126struct ActiveJobGuard<'tcx, K>
127where
128    K: Eq + Hash + Copy,
129{
130    state: &'tcx QueryState<'tcx, K>,
131    key: K,
132    key_hash: u64,
133}
134
135impl<'tcx, K> ActiveJobGuard<'tcx, K>
136where
137    K: Eq + Hash + Copy,
138{
139    /// Completes the query by updating the query cache with the `result`,
140    /// signals the waiter, and forgets the guard so it won't poison the query.
141    fn complete<C>(self, cache: &C, value: C::Value, dep_node_index: DepNodeIndex)
142    where
143        C: QueryCache<Key = K>,
144    {
145        // Mark as complete before we remove the job from the active state
146        // so no other thread can re-execute this query.
147        cache.complete(self.key, value, dep_node_index);
148
149        let mut this = ManuallyDrop::new(self);
150
151        // Drop everything without poisoning the query.
152        this.drop_and_maybe_poison(/* poison */ false);
153    }
154
155    fn drop_and_maybe_poison(&mut self, poison: bool) {
156        let status = {
157            let mut shard = self.state.active.lock_shard_by_hash(self.key_hash);
158            match shard.find_entry(self.key_hash, equivalent_key(self.key)) {
159                Err(_) => {
160                    // Note: we must not panic while holding the lock, because unwinding also looks
161                    // at this map, which can result in a double panic. So drop it first.
162                    drop(shard);
163                    ::core::panicking::panic("explicit panic");panic!();
164                }
165                Ok(occupied) => {
166                    let ((key, status), vacant) = occupied.remove();
167                    if poison {
168                        vacant.insert((key, ActiveKeyStatus::Poisoned));
169                    }
170                    status
171                }
172            }
173        };
174
175        // Also signal the completion of the job, so waiters will continue execution.
176        match status {
177            ActiveKeyStatus::Started(job) => job.signal_complete(),
178            ActiveKeyStatus::Poisoned => ::core::panicking::panic("explicit panic")panic!(),
179        }
180    }
181}
182
183impl<'tcx, K> Drop for ActiveJobGuard<'tcx, K>
184where
185    K: Eq + Hash + Copy,
186{
187    #[inline(never)]
188    #[cold]
189    fn drop(&mut self) {
190        // Poison the query so jobs waiting on it panic.
191        self.drop_and_maybe_poison(/* poison */ true);
192    }
193}
194
195#[cold]
196#[inline(never)]
197fn find_and_handle_cycle<'tcx, C: QueryCache>(
198    query: &'tcx QueryVTable<'tcx, C>,
199    tcx: TyCtxt<'tcx>,
200    key: C::Key,
201    try_execute: QueryJobId,
202    span: Span,
203) -> (C::Value, Option<DepNodeIndex>) {
204    // Ensure there were no errors collecting all active jobs.
205    // We need the complete map to ensure we find a cycle to break.
206    let job_map = collect_active_query_jobs(tcx, CollectActiveJobsKind::FullNoContention);
207
208    let cycle = find_cycle_in_stack(try_execute, job_map, &current_query_job(), span);
209    (handle_cycle(query, tcx, key, cycle), None)
210}
211
212#[inline(always)]
213fn wait_for_query<'tcx, C: QueryCache>(
214    query: &'tcx QueryVTable<'tcx, C>,
215    tcx: TyCtxt<'tcx>,
216    span: Span,
217    key: C::Key,
218    key_hash: u64,
219    latch: QueryLatch<'tcx>,
220    current: Option<QueryJobId>,
221) -> (C::Value, Option<DepNodeIndex>) {
222    // For parallel queries, we'll block and wait until the query running
223    // in another thread has completed. Record how long we wait in the
224    // self-profiler.
225    let query_blocked_prof_timer = tcx.prof.query_blocked();
226
227    // With parallel queries we might just have to wait on some other thread.
228    let result = latch.wait_on(tcx, current, span);
229
230    match result {
231        Ok(()) => {
232            let Some((v, index)) = query.cache.lookup(&key) else {
233                outline(|| {
234                    // We didn't find the query result in the query cache. Check if it was
235                    // poisoned due to a panic instead.
236                    let shard = query.state.active.lock_shard_by_hash(key_hash);
237                    match shard.find(key_hash, equivalent_key(key)) {
238                        // The query we waited on panicked. Continue unwinding here.
239                        Some((_, ActiveKeyStatus::Poisoned)) => FatalError.raise(),
240                        _ => {
    ::core::panicking::panic_fmt(format_args!("query \'{0}\' result must be in the cache or the query must be poisoned after a wait",
            query.name));
}panic!(
241                            "query '{}' result must be in the cache or the query must be poisoned after a wait",
242                            query.name
243                        ),
244                    }
245                })
246            };
247
248            tcx.prof.query_cache_hit(index.into());
249            query_blocked_prof_timer.finish_with_query_invocation_id(index.into());
250
251            (v, Some(index))
252        }
253        Err(cycle) => (handle_cycle(query, tcx, key, cycle), None),
254    }
255}
256
257/// Shared main part of both [`execute_query_incr_inner`] and [`execute_query_non_incr_inner`].
258#[inline(never)]
259fn try_execute_query<'tcx, C: QueryCache, const INCR: bool>(
260    query: &'tcx QueryVTable<'tcx, C>,
261    tcx: TyCtxt<'tcx>,
262    span: Span,
263    key: C::Key,
264    dep_node: Option<DepNode>, // `None` for non-incremental, `Some` for incremental
265) -> (C::Value, Option<DepNodeIndex>) {
266    let key_hash = sharded::make_hash(&key);
267    let mut state_lock = query.state.active.lock_shard_by_hash(key_hash);
268
269    // For the parallel compiler we need to check both the query cache and query state structures
270    // while holding the state lock to ensure that 1) the query has not yet completed and 2) the
271    // query is not still executing. Without checking the query cache here, we can end up
272    // re-executing the query since `try_start` only checks that the query is not currently
273    // executing, but another thread may have already completed the query and stores it result
274    // in the query cache.
275    if tcx.sess.threads() > 1 {
276        if let Some((value, index)) = query.cache.lookup(&key) {
277            tcx.prof.query_cache_hit(index.into());
278            return (value, Some(index));
279        }
280    }
281
282    let current_job_id = current_query_job();
283
284    match state_lock.entry(key_hash, equivalent_key(key), |(k, _)| sharded::make_hash(k)) {
285        Entry::Vacant(entry) => {
286            // Nothing has computed or is computing the query, so we start a new job and insert it
287            // in the state map.
288            let id = next_job_id(tcx);
289            let job = QueryJob::new(id, span, current_job_id);
290            entry.insert((key, ActiveKeyStatus::Started(job)));
291
292            // Drop the lock before we start executing the query.
293            drop(state_lock);
294
295            // Set up a guard object that will automatically poison the query if a
296            // panic occurs while executing the query (or any intermediate plumbing).
297            let job_guard = ActiveJobGuard { state: &query.state, key, key_hash };
298
299            // Delegate to another function to actually execute the query job.
300            let (value, dep_node_index) = if INCR {
301                execute_job_incr(query, tcx, key, dep_node.unwrap(), id)
302            } else {
303                execute_job_non_incr(query, tcx, key, id)
304            };
305
306            if query.feedable {
307                check_feedable_consistency(tcx, query, key, &value);
308            }
309
310            // Tell the guard to insert `value` in the cache and remove the status entry from
311            // `query.state`.
312            job_guard.complete(&query.cache, value, dep_node_index);
313
314            (value, Some(dep_node_index))
315        }
316        Entry::Occupied(mut entry) => {
317            match &mut entry.get_mut().1 {
318                ActiveKeyStatus::Started(job) => {
319                    if sync::is_dyn_thread_safe() {
320                        // Get the latch out
321                        let latch = job.latch();
322                        drop(state_lock);
323
324                        // Only call `wait_for_query` if we're using a Rayon thread pool
325                        // as it will attempt to mark the worker thread as blocked.
326                        wait_for_query(query, tcx, span, key, key_hash, latch, current_job_id)
327                    } else {
328                        let id = job.id;
329                        drop(state_lock);
330
331                        // If we are single-threaded we know that we have cycle error,
332                        // so we just return the error.
333                        find_and_handle_cycle(query, tcx, key, id, span)
334                    }
335                }
336                ActiveKeyStatus::Poisoned => FatalError.raise(),
337            }
338        }
339    }
340}
341
342#[inline(always)]
343fn check_feedable_consistency<'tcx, C: QueryCache>(
344    tcx: TyCtxt<'tcx>,
345    query: &'tcx QueryVTable<'tcx, C>,
346    key: C::Key,
347    value: &C::Value,
348) {
349    // We should not compute queries that also got a value via feeding.
350    // This can't happen, as query feeding adds the very dependencies to the fed query
351    // as its feeding query had. So if the fed query is red, so is its feeder, which will
352    // get evaluated first, and re-feed the query.
353    let Some((cached_value, _)) = query.cache.lookup(&key) else { return };
354
355    let Some(hash_value_fn) = query.hash_value_fn else {
356        {
    ::core::panicking::panic_fmt(format_args!("no_hash fed query later has its value computed.\nRemove `no_hash` modifier to allow recomputation.\nThe already cached value: {0}",
            (query.format_value)(&cached_value)));
};panic!(
357            "no_hash fed query later has its value computed.\n\
358            Remove `no_hash` modifier to allow recomputation.\n\
359            The already cached value: {}",
360            (query.format_value)(&cached_value)
361        );
362    };
363
364    let (old_hash, new_hash) = tcx.with_stable_hashing_context(|mut hcx| {
365        (hash_value_fn(&mut hcx, &cached_value), hash_value_fn(&mut hcx, value))
366    });
367    let formatter = query.format_value;
368    if old_hash != new_hash {
369        // We have an inconsistency. This can happen if one of the two
370        // results is tainted by errors.
371        if !tcx.dcx().has_errors().is_some() {
    {
        ::core::panicking::panic_fmt(format_args!("Computed query value for {0:?}({1:?}) is inconsistent with fed value,\ncomputed={2:#?}\nfed={3:#?}",
                query.dep_kind, key, formatter(value),
                formatter(&cached_value)));
    }
};assert!(
372            tcx.dcx().has_errors().is_some(),
373            "Computed query value for {:?}({:?}) is inconsistent with fed value,\n\
374                computed={:#?}\nfed={:#?}",
375            query.dep_kind,
376            key,
377            formatter(value),
378            formatter(&cached_value),
379        );
380    }
381}
382
383// Fast path for when incr. comp. is off.
384#[inline(always)]
385fn execute_job_non_incr<'tcx, C: QueryCache>(
386    query: &'tcx QueryVTable<'tcx, C>,
387    tcx: TyCtxt<'tcx>,
388    key: C::Key,
389    job_id: QueryJobId,
390) -> (C::Value, DepNodeIndex) {
391    if true {
    if !!tcx.dep_graph.is_fully_enabled() {
        ::core::panicking::panic("assertion failed: !tcx.dep_graph.is_fully_enabled()")
    };
};debug_assert!(!tcx.dep_graph.is_fully_enabled());
392
393    let prof_timer = tcx.prof.query_provider();
394    // Call the query provider.
395    let value = start_query(job_id, query.depth_limit, || (query.invoke_provider_fn)(tcx, key));
396    let dep_node_index = tcx.dep_graph.next_virtual_depnode_index();
397    prof_timer.finish_with_query_invocation_id(dep_node_index.into());
398
399    // Sanity: Fingerprint the key and the result to assert they don't contain anything unhashable.
400    if truecfg!(debug_assertions) {
401        let _ = key.to_fingerprint(tcx);
402        if let Some(hash_value_fn) = query.hash_value_fn {
403            tcx.with_stable_hashing_context(|mut hcx| {
404                hash_value_fn(&mut hcx, &value);
405            });
406        }
407    }
408
409    (value, dep_node_index)
410}
411
412#[inline(always)]
413fn execute_job_incr<'tcx, C: QueryCache>(
414    query: &'tcx QueryVTable<'tcx, C>,
415    tcx: TyCtxt<'tcx>,
416    key: C::Key,
417    dep_node: DepNode,
418    job_id: QueryJobId,
419) -> (C::Value, DepNodeIndex) {
420    let dep_graph_data =
421        tcx.dep_graph.data().expect("should always be present in incremental mode");
422
423    if !query.eval_always {
424        // The diagnostics for this query will be promoted to the current session during
425        // `try_mark_green()`, so we can ignore them here.
426        if let Some(ret) = start_query(job_id, false, || try {
427            let (prev_index, dep_node_index) = dep_graph_data.try_mark_green(tcx, &dep_node)?;
428            let value = load_from_disk_or_invoke_provider_green(
429                tcx,
430                dep_graph_data,
431                query,
432                key,
433                &dep_node,
434                prev_index,
435                dep_node_index,
436            );
437            (value, dep_node_index)
438        }) {
439            return ret;
440        }
441    }
442
443    let prof_timer = tcx.prof.query_provider();
444
445    let (result, dep_node_index) = start_query(job_id, query.depth_limit, || {
446        // Call the query provider.
447        dep_graph_data.with_task(
448            dep_node,
449            tcx,
450            (query, key),
451            |tcx, (query, key)| (query.invoke_provider_fn)(tcx, key),
452            query.hash_value_fn,
453        )
454    });
455
456    prof_timer.finish_with_query_invocation_id(dep_node_index.into());
457
458    (result, dep_node_index)
459}
460
461/// Given that the dep node for this query+key is green, obtain a value for it
462/// by loading one from disk if possible, or by invoking its query provider if
463/// necessary.
464#[inline(always)]
465fn load_from_disk_or_invoke_provider_green<'tcx, C: QueryCache>(
466    tcx: TyCtxt<'tcx>,
467    dep_graph_data: &DepGraphData,
468    query: &'tcx QueryVTable<'tcx, C>,
469    key: C::Key,
470    dep_node: &DepNode,
471    prev_index: SerializedDepNodeIndex,
472    dep_node_index: DepNodeIndex,
473) -> C::Value {
474    // Note this function can be called concurrently from the same query
475    // We must ensure that this is handled correctly.
476
477    if true {
    if !dep_graph_data.is_index_green(prev_index) {
        ::core::panicking::panic("assertion failed: dep_graph_data.is_index_green(prev_index)")
    };
};debug_assert!(dep_graph_data.is_index_green(prev_index));
478
479    // First try to load the result from the on-disk cache. Some things are never cached on disk.
480    let value;
481    let verify;
482    match (query.try_load_from_disk_fn)(tcx, key, prev_index, dep_node_index) {
483        Some(loaded_value) => {
484            if std::intrinsics::unlikely(tcx.sess.opts.unstable_opts.query_dep_graph) {
485                dep_graph_data.mark_debug_loaded_from_disk(*dep_node)
486            }
487
488            value = loaded_value;
489
490            let prev_fingerprint = dep_graph_data.prev_value_fingerprint_of(prev_index);
491            // If `-Zincremental-verify-ich` is specified, re-hash results from
492            // the cache and make sure that they have the expected fingerprint.
493            //
494            // If not, we still seek to verify a subset of fingerprints loaded
495            // from disk. Re-hashing results is fairly expensive, so we can't
496            // currently afford to verify every hash. This subset should still
497            // give us some coverage of potential bugs.
498            verify = prev_fingerprint.split().1.as_u64().is_multiple_of(32)
499                || tcx.sess.opts.unstable_opts.incremental_verify_ich;
500        }
501        None => {
502            // We could not load a result from the on-disk cache, so recompute. The dep-graph for
503            // this computation is already in-place, so we can just call the query provider.
504            let prof_timer = tcx.prof.query_provider();
505            value = tcx.dep_graph.with_ignore(|| (query.invoke_provider_fn)(tcx, key));
506            prof_timer.finish_with_query_invocation_id(dep_node_index.into());
507
508            verify = true;
509        }
510    };
511
512    if verify {
513        // Verify that re-running the query produced a result with the expected hash.
514        // This catches bugs in query implementations, turning them into ICEs.
515        // For example, a query might sort its result by `DefId` - since `DefId`s are
516        // not stable across compilation sessions, the result could get up getting sorted
517        // in a different order when the query is re-run, even though all of the inputs
518        // (e.g. `DefPathHash` values) were green.
519        //
520        // See issue #82920 for an example of a miscompilation that would get turned into
521        // an ICE by this check
522        incremental_verify_ich(
523            tcx,
524            dep_graph_data,
525            &value,
526            prev_index,
527            query.hash_value_fn,
528            query.format_value,
529        );
530    }
531
532    value
533}
534
535/// Checks whether a `tcx.ensure_ok()` or `tcx.ensure_done()` query call can
536/// return early without actually trying to execute.
537///
538/// This only makes sense during incremental compilation, because it relies
539/// on having the dependency graph (and in some cases a disk-cached value)
540/// from the previous incr-comp session.
541#[inline(never)]
542fn ensure_can_skip_execution<'tcx, C: QueryCache>(
543    query: &'tcx QueryVTable<'tcx, C>,
544    tcx: TyCtxt<'tcx>,
545    key: C::Key,
546    dep_node: DepNode,
547    ensure_mode: EnsureMode,
548) -> bool {
549    // Queries with `eval_always` should never skip execution.
550    if query.eval_always {
551        return false;
552    }
553
554    match tcx.dep_graph.try_mark_green(tcx, &dep_node) {
555        None => {
556            // A None return from `try_mark_green` means that this is either
557            // a new dep node or that the dep node has already been marked red.
558            // Either way, we can't call `dep_graph.read()` as we don't have the
559            // DepNodeIndex. We must invoke the query itself. The performance cost
560            // this introduces should be negligible as we'll immediately hit the
561            // in-memory cache, or another query down the line will.
562            false
563        }
564        Some((serialized_dep_node_index, dep_node_index)) => {
565            tcx.dep_graph.read_index(dep_node_index);
566            tcx.prof.query_cache_hit(dep_node_index.into());
567            match ensure_mode {
568                // In ensure-ok mode, we can skip execution for this key if the
569                // node is green. It must have succeeded in the previous
570                // session, and therefore would succeed in the current session
571                // if executed.
572                EnsureMode::Ok => true,
573
574                // In ensure-done mode, we can only skip execution for this key
575                // if there's a disk-cached value available to load later if
576                // needed, which guarantees the query provider will never run
577                // for this key.
578                EnsureMode::Done => {
579                    (query.will_cache_on_disk_for_key_fn)(tcx, key)
580                        && loadable_from_disk(tcx, serialized_dep_node_index)
581                }
582            }
583        }
584    }
585}
586
587/// Called by a macro-generated impl of [`QueryVTable::execute_query_fn`],
588/// in non-incremental mode.
589#[inline(always)]
590pub(super) fn execute_query_non_incr_inner<'tcx, C: QueryCache>(
591    query: &'tcx QueryVTable<'tcx, C>,
592    tcx: TyCtxt<'tcx>,
593    span: Span,
594    key: C::Key,
595) -> C::Value {
596    ensure_sufficient_stack(|| try_execute_query::<C, false>(query, tcx, span, key, None).0)
597}
598
599/// Called by a macro-generated impl of [`QueryVTable::execute_query_fn`],
600/// in incremental mode.
601#[inline(always)]
602pub(super) fn execute_query_incr_inner<'tcx, C: QueryCache>(
603    query: &'tcx QueryVTable<'tcx, C>,
604    tcx: TyCtxt<'tcx>,
605    span: Span,
606    key: C::Key,
607    mode: QueryMode,
608) -> Option<C::Value> {
609    let dep_node = DepNode::construct(tcx, query.dep_kind, &key);
610
611    // Check if query execution can be skipped, for `ensure_ok` or `ensure_done`.
612    if let QueryMode::Ensure { ensure_mode } = mode
613        && ensure_can_skip_execution(query, tcx, key, dep_node, ensure_mode)
614    {
615        return None;
616    }
617
618    let (result, dep_node_index) = ensure_sufficient_stack(|| {
619        try_execute_query::<C, true>(query, tcx, span, key, Some(dep_node))
620    });
621    if let Some(dep_node_index) = dep_node_index {
622        tcx.dep_graph.read_index(dep_node_index)
623    }
624    Some(result)
625}
626
627/// Inner implementation of [`DepKindVTable::force_from_dep_node_fn`][force_fn]
628/// for query nodes.
629///
630/// [force_fn]: rustc_middle::dep_graph::DepKindVTable::force_from_dep_node_fn
631pub(crate) fn force_query_dep_node<'tcx, C: QueryCache>(
632    tcx: TyCtxt<'tcx>,
633    query: &'tcx QueryVTable<'tcx, C>,
634    dep_node: DepNode,
635) -> bool {
636    let Some(key) = C::Key::try_recover_key(tcx, &dep_node) else {
637        // We couldn't recover a key from the node's key fingerprint.
638        // Tell the caller that we couldn't force the node.
639        return false;
640    };
641
642    ensure_sufficient_stack(|| {
643        try_execute_query::<C, true>(query, tcx, DUMMY_SP, key, Some(dep_node))
644    });
645
646    // We did manage to recover a key and force the node, though it's up to
647    // the caller to check whether the node ended up marked red or green.
648    true
649}