1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 use dep_graph::SerializedDepNodeIndex;
12 use dep_graph::DepNode;
13 use hir::def_id::{CrateNum, DefId, DefIndex};
14 use mir::interpret::{GlobalId, ConstValue};
15 use traits::query::{CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal};
16 use ty::{self, ParamEnvAnd, Ty, TyCtxt};
17 use ty::subst::Substs;
18 use ty::maps::queries;
20 use ty::maps::QueryMap;
24 use syntax_pos::symbol::InternedString;
25 use rustc_data_structures::sync::Lock;
26 use rustc_data_structures::stable_hasher::HashStable;
27 use ich::StableHashingContext;
29 /// Query configuration and description traits.
31 pub trait QueryConfig<'tcx> {
32 const NAME: &'static str;
34 type Key: Eq + Hash + Clone + Debug;
35 type Value: Clone + for<'a> HashStable<StableHashingContext<'a>>;
37 fn query(key: Self::Key) -> Query<'tcx>;
39 // Don't use this method to access query results, instead use the methods on TyCtxt
40 fn query_map<'a>(tcx: TyCtxt<'a, 'tcx, '_>) -> &'a Lock<QueryMap<'tcx, Self>>;
42 fn to_dep_node(tcx: TyCtxt<'_, 'tcx, '_>, key: &Self::Key) -> DepNode;
44 // Don't use this method to compute query results, instead use the methods on TyCtxt
45 fn compute(tcx: TyCtxt<'_, 'tcx, '_>, key: Self::Key) -> Self::Value;
47 fn handle_cycle_error(tcx: TyCtxt<'_, 'tcx, '_>) -> Self::Value;
50 pub trait QueryDescription<'tcx>: QueryConfig<'tcx> {
51 fn describe(tcx: TyCtxt, key: Self::Key) -> String;
54 fn cache_on_disk(_: Self::Key) -> bool {
58 fn try_load_from_disk(_: TyCtxt<'_, 'tcx, 'tcx>,
59 _: SerializedDepNodeIndex)
60 -> Option<Self::Value> {
61 bug!("QueryDescription::load_from_disk() called for an unsupported query.")
65 impl<'tcx, M: QueryConfig<'tcx, Key=DefId>> QueryDescription<'tcx> for M {
66 default fn describe(tcx: TyCtxt, def_id: DefId) -> String {
67 if !tcx.sess.verbose() {
68 format!("processing `{}`", tcx.item_path_str(def_id))
70 let name = unsafe { ::std::intrinsics::type_name::<M>() };
71 format!("processing `{}` applied to `{:?}`", name, def_id)
76 impl<'tcx> QueryDescription<'tcx> for queries::normalize_projection_ty<'tcx> {
79 goal: CanonicalProjectionGoal<'tcx>,
81 format!("normalizing `{:?}`", goal)
85 impl<'tcx> QueryDescription<'tcx> for queries::dropck_outlives<'tcx> {
86 fn describe(_tcx: TyCtxt, goal: CanonicalTyGoal<'tcx>) -> String {
87 format!("computing dropck types for `{:?}`", goal)
91 impl<'tcx> QueryDescription<'tcx> for queries::normalize_ty_after_erasing_regions<'tcx> {
92 fn describe(_tcx: TyCtxt, goal: ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
93 format!("normalizing `{:?}`", goal)
97 impl<'tcx> QueryDescription<'tcx> for queries::evaluate_obligation<'tcx> {
98 fn describe(_tcx: TyCtxt, goal: CanonicalPredicateGoal<'tcx>) -> String {
99 format!("evaluating trait selection obligation `{}`", goal.value.value)
103 impl<'tcx> QueryDescription<'tcx> for queries::is_copy_raw<'tcx> {
104 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
105 format!("computing whether `{}` is `Copy`", env.value)
109 impl<'tcx> QueryDescription<'tcx> for queries::is_sized_raw<'tcx> {
110 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
111 format!("computing whether `{}` is `Sized`", env.value)
115 impl<'tcx> QueryDescription<'tcx> for queries::is_freeze_raw<'tcx> {
116 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
117 format!("computing whether `{}` is freeze", env.value)
121 impl<'tcx> QueryDescription<'tcx> for queries::needs_drop_raw<'tcx> {
122 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
123 format!("computing whether `{}` needs drop", env.value)
127 impl<'tcx> QueryDescription<'tcx> for queries::layout_raw<'tcx> {
128 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
129 format!("computing layout of `{}`", env.value)
133 impl<'tcx> QueryDescription<'tcx> for queries::super_predicates_of<'tcx> {
134 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
135 format!("computing the supertraits of `{}`",
136 tcx.item_path_str(def_id))
140 impl<'tcx> QueryDescription<'tcx> for queries::const_value_to_allocation<'tcx> {
141 fn describe(_tcx: TyCtxt, (val, ty): (ConstValue<'tcx>, Ty<'tcx>)) -> String {
142 format!("converting value `{:?}` ({}) to an allocation", val, ty)
146 impl<'tcx> QueryDescription<'tcx> for queries::erase_regions_ty<'tcx> {
147 fn describe(_tcx: TyCtxt, ty: Ty<'tcx>) -> String {
148 format!("erasing regions from `{:?}`", ty)
152 impl<'tcx> QueryDescription<'tcx> for queries::type_param_predicates<'tcx> {
153 fn describe(tcx: TyCtxt, (_, def_id): (DefId, DefId)) -> String {
154 let id = tcx.hir.as_local_node_id(def_id).unwrap();
155 format!("computing the bounds for type parameter `{}`",
156 tcx.hir.ty_param_name(id))
160 impl<'tcx> QueryDescription<'tcx> for queries::coherent_trait<'tcx> {
161 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
162 format!("coherence checking all impls of trait `{}`",
163 tcx.item_path_str(def_id))
167 impl<'tcx> QueryDescription<'tcx> for queries::upstream_monomorphizations<'tcx> {
168 fn describe(_: TyCtxt, k: CrateNum) -> String {
169 format!("collecting available upstream monomorphizations `{:?}`", k)
173 impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls<'tcx> {
174 fn describe(_: TyCtxt, k: CrateNum) -> String {
175 format!("all inherent impls defined in crate `{:?}`", k)
179 impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls_overlap_check<'tcx> {
180 fn describe(_: TyCtxt, _: CrateNum) -> String {
181 format!("check for overlap between inherent impls defined in this crate")
185 impl<'tcx> QueryDescription<'tcx> for queries::crate_variances<'tcx> {
186 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
187 format!("computing the variances for items in this crate")
191 impl<'tcx> QueryDescription<'tcx> for queries::inferred_outlives_crate<'tcx> {
192 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
193 format!("computing the inferred outlives predicates for items in this crate")
197 impl<'tcx> QueryDescription<'tcx> for queries::mir_shims<'tcx> {
198 fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
199 format!("generating MIR shim for `{}`",
200 tcx.item_path_str(def.def_id()))
204 impl<'tcx> QueryDescription<'tcx> for queries::privacy_access_levels<'tcx> {
205 fn describe(_: TyCtxt, _: CrateNum) -> String {
206 format!("privacy access levels")
210 impl<'tcx> QueryDescription<'tcx> for queries::typeck_item_bodies<'tcx> {
211 fn describe(_: TyCtxt, _: CrateNum) -> String {
212 format!("type-checking all item bodies")
216 impl<'tcx> QueryDescription<'tcx> for queries::reachable_set<'tcx> {
217 fn describe(_: TyCtxt, _: CrateNum) -> String {
218 format!("reachability")
222 impl<'tcx> QueryDescription<'tcx> for queries::const_eval<'tcx> {
223 fn describe(tcx: TyCtxt, key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>) -> String {
224 format!("const-evaluating `{}`", tcx.item_path_str(key.value.instance.def.def_id()))
228 fn cache_on_disk(_key: Self::Key) -> bool {
233 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
234 id: SerializedDepNodeIndex)
235 -> Option<Self::Value> {
236 tcx.on_disk_query_result_cache.try_load_query_result(tcx, id).map(Ok)
240 impl<'tcx> QueryDescription<'tcx> for queries::mir_keys<'tcx> {
241 fn describe(_: TyCtxt, _: CrateNum) -> String {
242 format!("getting a list of all mir_keys")
246 impl<'tcx> QueryDescription<'tcx> for queries::symbol_name<'tcx> {
247 fn describe(_tcx: TyCtxt, instance: ty::Instance<'tcx>) -> String {
248 format!("computing the symbol for `{}`", instance)
252 fn cache_on_disk(_: Self::Key) -> bool {
257 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
258 id: SerializedDepNodeIndex)
259 -> Option<Self::Value> {
260 tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
264 impl<'tcx> QueryDescription<'tcx> for queries::describe_def<'tcx> {
265 fn describe(_: TyCtxt, _: DefId) -> String {
270 impl<'tcx> QueryDescription<'tcx> for queries::def_span<'tcx> {
271 fn describe(_: TyCtxt, _: DefId) -> String {
277 impl<'tcx> QueryDescription<'tcx> for queries::lookup_stability<'tcx> {
278 fn describe(_: TyCtxt, _: DefId) -> String {
283 impl<'tcx> QueryDescription<'tcx> for queries::lookup_deprecation_entry<'tcx> {
284 fn describe(_: TyCtxt, _: DefId) -> String {
289 impl<'tcx> QueryDescription<'tcx> for queries::item_attrs<'tcx> {
290 fn describe(_: TyCtxt, _: DefId) -> String {
295 impl<'tcx> QueryDescription<'tcx> for queries::is_reachable_non_generic<'tcx> {
296 fn describe(_: TyCtxt, _: DefId) -> String {
297 bug!("is_reachable_non_generic")
301 impl<'tcx> QueryDescription<'tcx> for queries::fn_arg_names<'tcx> {
302 fn describe(_: TyCtxt, _: DefId) -> String {
307 impl<'tcx> QueryDescription<'tcx> for queries::impl_parent<'tcx> {
308 fn describe(_: TyCtxt, _: DefId) -> String {
313 impl<'tcx> QueryDescription<'tcx> for queries::trait_of_item<'tcx> {
314 fn describe(_: TyCtxt, _: DefId) -> String {
315 bug!("trait_of_item")
319 impl<'tcx> QueryDescription<'tcx> for queries::const_is_rvalue_promotable_to_static<'tcx> {
320 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
321 format!("const checking if rvalue is promotable to static `{}`",
322 tcx.item_path_str(def_id))
326 fn cache_on_disk(_: Self::Key) -> bool {
331 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
332 id: SerializedDepNodeIndex)
333 -> Option<Self::Value> {
334 tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
338 impl<'tcx> QueryDescription<'tcx> for queries::rvalue_promotable_map<'tcx> {
339 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
340 format!("checking which parts of `{}` are promotable to static",
341 tcx.item_path_str(def_id))
345 impl<'tcx> QueryDescription<'tcx> for queries::is_mir_available<'tcx> {
346 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
347 format!("checking if item is mir available: `{}`",
348 tcx.item_path_str(def_id))
352 impl<'tcx> QueryDescription<'tcx> for queries::trans_fulfill_obligation<'tcx> {
353 fn describe(tcx: TyCtxt, key: (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>)) -> String {
354 format!("checking if `{}` fulfills its obligations", tcx.item_path_str(key.1.def_id()))
358 fn cache_on_disk(_: Self::Key) -> bool {
363 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
364 id: SerializedDepNodeIndex)
365 -> Option<Self::Value> {
366 tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
370 impl<'tcx> QueryDescription<'tcx> for queries::trait_impls_of<'tcx> {
371 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
372 format!("trait impls of `{}`", tcx.item_path_str(def_id))
376 impl<'tcx> QueryDescription<'tcx> for queries::is_object_safe<'tcx> {
377 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
378 format!("determine object safety of trait `{}`", tcx.item_path_str(def_id))
382 impl<'tcx> QueryDescription<'tcx> for queries::is_const_fn<'tcx> {
383 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
384 format!("checking if item is const fn: `{}`", tcx.item_path_str(def_id))
388 impl<'tcx> QueryDescription<'tcx> for queries::dylib_dependency_formats<'tcx> {
389 fn describe(_: TyCtxt, _: CrateNum) -> String {
390 "dylib dependency formats of crate".to_string()
394 impl<'tcx> QueryDescription<'tcx> for queries::is_panic_runtime<'tcx> {
395 fn describe(_: TyCtxt, _: CrateNum) -> String {
396 "checking if the crate is_panic_runtime".to_string()
400 impl<'tcx> QueryDescription<'tcx> for queries::is_compiler_builtins<'tcx> {
401 fn describe(_: TyCtxt, _: CrateNum) -> String {
402 "checking if the crate is_compiler_builtins".to_string()
406 impl<'tcx> QueryDescription<'tcx> for queries::has_global_allocator<'tcx> {
407 fn describe(_: TyCtxt, _: CrateNum) -> String {
408 "checking if the crate has_global_allocator".to_string()
412 impl<'tcx> QueryDescription<'tcx> for queries::extern_crate<'tcx> {
413 fn describe(_: TyCtxt, _: DefId) -> String {
414 "getting crate's ExternCrateData".to_string()
418 impl<'tcx> QueryDescription<'tcx> for queries::lint_levels<'tcx> {
419 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
420 format!("computing the lint levels for items in this crate")
424 impl<'tcx> QueryDescription<'tcx> for queries::specializes<'tcx> {
425 fn describe(_tcx: TyCtxt, _: (DefId, DefId)) -> String {
426 format!("computing whether impls specialize one another")
430 impl<'tcx> QueryDescription<'tcx> for queries::in_scope_traits_map<'tcx> {
431 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
432 format!("traits in scope at a block")
436 impl<'tcx> QueryDescription<'tcx> for queries::is_no_builtins<'tcx> {
437 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
438 format!("test whether a crate has #![no_builtins]")
442 impl<'tcx> QueryDescription<'tcx> for queries::panic_strategy<'tcx> {
443 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
444 format!("query a crate's configured panic strategy")
448 impl<'tcx> QueryDescription<'tcx> for queries::is_profiler_runtime<'tcx> {
449 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
450 format!("query a crate is #![profiler_runtime]")
454 impl<'tcx> QueryDescription<'tcx> for queries::is_sanitizer_runtime<'tcx> {
455 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
456 format!("query a crate is #![sanitizer_runtime]")
460 impl<'tcx> QueryDescription<'tcx> for queries::reachable_non_generics<'tcx> {
461 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
462 format!("looking up the exported symbols of a crate")
466 impl<'tcx> QueryDescription<'tcx> for queries::native_libraries<'tcx> {
467 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
468 format!("looking up the native libraries of a linked crate")
472 impl<'tcx> QueryDescription<'tcx> for queries::foreign_modules<'tcx> {
473 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
474 format!("looking up the foreign modules of a linked crate")
478 impl<'tcx> QueryDescription<'tcx> for queries::plugin_registrar_fn<'tcx> {
479 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
480 format!("looking up the plugin registrar for a crate")
484 impl<'tcx> QueryDescription<'tcx> for queries::derive_registrar_fn<'tcx> {
485 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
486 format!("looking up the derive registrar for a crate")
490 impl<'tcx> QueryDescription<'tcx> for queries::crate_disambiguator<'tcx> {
491 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
492 format!("looking up the disambiguator a crate")
496 impl<'tcx> QueryDescription<'tcx> for queries::crate_hash<'tcx> {
497 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
498 format!("looking up the hash a crate")
502 impl<'tcx> QueryDescription<'tcx> for queries::original_crate_name<'tcx> {
503 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
504 format!("looking up the original name a crate")
508 impl<'tcx> QueryDescription<'tcx> for queries::extra_filename<'tcx> {
509 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
510 format!("looking up the extra filename for a crate")
514 impl<'tcx> QueryDescription<'tcx> for queries::implementations_of_trait<'tcx> {
515 fn describe(_tcx: TyCtxt, _: (CrateNum, DefId)) -> String {
516 format!("looking up implementations of a trait in a crate")
520 impl<'tcx> QueryDescription<'tcx> for queries::all_trait_implementations<'tcx> {
521 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
522 format!("looking up all (?) trait implementations")
526 impl<'tcx> QueryDescription<'tcx> for queries::link_args<'tcx> {
527 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
528 format!("looking up link arguments for a crate")
532 impl<'tcx> QueryDescription<'tcx> for queries::resolve_lifetimes<'tcx> {
533 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
534 format!("resolving lifetimes")
538 impl<'tcx> QueryDescription<'tcx> for queries::named_region_map<'tcx> {
539 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
540 format!("looking up a named region")
544 impl<'tcx> QueryDescription<'tcx> for queries::is_late_bound_map<'tcx> {
545 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
546 format!("testing if a region is late boudn")
550 impl<'tcx> QueryDescription<'tcx> for queries::object_lifetime_defaults_map<'tcx> {
551 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
552 format!("looking up lifetime defaults for a region")
556 impl<'tcx> QueryDescription<'tcx> for queries::dep_kind<'tcx> {
557 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
558 format!("fetching what a dependency looks like")
562 impl<'tcx> QueryDescription<'tcx> for queries::crate_name<'tcx> {
563 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
564 format!("fetching what a crate is named")
568 impl<'tcx> QueryDescription<'tcx> for queries::get_lang_items<'tcx> {
569 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
570 format!("calculating the lang items map")
574 impl<'tcx> QueryDescription<'tcx> for queries::defined_lang_items<'tcx> {
575 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
576 format!("calculating the lang items defined in a crate")
580 impl<'tcx> QueryDescription<'tcx> for queries::missing_lang_items<'tcx> {
581 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
582 format!("calculating the missing lang items in a crate")
586 impl<'tcx> QueryDescription<'tcx> for queries::visible_parent_map<'tcx> {
587 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
588 format!("calculating the visible parent map")
592 impl<'tcx> QueryDescription<'tcx> for queries::missing_extern_crate_item<'tcx> {
593 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
594 format!("seeing if we're missing an `extern crate` item for this crate")
598 impl<'tcx> QueryDescription<'tcx> for queries::used_crate_source<'tcx> {
599 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
600 format!("looking at the source for a crate")
604 impl<'tcx> QueryDescription<'tcx> for queries::postorder_cnums<'tcx> {
605 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
606 format!("generating a postorder list of CrateNums")
610 impl<'tcx> QueryDescription<'tcx> for queries::maybe_unused_extern_crates<'tcx> {
611 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
612 format!("looking up all possibly unused extern crates")
616 impl<'tcx> QueryDescription<'tcx> for queries::stability_index<'tcx> {
617 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
618 format!("calculating the stability index for the local crate")
622 impl<'tcx> QueryDescription<'tcx> for queries::all_traits<'tcx> {
623 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
624 format!("fetching all foreign and local traits")
628 impl<'tcx> QueryDescription<'tcx> for queries::all_crate_nums<'tcx> {
629 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
630 format!("fetching all foreign CrateNum instances")
634 impl<'tcx> QueryDescription<'tcx> for queries::exported_symbols<'tcx> {
635 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
636 format!("exported_symbols")
640 impl<'tcx> QueryDescription<'tcx> for queries::collect_and_partition_translation_items<'tcx> {
641 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
642 format!("collect_and_partition_translation_items")
646 impl<'tcx> QueryDescription<'tcx> for queries::codegen_unit<'tcx> {
647 fn describe(_tcx: TyCtxt, _: InternedString) -> String {
648 format!("codegen_unit")
652 impl<'tcx> QueryDescription<'tcx> for queries::compile_codegen_unit<'tcx> {
653 fn describe(_tcx: TyCtxt, _: InternedString) -> String {
654 format!("compile_codegen_unit")
658 impl<'tcx> QueryDescription<'tcx> for queries::output_filenames<'tcx> {
659 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
660 format!("output_filenames")
664 impl<'tcx> QueryDescription<'tcx> for queries::vtable_methods<'tcx> {
665 fn describe(tcx: TyCtxt, key: ty::PolyTraitRef<'tcx> ) -> String {
666 format!("finding all methods for trait {}", tcx.item_path_str(key.def_id()))
670 impl<'tcx> QueryDescription<'tcx> for queries::features_query<'tcx> {
671 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
672 format!("looking up enabled feature gates")
676 impl<'tcx> QueryDescription<'tcx> for queries::typeck_tables_of<'tcx> {
678 fn cache_on_disk(def_id: Self::Key) -> bool {
682 fn try_load_from_disk(tcx: TyCtxt<'_, 'tcx, 'tcx>,
683 id: SerializedDepNodeIndex)
684 -> Option<Self::Value> {
685 let typeck_tables: Option<ty::TypeckTables<'tcx>> = tcx
686 .on_disk_query_result_cache
687 .try_load_query_result(tcx, id);
689 typeck_tables.map(|tables| tcx.alloc_tables(tables))
693 impl<'tcx> QueryDescription<'tcx> for queries::optimized_mir<'tcx> {
695 fn cache_on_disk(def_id: Self::Key) -> bool {
699 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
700 id: SerializedDepNodeIndex)
701 -> Option<Self::Value> {
702 let mir: Option<::mir::Mir<'tcx>> = tcx.on_disk_query_result_cache
703 .try_load_query_result(tcx, id);
704 mir.map(|x| tcx.alloc_mir(x))
708 impl<'tcx> QueryDescription<'tcx> for queries::substitute_normalize_and_test_predicates<'tcx> {
709 fn describe(tcx: TyCtxt, key: (DefId, &'tcx Substs<'tcx>)) -> String {
710 format!("testing substituted normalized predicates:`{}`", tcx.item_path_str(key.0))
714 impl<'tcx> QueryDescription<'tcx> for queries::target_features_whitelist<'tcx> {
715 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
716 format!("looking up the whitelist of target features")
720 impl<'tcx> QueryDescription<'tcx> for queries::instance_def_size_estimate<'tcx> {
721 fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
722 format!("estimating size for `{}`", tcx.item_path_str(def.def_id()))
726 impl<'tcx> QueryDescription<'tcx> for queries::wasm_custom_sections<'tcx> {
727 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
728 format!("custom wasm sections for a crate")
732 impl<'tcx> QueryDescription<'tcx> for queries::generics_of<'tcx> {
734 fn cache_on_disk(def_id: Self::Key) -> bool {
738 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
739 id: SerializedDepNodeIndex)
740 -> Option<Self::Value> {
741 let generics: Option<ty::Generics> = tcx.on_disk_query_result_cache
742 .try_load_query_result(tcx, id);
743 generics.map(|x| tcx.alloc_generics(x))
747 impl<'tcx> QueryDescription<'tcx> for queries::program_clauses_for<'tcx> {
748 fn describe(_tcx: TyCtxt, _: DefId) -> String {
749 format!("generating chalk-style clauses")
753 impl<'tcx> QueryDescription<'tcx> for queries::program_clauses_for_env<'tcx> {
754 fn describe(_tcx: TyCtxt, _: ty::ParamEnv<'tcx>) -> String {
755 format!("generating chalk-style clauses for param env")
759 impl<'tcx> QueryDescription<'tcx> for queries::wasm_import_module_map<'tcx> {
760 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
761 format!("wasm import module map")
765 impl<'tcx> QueryDescription<'tcx> for queries::dllimport_foreign_items<'tcx> {
766 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
767 format!("wasm import module map")
771 macro_rules! impl_disk_cacheable_query(
772 ($query_name:ident, |$key:tt| $cond:expr) => {
773 impl<'tcx> QueryDescription<'tcx> for queries::$query_name<'tcx> {
775 fn cache_on_disk($key: Self::Key) -> bool {
780 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
781 id: SerializedDepNodeIndex)
782 -> Option<Self::Value> {
783 tcx.on_disk_query_result_cache.try_load_query_result(tcx, id)
789 impl_disk_cacheable_query!(unsafety_check_result, |def_id| def_id.is_local());
790 impl_disk_cacheable_query!(borrowck, |def_id| def_id.is_local());
791 impl_disk_cacheable_query!(mir_borrowck, |def_id| def_id.is_local());
792 impl_disk_cacheable_query!(mir_const_qualif, |def_id| def_id.is_local());
793 impl_disk_cacheable_query!(check_match, |def_id| def_id.is_local());
794 impl_disk_cacheable_query!(def_symbol_name, |_| true);
795 impl_disk_cacheable_query!(type_of, |def_id| def_id.is_local());
796 impl_disk_cacheable_query!(predicates_of, |def_id| def_id.is_local());
797 impl_disk_cacheable_query!(used_trait_imports, |def_id| def_id.is_local());
798 impl_disk_cacheable_query!(trans_fn_attrs, |_| true);
799 impl_disk_cacheable_query!(specialization_graph_of, |_| true);