]> git.proxmox.com Git - rustc.git/blame - src/librustc/ty/query/config.rs
New upstream version 1.30.0~beta.7+dfsg1
[rustc.git] / src / librustc / ty / query / config.rs
CommitLineData
ea8adc8c
XL
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.
4//
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.
10
abe05a73 11use dep_graph::SerializedDepNodeIndex;
83c7162d 12use dep_graph::DepNode;
ea8adc8c 13use hir::def_id::{CrateNum, DefId, DefIndex};
8faf50e0
XL
14use mir::interpret::GlobalId;
15use traits::query::{
16 CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, CanonicalTypeOpEqGoal,
17 CanonicalTypeOpNormalizeGoal, CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal,
18};
0531ce1d 19use ty::{self, ParamEnvAnd, Ty, TyCtxt};
ea8adc8c 20use ty::subst::Substs;
94b46f34
XL
21use ty::query::queries;
22use ty::query::Query;
23use ty::query::QueryCache;
b7449926 24use util::profiling::ProfileCategory;
ea8adc8c
XL
25
26use std::hash::Hash;
83c7162d 27use std::fmt::Debug;
ea8adc8c 28use syntax_pos::symbol::InternedString;
83c7162d
XL
29use rustc_data_structures::sync::Lock;
30use rustc_data_structures::stable_hasher::HashStable;
31use ich::StableHashingContext;
ea8adc8c 32
94b46f34 33// Query configuration and description traits.
ea8adc8c 34
83c7162d
XL
35pub trait QueryConfig<'tcx> {
36 const NAME: &'static str;
b7449926 37 const CATEGORY: ProfileCategory;
83c7162d
XL
38
39 type Key: Eq + Hash + Clone + Debug;
40 type Value: Clone + for<'a> HashStable<StableHashingContext<'a>>;
94b46f34 41}
83c7162d 42
94b46f34 43pub(super) trait QueryAccessors<'tcx>: QueryConfig<'tcx> {
83c7162d
XL
44 fn query(key: Self::Key) -> Query<'tcx>;
45
46 // Don't use this method to access query results, instead use the methods on TyCtxt
94b46f34 47 fn query_cache<'a>(tcx: TyCtxt<'a, 'tcx, '_>) -> &'a Lock<QueryCache<'tcx, Self>>;
83c7162d
XL
48
49 fn to_dep_node(tcx: TyCtxt<'_, 'tcx, '_>, key: &Self::Key) -> DepNode;
50
51 // Don't use this method to compute query results, instead use the methods on TyCtxt
52 fn compute(tcx: TyCtxt<'_, 'tcx, '_>, key: Self::Key) -> Self::Value;
53
54 fn handle_cycle_error(tcx: TyCtxt<'_, 'tcx, '_>) -> Self::Value;
ea8adc8c
XL
55}
56
94b46f34 57pub(super) trait QueryDescription<'tcx>: QueryAccessors<'tcx> {
ea8adc8c 58 fn describe(tcx: TyCtxt, key: Self::Key) -> String;
abe05a73 59
ff7c6d11 60 #[inline]
abe05a73
XL
61 fn cache_on_disk(_: Self::Key) -> bool {
62 false
63 }
64
ff7c6d11 65 fn try_load_from_disk(_: TyCtxt<'_, 'tcx, 'tcx>,
abe05a73 66 _: SerializedDepNodeIndex)
ff7c6d11
XL
67 -> Option<Self::Value> {
68 bug!("QueryDescription::load_from_disk() called for an unsupported query.")
abe05a73 69 }
ea8adc8c
XL
70}
71
94b46f34 72impl<'tcx, M: QueryAccessors<'tcx, Key=DefId>> QueryDescription<'tcx> for M {
ea8adc8c 73 default fn describe(tcx: TyCtxt, def_id: DefId) -> String {
abe05a73
XL
74 if !tcx.sess.verbose() {
75 format!("processing `{}`", tcx.item_path_str(def_id))
76 } else {
77 let name = unsafe { ::std::intrinsics::type_name::<M>() };
78 format!("processing `{}` applied to `{:?}`", name, def_id)
79 }
ea8adc8c
XL
80 }
81}
82
0531ce1d
XL
83impl<'tcx> QueryDescription<'tcx> for queries::normalize_projection_ty<'tcx> {
84 fn describe(
85 _tcx: TyCtxt,
86 goal: CanonicalProjectionGoal<'tcx>,
87 ) -> String {
88 format!("normalizing `{:?}`", goal)
89 }
90}
91
8faf50e0
XL
92impl<'tcx> QueryDescription<'tcx> for queries::implied_outlives_bounds<'tcx> {
93 fn describe(_tcx: TyCtxt, goal: CanonicalTyGoal<'tcx>) -> String {
94 format!("computing implied outlives bounds for `{:?}`", goal)
95 }
96}
97
0531ce1d
XL
98impl<'tcx> QueryDescription<'tcx> for queries::dropck_outlives<'tcx> {
99 fn describe(_tcx: TyCtxt, goal: CanonicalTyGoal<'tcx>) -> String {
100 format!("computing dropck types for `{:?}`", goal)
101 }
102}
103
104impl<'tcx> QueryDescription<'tcx> for queries::normalize_ty_after_erasing_regions<'tcx> {
105 fn describe(_tcx: TyCtxt, goal: ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
106 format!("normalizing `{:?}`", goal)
107 }
108}
109
83c7162d
XL
110impl<'tcx> QueryDescription<'tcx> for queries::evaluate_obligation<'tcx> {
111 fn describe(_tcx: TyCtxt, goal: CanonicalPredicateGoal<'tcx>) -> String {
112 format!("evaluating trait selection obligation `{}`", goal.value.value)
113 }
114}
115
8faf50e0
XL
116impl<'tcx> QueryDescription<'tcx> for queries::type_op_eq<'tcx> {
117 fn describe(_tcx: TyCtxt, goal: CanonicalTypeOpEqGoal<'tcx>) -> String {
118 format!("evaluating `type_op_eq` `{:?}`", goal)
119 }
120}
121
122impl<'tcx> QueryDescription<'tcx> for queries::type_op_subtype<'tcx> {
123 fn describe(_tcx: TyCtxt, goal: CanonicalTypeOpSubtypeGoal<'tcx>) -> String {
124 format!("evaluating `type_op_subtype` `{:?}`", goal)
125 }
126}
127
128impl<'tcx> QueryDescription<'tcx> for queries::type_op_prove_predicate<'tcx> {
129 fn describe(_tcx: TyCtxt, goal: CanonicalTypeOpProvePredicateGoal<'tcx>) -> String {
130 format!("evaluating `type_op_prove_predicate` `{:?}`", goal)
131 }
132}
133
134impl<'tcx> QueryDescription<'tcx> for queries::type_op_normalize_ty<'tcx> {
135 fn describe(_tcx: TyCtxt, goal: CanonicalTypeOpNormalizeGoal<'tcx, Ty<'tcx>>) -> String {
136 format!("normalizing `{:?}`", goal)
137 }
138}
139
140impl<'tcx> QueryDescription<'tcx> for queries::type_op_normalize_predicate<'tcx> {
141 fn describe(
142 _tcx: TyCtxt,
143 goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::Predicate<'tcx>>,
144 ) -> String {
145 format!("normalizing `{:?}`", goal)
146 }
147}
148
149impl<'tcx> QueryDescription<'tcx> for queries::type_op_normalize_poly_fn_sig<'tcx> {
150 fn describe(
151 _tcx: TyCtxt,
152 goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::PolyFnSig<'tcx>>,
153 ) -> String {
154 format!("normalizing `{:?}`", goal)
155 }
156}
157
158impl<'tcx> QueryDescription<'tcx> for queries::type_op_normalize_fn_sig<'tcx> {
159 fn describe(_tcx: TyCtxt, goal: CanonicalTypeOpNormalizeGoal<'tcx, ty::FnSig<'tcx>>) -> String {
160 format!("normalizing `{:?}`", goal)
161 }
162}
163
abe05a73 164impl<'tcx> QueryDescription<'tcx> for queries::is_copy_raw<'tcx> {
ea8adc8c
XL
165 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
166 format!("computing whether `{}` is `Copy`", env.value)
167 }
168}
169
abe05a73 170impl<'tcx> QueryDescription<'tcx> for queries::is_sized_raw<'tcx> {
ea8adc8c
XL
171 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
172 format!("computing whether `{}` is `Sized`", env.value)
173 }
174}
175
abe05a73 176impl<'tcx> QueryDescription<'tcx> for queries::is_freeze_raw<'tcx> {
ea8adc8c
XL
177 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
178 format!("computing whether `{}` is freeze", env.value)
179 }
180}
181
abe05a73 182impl<'tcx> QueryDescription<'tcx> for queries::needs_drop_raw<'tcx> {
ea8adc8c
XL
183 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
184 format!("computing whether `{}` needs drop", env.value)
185 }
186}
187
abe05a73 188impl<'tcx> QueryDescription<'tcx> for queries::layout_raw<'tcx> {
ea8adc8c
XL
189 fn describe(_tcx: TyCtxt, env: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> String {
190 format!("computing layout of `{}`", env.value)
191 }
192}
193
abe05a73 194impl<'tcx> QueryDescription<'tcx> for queries::super_predicates_of<'tcx> {
ea8adc8c
XL
195 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
196 format!("computing the supertraits of `{}`",
197 tcx.item_path_str(def_id))
198 }
199}
200
abe05a73
XL
201impl<'tcx> QueryDescription<'tcx> for queries::erase_regions_ty<'tcx> {
202 fn describe(_tcx: TyCtxt, ty: Ty<'tcx>) -> String {
203 format!("erasing regions from `{:?}`", ty)
204 }
205}
206
207impl<'tcx> QueryDescription<'tcx> for queries::type_param_predicates<'tcx> {
ea8adc8c
XL
208 fn describe(tcx: TyCtxt, (_, def_id): (DefId, DefId)) -> String {
209 let id = tcx.hir.as_local_node_id(def_id).unwrap();
210 format!("computing the bounds for type parameter `{}`",
211 tcx.hir.ty_param_name(id))
212 }
213}
214
abe05a73 215impl<'tcx> QueryDescription<'tcx> for queries::coherent_trait<'tcx> {
ff7c6d11 216 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
ea8adc8c
XL
217 format!("coherence checking all impls of trait `{}`",
218 tcx.item_path_str(def_id))
219 }
220}
221
83c7162d
XL
222impl<'tcx> QueryDescription<'tcx> for queries::upstream_monomorphizations<'tcx> {
223 fn describe(_: TyCtxt, k: CrateNum) -> String {
224 format!("collecting available upstream monomorphizations `{:?}`", k)
225 }
226}
227
abe05a73 228impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls<'tcx> {
ea8adc8c
XL
229 fn describe(_: TyCtxt, k: CrateNum) -> String {
230 format!("all inherent impls defined in crate `{:?}`", k)
231 }
232}
233
abe05a73 234impl<'tcx> QueryDescription<'tcx> for queries::crate_inherent_impls_overlap_check<'tcx> {
ea8adc8c 235 fn describe(_: TyCtxt, _: CrateNum) -> String {
8faf50e0 236 "check for overlap between inherent impls defined in this crate".to_string()
ea8adc8c
XL
237 }
238}
239
abe05a73 240impl<'tcx> QueryDescription<'tcx> for queries::crate_variances<'tcx> {
ea8adc8c 241 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 242 "computing the variances for items in this crate".to_string()
ea8adc8c
XL
243 }
244}
245
83c7162d
XL
246impl<'tcx> QueryDescription<'tcx> for queries::inferred_outlives_crate<'tcx> {
247 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 248 "computing the inferred outlives predicates for items in this crate".to_string()
83c7162d
XL
249 }
250}
251
abe05a73 252impl<'tcx> QueryDescription<'tcx> for queries::mir_shims<'tcx> {
ea8adc8c
XL
253 fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
254 format!("generating MIR shim for `{}`",
255 tcx.item_path_str(def.def_id()))
256 }
257}
258
abe05a73 259impl<'tcx> QueryDescription<'tcx> for queries::privacy_access_levels<'tcx> {
ea8adc8c 260 fn describe(_: TyCtxt, _: CrateNum) -> String {
8faf50e0 261 "privacy access levels".to_string()
ea8adc8c
XL
262 }
263}
264
abe05a73 265impl<'tcx> QueryDescription<'tcx> for queries::typeck_item_bodies<'tcx> {
ea8adc8c 266 fn describe(_: TyCtxt, _: CrateNum) -> String {
8faf50e0 267 "type-checking all item bodies".to_string()
ea8adc8c
XL
268 }
269}
270
abe05a73 271impl<'tcx> QueryDescription<'tcx> for queries::reachable_set<'tcx> {
ea8adc8c 272 fn describe(_: TyCtxt, _: CrateNum) -> String {
8faf50e0 273 "reachability".to_string()
ea8adc8c
XL
274 }
275}
276
abe05a73 277impl<'tcx> QueryDescription<'tcx> for queries::const_eval<'tcx> {
0531ce1d
XL
278 fn describe(tcx: TyCtxt, key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>) -> String {
279 format!("const-evaluating `{}`", tcx.item_path_str(key.value.instance.def.def_id()))
280 }
281
282 #[inline]
283 fn cache_on_disk(_key: Self::Key) -> bool {
284 true
285 }
286
287 #[inline]
288 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
289 id: SerializedDepNodeIndex)
290 -> Option<Self::Value> {
94b46f34 291 tcx.queries.on_disk_cache.try_load_query_result(tcx, id).map(Ok)
ea8adc8c
XL
292 }
293}
294
abe05a73 295impl<'tcx> QueryDescription<'tcx> for queries::mir_keys<'tcx> {
ea8adc8c 296 fn describe(_: TyCtxt, _: CrateNum) -> String {
8faf50e0 297 "getting a list of all mir_keys".to_string()
ea8adc8c
XL
298 }
299}
300
abe05a73 301impl<'tcx> QueryDescription<'tcx> for queries::symbol_name<'tcx> {
ea8adc8c
XL
302 fn describe(_tcx: TyCtxt, instance: ty::Instance<'tcx>) -> String {
303 format!("computing the symbol for `{}`", instance)
304 }
ff7c6d11
XL
305
306 #[inline]
307 fn cache_on_disk(_: Self::Key) -> bool {
308 true
309 }
310
311 #[inline]
312 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
313 id: SerializedDepNodeIndex)
314 -> Option<Self::Value> {
94b46f34 315 tcx.queries.on_disk_cache.try_load_query_result(tcx, id)
ff7c6d11 316 }
ea8adc8c
XL
317}
318
abe05a73 319impl<'tcx> QueryDescription<'tcx> for queries::describe_def<'tcx> {
ea8adc8c
XL
320 fn describe(_: TyCtxt, _: DefId) -> String {
321 bug!("describe_def")
322 }
323}
324
abe05a73 325impl<'tcx> QueryDescription<'tcx> for queries::def_span<'tcx> {
ea8adc8c
XL
326 fn describe(_: TyCtxt, _: DefId) -> String {
327 bug!("def_span")
328 }
329}
330
331
abe05a73 332impl<'tcx> QueryDescription<'tcx> for queries::lookup_stability<'tcx> {
ea8adc8c
XL
333 fn describe(_: TyCtxt, _: DefId) -> String {
334 bug!("stability")
335 }
336}
337
abe05a73 338impl<'tcx> QueryDescription<'tcx> for queries::lookup_deprecation_entry<'tcx> {
ea8adc8c
XL
339 fn describe(_: TyCtxt, _: DefId) -> String {
340 bug!("deprecation")
341 }
342}
343
abe05a73 344impl<'tcx> QueryDescription<'tcx> for queries::item_attrs<'tcx> {
ea8adc8c
XL
345 fn describe(_: TyCtxt, _: DefId) -> String {
346 bug!("item_attrs")
347 }
348}
349
0531ce1d 350impl<'tcx> QueryDescription<'tcx> for queries::is_reachable_non_generic<'tcx> {
ea8adc8c 351 fn describe(_: TyCtxt, _: DefId) -> String {
0531ce1d 352 bug!("is_reachable_non_generic")
ea8adc8c
XL
353 }
354}
355
abe05a73 356impl<'tcx> QueryDescription<'tcx> for queries::fn_arg_names<'tcx> {
ea8adc8c
XL
357 fn describe(_: TyCtxt, _: DefId) -> String {
358 bug!("fn_arg_names")
359 }
360}
361
abe05a73 362impl<'tcx> QueryDescription<'tcx> for queries::impl_parent<'tcx> {
ea8adc8c
XL
363 fn describe(_: TyCtxt, _: DefId) -> String {
364 bug!("impl_parent")
365 }
366}
367
abe05a73 368impl<'tcx> QueryDescription<'tcx> for queries::trait_of_item<'tcx> {
ea8adc8c
XL
369 fn describe(_: TyCtxt, _: DefId) -> String {
370 bug!("trait_of_item")
371 }
372}
373
abe05a73 374impl<'tcx> QueryDescription<'tcx> for queries::const_is_rvalue_promotable_to_static<'tcx> {
ea8adc8c
XL
375 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
376 format!("const checking if rvalue is promotable to static `{}`",
377 tcx.item_path_str(def_id))
378 }
ff7c6d11
XL
379
380 #[inline]
381 fn cache_on_disk(_: Self::Key) -> bool {
382 true
383 }
384
385 #[inline]
386 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
387 id: SerializedDepNodeIndex)
388 -> Option<Self::Value> {
94b46f34 389 tcx.queries.on_disk_cache.try_load_query_result(tcx, id)
ff7c6d11 390 }
ea8adc8c
XL
391}
392
abe05a73
XL
393impl<'tcx> QueryDescription<'tcx> for queries::rvalue_promotable_map<'tcx> {
394 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
395 format!("checking which parts of `{}` are promotable to static",
396 tcx.item_path_str(def_id))
397 }
398}
399
400impl<'tcx> QueryDescription<'tcx> for queries::is_mir_available<'tcx> {
ea8adc8c
XL
401 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
402 format!("checking if item is mir available: `{}`",
403 tcx.item_path_str(def_id))
404 }
405}
406
94b46f34 407impl<'tcx> QueryDescription<'tcx> for queries::codegen_fulfill_obligation<'tcx> {
abe05a73
XL
408 fn describe(tcx: TyCtxt, key: (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>)) -> String {
409 format!("checking if `{}` fulfills its obligations", tcx.item_path_str(key.1.def_id()))
410 }
ff7c6d11
XL
411
412 #[inline]
413 fn cache_on_disk(_: Self::Key) -> bool {
414 true
415 }
416
417 #[inline]
418 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
419 id: SerializedDepNodeIndex)
420 -> Option<Self::Value> {
94b46f34 421 tcx.queries.on_disk_cache.try_load_query_result(tcx, id)
ff7c6d11 422 }
abe05a73
XL
423}
424
425impl<'tcx> QueryDescription<'tcx> for queries::trait_impls_of<'tcx> {
ea8adc8c
XL
426 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
427 format!("trait impls of `{}`", tcx.item_path_str(def_id))
428 }
429}
430
abe05a73 431impl<'tcx> QueryDescription<'tcx> for queries::is_object_safe<'tcx> {
ea8adc8c
XL
432 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
433 format!("determine object safety of trait `{}`", tcx.item_path_str(def_id))
434 }
435}
436
abe05a73 437impl<'tcx> QueryDescription<'tcx> for queries::is_const_fn<'tcx> {
ea8adc8c
XL
438 fn describe(tcx: TyCtxt, def_id: DefId) -> String {
439 format!("checking if item is const fn: `{}`", tcx.item_path_str(def_id))
440 }
441}
442
abe05a73 443impl<'tcx> QueryDescription<'tcx> for queries::dylib_dependency_formats<'tcx> {
ea8adc8c
XL
444 fn describe(_: TyCtxt, _: CrateNum) -> String {
445 "dylib dependency formats of crate".to_string()
446 }
447}
448
abe05a73 449impl<'tcx> QueryDescription<'tcx> for queries::is_panic_runtime<'tcx> {
ea8adc8c
XL
450 fn describe(_: TyCtxt, _: CrateNum) -> String {
451 "checking if the crate is_panic_runtime".to_string()
452 }
453}
454
abe05a73 455impl<'tcx> QueryDescription<'tcx> for queries::is_compiler_builtins<'tcx> {
ea8adc8c
XL
456 fn describe(_: TyCtxt, _: CrateNum) -> String {
457 "checking if the crate is_compiler_builtins".to_string()
458 }
459}
460
abe05a73 461impl<'tcx> QueryDescription<'tcx> for queries::has_global_allocator<'tcx> {
ea8adc8c
XL
462 fn describe(_: TyCtxt, _: CrateNum) -> String {
463 "checking if the crate has_global_allocator".to_string()
464 }
465}
466
b7449926
XL
467impl<'tcx> QueryDescription<'tcx> for queries::has_panic_handler<'tcx> {
468 fn describe(_: TyCtxt, _: CrateNum) -> String {
469 "checking if the crate has_panic_handler".to_string()
470 }
471}
472
abe05a73 473impl<'tcx> QueryDescription<'tcx> for queries::extern_crate<'tcx> {
ea8adc8c
XL
474 fn describe(_: TyCtxt, _: DefId) -> String {
475 "getting crate's ExternCrateData".to_string()
476 }
477}
478
abe05a73 479impl<'tcx> QueryDescription<'tcx> for queries::lint_levels<'tcx> {
ea8adc8c 480 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 481 "computing the lint levels for items in this crate".to_string()
ea8adc8c
XL
482 }
483}
484
abe05a73 485impl<'tcx> QueryDescription<'tcx> for queries::specializes<'tcx> {
ea8adc8c 486 fn describe(_tcx: TyCtxt, _: (DefId, DefId)) -> String {
8faf50e0 487 "computing whether impls specialize one another".to_string()
ea8adc8c
XL
488 }
489}
490
abe05a73 491impl<'tcx> QueryDescription<'tcx> for queries::in_scope_traits_map<'tcx> {
ea8adc8c 492 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
8faf50e0 493 "traits in scope at a block".to_string()
ea8adc8c
XL
494 }
495}
496
abe05a73 497impl<'tcx> QueryDescription<'tcx> for queries::is_no_builtins<'tcx> {
ea8adc8c 498 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 499 "test whether a crate has #![no_builtins]".to_string()
ea8adc8c
XL
500 }
501}
502
abe05a73 503impl<'tcx> QueryDescription<'tcx> for queries::panic_strategy<'tcx> {
ea8adc8c 504 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 505 "query a crate's configured panic strategy".to_string()
ea8adc8c
XL
506 }
507}
508
abe05a73 509impl<'tcx> QueryDescription<'tcx> for queries::is_profiler_runtime<'tcx> {
ea8adc8c 510 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 511 "query a crate is #![profiler_runtime]".to_string()
ea8adc8c
XL
512 }
513}
514
abe05a73 515impl<'tcx> QueryDescription<'tcx> for queries::is_sanitizer_runtime<'tcx> {
ea8adc8c 516 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 517 "query a crate is #![sanitizer_runtime]".to_string()
ea8adc8c
XL
518 }
519}
520
0531ce1d 521impl<'tcx> QueryDescription<'tcx> for queries::reachable_non_generics<'tcx> {
ea8adc8c 522 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 523 "looking up the exported symbols of a crate".to_string()
ea8adc8c
XL
524 }
525}
526
abe05a73 527impl<'tcx> QueryDescription<'tcx> for queries::native_libraries<'tcx> {
ea8adc8c 528 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 529 "looking up the native libraries of a linked crate".to_string()
ea8adc8c
XL
530 }
531}
532
0531ce1d
XL
533impl<'tcx> QueryDescription<'tcx> for queries::foreign_modules<'tcx> {
534 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 535 "looking up the foreign modules of a linked crate".to_string()
0531ce1d
XL
536 }
537}
538
abe05a73 539impl<'tcx> QueryDescription<'tcx> for queries::plugin_registrar_fn<'tcx> {
ea8adc8c 540 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 541 "looking up the plugin registrar for a crate".to_string()
ea8adc8c
XL
542 }
543}
544
abe05a73 545impl<'tcx> QueryDescription<'tcx> for queries::derive_registrar_fn<'tcx> {
ea8adc8c 546 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 547 "looking up the derive registrar for a crate".to_string()
ea8adc8c
XL
548 }
549}
550
abe05a73 551impl<'tcx> QueryDescription<'tcx> for queries::crate_disambiguator<'tcx> {
ea8adc8c 552 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 553 "looking up the disambiguator a crate".to_string()
ea8adc8c
XL
554 }
555}
556
abe05a73 557impl<'tcx> QueryDescription<'tcx> for queries::crate_hash<'tcx> {
ea8adc8c 558 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 559 "looking up the hash a crate".to_string()
ea8adc8c
XL
560 }
561}
562
abe05a73 563impl<'tcx> QueryDescription<'tcx> for queries::original_crate_name<'tcx> {
ea8adc8c 564 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 565 "looking up the original name a crate".to_string()
ea8adc8c
XL
566 }
567}
568
83c7162d
XL
569impl<'tcx> QueryDescription<'tcx> for queries::extra_filename<'tcx> {
570 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 571 "looking up the extra filename for a crate".to_string()
83c7162d
XL
572 }
573}
574
abe05a73 575impl<'tcx> QueryDescription<'tcx> for queries::implementations_of_trait<'tcx> {
ea8adc8c 576 fn describe(_tcx: TyCtxt, _: (CrateNum, DefId)) -> String {
8faf50e0 577 "looking up implementations of a trait in a crate".to_string()
ea8adc8c
XL
578 }
579}
580
abe05a73 581impl<'tcx> QueryDescription<'tcx> for queries::all_trait_implementations<'tcx> {
ea8adc8c 582 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 583 "looking up all (?) trait implementations".to_string()
ea8adc8c
XL
584 }
585}
586
abe05a73 587impl<'tcx> QueryDescription<'tcx> for queries::link_args<'tcx> {
ea8adc8c 588 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 589 "looking up link arguments for a crate".to_string()
ea8adc8c
XL
590 }
591}
592
ff7c6d11
XL
593impl<'tcx> QueryDescription<'tcx> for queries::resolve_lifetimes<'tcx> {
594 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 595 "resolving lifetimes".to_string()
ff7c6d11
XL
596 }
597}
598
abe05a73 599impl<'tcx> QueryDescription<'tcx> for queries::named_region_map<'tcx> {
ea8adc8c 600 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
8faf50e0 601 "looking up a named region".to_string()
ea8adc8c
XL
602 }
603}
604
abe05a73 605impl<'tcx> QueryDescription<'tcx> for queries::is_late_bound_map<'tcx> {
ea8adc8c 606 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
8faf50e0 607 "testing if a region is late bound".to_string()
ea8adc8c
XL
608 }
609}
610
abe05a73 611impl<'tcx> QueryDescription<'tcx> for queries::object_lifetime_defaults_map<'tcx> {
ea8adc8c 612 fn describe(_tcx: TyCtxt, _: DefIndex) -> String {
8faf50e0 613 "looking up lifetime defaults for a region".to_string()
ea8adc8c
XL
614 }
615}
616
abe05a73 617impl<'tcx> QueryDescription<'tcx> for queries::dep_kind<'tcx> {
ea8adc8c 618 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 619 "fetching what a dependency looks like".to_string()
ea8adc8c
XL
620 }
621}
622
abe05a73 623impl<'tcx> QueryDescription<'tcx> for queries::crate_name<'tcx> {
ea8adc8c 624 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 625 "fetching what a crate is named".to_string()
ea8adc8c
XL
626 }
627}
628
b7449926
XL
629impl<'tcx> QueryDescription<'tcx> for queries::get_lib_features<'tcx> {
630 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
631 format!("calculating the lib features map")
632 }
633}
634
635impl<'tcx> QueryDescription<'tcx> for queries::defined_lib_features<'tcx> {
636 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
637 format!("calculating the lib features defined in a crate")
638 }
639}
640
abe05a73 641impl<'tcx> QueryDescription<'tcx> for queries::get_lang_items<'tcx> {
ea8adc8c 642 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 643 "calculating the lang items map".to_string()
ea8adc8c
XL
644 }
645}
646
abe05a73 647impl<'tcx> QueryDescription<'tcx> for queries::defined_lang_items<'tcx> {
ea8adc8c 648 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 649 "calculating the lang items defined in a crate".to_string()
ea8adc8c
XL
650 }
651}
652
abe05a73 653impl<'tcx> QueryDescription<'tcx> for queries::missing_lang_items<'tcx> {
ea8adc8c 654 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 655 "calculating the missing lang items in a crate".to_string()
ea8adc8c
XL
656 }
657}
658
abe05a73 659impl<'tcx> QueryDescription<'tcx> for queries::visible_parent_map<'tcx> {
ea8adc8c 660 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 661 "calculating the visible parent map".to_string()
ea8adc8c
XL
662 }
663}
664
abe05a73 665impl<'tcx> QueryDescription<'tcx> for queries::missing_extern_crate_item<'tcx> {
ea8adc8c 666 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 667 "seeing if we're missing an `extern crate` item for this crate".to_string()
ea8adc8c
XL
668 }
669}
670
abe05a73 671impl<'tcx> QueryDescription<'tcx> for queries::used_crate_source<'tcx> {
ea8adc8c 672 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 673 "looking at the source for a crate".to_string()
ea8adc8c
XL
674 }
675}
676
abe05a73 677impl<'tcx> QueryDescription<'tcx> for queries::postorder_cnums<'tcx> {
ea8adc8c 678 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 679 "generating a postorder list of CrateNums".to_string()
ea8adc8c
XL
680 }
681}
682
abe05a73 683impl<'tcx> QueryDescription<'tcx> for queries::maybe_unused_extern_crates<'tcx> {
ea8adc8c 684 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 685 "looking up all possibly unused extern crates".to_string()
ea8adc8c
XL
686 }
687}
688
abe05a73 689impl<'tcx> QueryDescription<'tcx> for queries::stability_index<'tcx> {
ea8adc8c 690 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 691 "calculating the stability index for the local crate".to_string()
ea8adc8c
XL
692 }
693}
694
83c7162d
XL
695impl<'tcx> QueryDescription<'tcx> for queries::all_traits<'tcx> {
696 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 697 "fetching all foreign and local traits".to_string()
83c7162d
XL
698 }
699}
700
abe05a73 701impl<'tcx> QueryDescription<'tcx> for queries::all_crate_nums<'tcx> {
ea8adc8c 702 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 703 "fetching all foreign CrateNum instances".to_string()
ea8adc8c
XL
704 }
705}
706
abe05a73 707impl<'tcx> QueryDescription<'tcx> for queries::exported_symbols<'tcx> {
ea8adc8c 708 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 709 "exported_symbols".to_string()
ea8adc8c
XL
710 }
711}
712
94b46f34 713impl<'tcx> QueryDescription<'tcx> for queries::collect_and_partition_mono_items<'tcx> {
ea8adc8c 714 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 715 "collect_and_partition_mono_items".to_string()
ea8adc8c
XL
716 }
717}
718
abe05a73 719impl<'tcx> QueryDescription<'tcx> for queries::codegen_unit<'tcx> {
ea8adc8c 720 fn describe(_tcx: TyCtxt, _: InternedString) -> String {
8faf50e0 721 "codegen_unit".to_string()
ea8adc8c
XL
722 }
723}
724
abe05a73 725impl<'tcx> QueryDescription<'tcx> for queries::output_filenames<'tcx> {
ea8adc8c 726 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 727 "output_filenames".to_string()
ea8adc8c
XL
728 }
729}
730
abe05a73
XL
731impl<'tcx> QueryDescription<'tcx> for queries::vtable_methods<'tcx> {
732 fn describe(tcx: TyCtxt, key: ty::PolyTraitRef<'tcx> ) -> String {
733 format!("finding all methods for trait {}", tcx.item_path_str(key.def_id()))
734 }
735}
736
0531ce1d 737impl<'tcx> QueryDescription<'tcx> for queries::features_query<'tcx> {
ea8adc8c 738 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 739 "looking up enabled feature gates".to_string()
abe05a73
XL
740 }
741}
742
743impl<'tcx> QueryDescription<'tcx> for queries::typeck_tables_of<'tcx> {
744 #[inline]
745 fn cache_on_disk(def_id: Self::Key) -> bool {
746 def_id.is_local()
747 }
748
ff7c6d11 749 fn try_load_from_disk(tcx: TyCtxt<'_, 'tcx, 'tcx>,
abe05a73 750 id: SerializedDepNodeIndex)
ff7c6d11
XL
751 -> Option<Self::Value> {
752 let typeck_tables: Option<ty::TypeckTables<'tcx>> = tcx
94b46f34 753 .queries.on_disk_cache
ff7c6d11
XL
754 .try_load_query_result(tcx, id);
755
756 typeck_tables.map(|tables| tcx.alloc_tables(tables))
abe05a73
XL
757 }
758}
759
ff7c6d11
XL
760impl<'tcx> QueryDescription<'tcx> for queries::optimized_mir<'tcx> {
761 #[inline]
762 fn cache_on_disk(def_id: Self::Key) -> bool {
763 def_id.is_local()
764 }
765
766 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
2c00a5a8
XL
767 id: SerializedDepNodeIndex)
768 -> Option<Self::Value> {
94b46f34 769 let mir: Option<::mir::Mir<'tcx>> = tcx.queries.on_disk_cache
ff7c6d11
XL
770 .try_load_query_result(tcx, id);
771 mir.map(|x| tcx.alloc_mir(x))
772 }
773}
774
2c00a5a8
XL
775impl<'tcx> QueryDescription<'tcx> for queries::substitute_normalize_and_test_predicates<'tcx> {
776 fn describe(tcx: TyCtxt, key: (DefId, &'tcx Substs<'tcx>)) -> String {
777 format!("testing substituted normalized predicates:`{}`", tcx.item_path_str(key.0))
778 }
779}
780
781impl<'tcx> QueryDescription<'tcx> for queries::target_features_whitelist<'tcx> {
782 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 783 "looking up the whitelist of target features".to_string()
2c00a5a8
XL
784 }
785}
786
787impl<'tcx> QueryDescription<'tcx> for queries::instance_def_size_estimate<'tcx> {
788 fn describe(tcx: TyCtxt, def: ty::InstanceDef<'tcx>) -> String {
789 format!("estimating size for `{}`", tcx.item_path_str(def.def_id()))
790 }
791}
792
793impl<'tcx> QueryDescription<'tcx> for queries::generics_of<'tcx> {
794 #[inline]
795 fn cache_on_disk(def_id: Self::Key) -> bool {
796 def_id.is_local()
797 }
798
799 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
800 id: SerializedDepNodeIndex)
801 -> Option<Self::Value> {
94b46f34 802 let generics: Option<ty::Generics> = tcx.queries.on_disk_cache
2c00a5a8
XL
803 .try_load_query_result(tcx, id);
804 generics.map(|x| tcx.alloc_generics(x))
805 }
806}
807
0531ce1d
XL
808impl<'tcx> QueryDescription<'tcx> for queries::program_clauses_for<'tcx> {
809 fn describe(_tcx: TyCtxt, _: DefId) -> String {
8faf50e0 810 "generating chalk-style clauses".to_string()
0531ce1d
XL
811 }
812}
813
83c7162d
XL
814impl<'tcx> QueryDescription<'tcx> for queries::program_clauses_for_env<'tcx> {
815 fn describe(_tcx: TyCtxt, _: ty::ParamEnv<'tcx>) -> String {
8faf50e0 816 "generating chalk-style clauses for param env".to_string()
83c7162d
XL
817 }
818}
819
0531ce1d
XL
820impl<'tcx> QueryDescription<'tcx> for queries::wasm_import_module_map<'tcx> {
821 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 822 "wasm import module map".to_string()
0531ce1d
XL
823 }
824}
825
826impl<'tcx> QueryDescription<'tcx> for queries::dllimport_foreign_items<'tcx> {
827 fn describe(_tcx: TyCtxt, _: CrateNum) -> String {
8faf50e0 828 "wasm import module map".to_string()
0531ce1d
XL
829 }
830}
831
ff7c6d11
XL
832macro_rules! impl_disk_cacheable_query(
833 ($query_name:ident, |$key:tt| $cond:expr) => {
834 impl<'tcx> QueryDescription<'tcx> for queries::$query_name<'tcx> {
835 #[inline]
836 fn cache_on_disk($key: Self::Key) -> bool {
837 $cond
838 }
839
840 #[inline]
841 fn try_load_from_disk<'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
842 id: SerializedDepNodeIndex)
843 -> Option<Self::Value> {
94b46f34 844 tcx.queries.on_disk_cache.try_load_query_result(tcx, id)
ff7c6d11
XL
845 }
846 }
847 }
848);
849
850impl_disk_cacheable_query!(unsafety_check_result, |def_id| def_id.is_local());
851impl_disk_cacheable_query!(borrowck, |def_id| def_id.is_local());
852impl_disk_cacheable_query!(mir_borrowck, |def_id| def_id.is_local());
853impl_disk_cacheable_query!(mir_const_qualif, |def_id| def_id.is_local());
854impl_disk_cacheable_query!(check_match, |def_id| def_id.is_local());
ff7c6d11 855impl_disk_cacheable_query!(def_symbol_name, |_| true);
2c00a5a8
XL
856impl_disk_cacheable_query!(type_of, |def_id| def_id.is_local());
857impl_disk_cacheable_query!(predicates_of, |def_id| def_id.is_local());
858impl_disk_cacheable_query!(used_trait_imports, |def_id| def_id.is_local());
94b46f34 859impl_disk_cacheable_query!(codegen_fn_attrs, |_| true);
0531ce1d 860impl_disk_cacheable_query!(specialization_graph_of, |_| true);