From e4a32a051dc5b643a6eeb7af96f9d4123bea9bf5 Mon Sep 17 00:00:00 2001 From: Camille GILLOT Date: Fri, 6 Mar 2020 22:56:05 +0100 Subject: [PATCH] Monomorphise try_execute_anon_query. --- src/librustc/ty/query/config.rs | 4 +++ src/librustc/ty/query/plumbing.rs | 46 +++++++++++++++++++------------ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/librustc/ty/query/config.rs b/src/librustc/ty/query/config.rs index 6346e02b7e9b6..1dbcb5cc7a1d6 100644 --- a/src/librustc/ty/query/config.rs +++ b/src/librustc/ty/query/config.rs @@ -27,6 +27,8 @@ pub trait QueryConfig<'tcx> { } pub(crate) struct QueryVtable<'tcx, K, V> { + pub anon: bool, + pub dep_kind: DepKind, pub eval_always: bool, // Don't use this method to compute query results, instead use the methods on TyCtxt @@ -98,6 +100,8 @@ pub(crate) trait QueryDescription<'tcx>: QueryAccessors<'tcx> { fn reify() -> QueryVtable<'tcx, Self::Key, Self::Value> { QueryVtable { + anon: Self::ANON, + dep_kind: Self::DEP_KIND, eval_always: Self::EVAL_ALWAYS, compute: Self::compute, hash_result: Self::hash_result, diff --git a/src/librustc/ty/query/plumbing.rs b/src/librustc/ty/query/plumbing.rs index 4c7db650be303..f9c902088fdd4 100644 --- a/src/librustc/ty/query/plumbing.rs +++ b/src/librustc/ty/query/plumbing.rs @@ -549,23 +549,7 @@ impl<'tcx> TyCtxt<'tcx> { } if Q::ANON { - let prof_timer = self.prof.query_provider(); - - let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { - self.start_query(job.id, diagnostics, |tcx| { - tcx.dep_graph.with_anon_task(Q::DEP_KIND, || Q::compute(tcx, key)) - }) - }); - - prof_timer.finish_with_query_invocation_id(dep_node_index.into()); - - self.dep_graph.read_index(dep_node_index); - - if unlikely!(!diagnostics.is_empty()) { - self.queries - .on_disk_cache - .store_diagnostics_for_anon_node(dep_node_index, diagnostics); - } + let (result, dep_node_index) = self.try_execute_anon_query(key, job.id, &Q::reify()); job.complete(&result, dep_node_index); @@ -604,6 +588,34 @@ impl<'tcx> TyCtxt<'tcx> { result } + #[inline(always)] + fn try_execute_anon_query( + self, + key: K, + job_id: QueryJobId, + query: &QueryVtable<'tcx, K, V>, + ) -> (V, DepNodeIndex) { + assert!(query.anon); + + let prof_timer = self.prof.query_provider(); + + let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { + self.start_query(job_id, diagnostics, |tcx| { + tcx.dep_graph.with_anon_task(query.dep_kind, || query.compute(tcx, key)) + }) + }); + + prof_timer.finish_with_query_invocation_id(dep_node_index.into()); + + self.dep_graph.read_index(dep_node_index); + + if unlikely!(!diagnostics.is_empty()) { + self.queries.on_disk_cache.store_diagnostics_for_anon_node(dep_node_index, diagnostics); + } + + return (result, dep_node_index); + } + fn load_from_disk_and_cache_in_memory( self, key: K,