add depth_limit
in QueryVTable
This commit is contained in:
parent
87991d5f5d
commit
cbc6bd2019
8 changed files with 82 additions and 53 deletions
|
@ -23,6 +23,7 @@ pub struct QueryVTable<CTX: QueryContext, K, V> {
|
|||
pub anon: bool,
|
||||
pub dep_kind: CTX::DepKind,
|
||||
pub eval_always: bool,
|
||||
pub depth_limit: bool,
|
||||
pub cache_on_disk: bool,
|
||||
|
||||
pub compute: fn(CTX::DepContext, K) -> V,
|
||||
|
|
|
@ -14,7 +14,7 @@ pub use self::caches::{
|
|||
mod config;
|
||||
pub use self::config::{QueryConfig, QueryDescription, QueryVTable};
|
||||
|
||||
use crate::dep_graph::{DepNodeIndex, HasDepContext, SerializedDepNodeIndex};
|
||||
use crate::dep_graph::{DepContext, DepNodeIndex, HasDepContext, SerializedDepNodeIndex};
|
||||
|
||||
use rustc_data_structures::sync::Lock;
|
||||
use rustc_data_structures::thin_vec::ThinVec;
|
||||
|
@ -119,7 +119,12 @@ pub trait QueryContext: HasDepContext {
|
|||
fn start_query<R>(
|
||||
&self,
|
||||
token: QueryJobId,
|
||||
depth_limit: bool,
|
||||
diagnostics: Option<&Lock<ThinVec<Diagnostic>>>,
|
||||
compute: impl FnOnce() -> R,
|
||||
) -> R;
|
||||
|
||||
fn depth_limit_error(&self) {
|
||||
self.dep_context().sess().fatal("queries overflow the depth limit!");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -381,7 +381,9 @@ where
|
|||
// Fast path for when incr. comp. is off.
|
||||
if !dep_graph.is_fully_enabled() {
|
||||
let prof_timer = tcx.dep_context().profiler().query_provider();
|
||||
let result = tcx.start_query(job_id, None, || query.compute(*tcx.dep_context(), key));
|
||||
let result = tcx.start_query(job_id, query.depth_limit, None, || {
|
||||
query.compute(*tcx.dep_context(), key)
|
||||
});
|
||||
let dep_node_index = dep_graph.next_virtual_depnode_index();
|
||||
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
|
||||
return (result, dep_node_index);
|
||||
|
@ -394,7 +396,7 @@ where
|
|||
|
||||
// The diagnostics for this query will be promoted to the current session during
|
||||
// `try_mark_green()`, so we can ignore them here.
|
||||
if let Some(ret) = tcx.start_query(job_id, None, || {
|
||||
if let Some(ret) = tcx.start_query(job_id, false, None, || {
|
||||
try_load_from_disk_and_cache_in_memory(tcx, &key, &dep_node, query)
|
||||
}) {
|
||||
return ret;
|
||||
|
@ -404,18 +406,20 @@ where
|
|||
let prof_timer = tcx.dep_context().profiler().query_provider();
|
||||
let diagnostics = Lock::new(ThinVec::new());
|
||||
|
||||
let (result, dep_node_index) = tcx.start_query(job_id, Some(&diagnostics), || {
|
||||
if query.anon {
|
||||
return dep_graph.with_anon_task(*tcx.dep_context(), query.dep_kind, || {
|
||||
query.compute(*tcx.dep_context(), key)
|
||||
});
|
||||
}
|
||||
let (result, dep_node_index) =
|
||||
tcx.start_query(job_id, query.depth_limit, Some(&diagnostics), || {
|
||||
if query.anon {
|
||||
return dep_graph.with_anon_task(*tcx.dep_context(), query.dep_kind, || {
|
||||
query.compute(*tcx.dep_context(), key)
|
||||
});
|
||||
}
|
||||
|
||||
// `to_dep_node` is expensive for some `DepKind`s.
|
||||
let dep_node = dep_node_opt.unwrap_or_else(|| query.to_dep_node(*tcx.dep_context(), &key));
|
||||
// `to_dep_node` is expensive for some `DepKind`s.
|
||||
let dep_node =
|
||||
dep_node_opt.unwrap_or_else(|| query.to_dep_node(*tcx.dep_context(), &key));
|
||||
|
||||
dep_graph.with_task(dep_node, *tcx.dep_context(), key, query.compute, query.hash_result)
|
||||
});
|
||||
dep_graph.with_task(dep_node, *tcx.dep_context(), key, query.compute, query.hash_result)
|
||||
});
|
||||
|
||||
prof_timer.finish_with_query_invocation_id(dep_node_index.into());
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue