2016-05-06 09:02:05 +00:00
|
|
|
pub mod debug;
|
2016-03-28 21:37:34 +00:00
|
|
|
mod dep_node;
|
|
|
|
mod graph;
|
2017-09-22 11:00:42 +00:00
|
|
|
mod prev;
|
2016-01-05 18:02:57 +00:00
|
|
|
mod query;
|
isolate dep-graph tasks
A task function is now given as a `fn` pointer to ensure that it carries
no state. Each fn can take two arguments, because that worked out to be
convenient -- these two arguments must be of some type that is
`DepGraphSafe`, a new trait that is intended to prevent "leaking"
information into the task that was derived from tracked state.
This intentionally leaves `DepGraph::in_task()`, the more common form,
alone. Eventually all uses of `DepGraph::in_task()` should be ported
to `with_task()`, but I wanted to start with a smaller subset.
Originally I wanted to use closures bound by an auto trait, but that
approach has some limitations:
- the trait cannot have a `read()` method; since the current method
is unused, that may not be a problem.
- more importantly, we would want the auto trait to be "undefined" for all types
*by default* -- that is, this use case doesn't really fit the typical
auto trait scenario. For example, imagine that there is a `u32` loaded
out of a `hir::Node` -- we don't really want to be passing that
`u32` into the task!
2017-03-06 20:35:34 +00:00
|
|
|
mod safe;
|
2017-09-22 11:00:42 +00:00
|
|
|
mod serialized;
|
2016-01-05 18:02:57 +00:00
|
|
|
|
2020-03-18 09:25:22 +00:00
|
|
|
pub use dep_node::{DepNode, DepNodeParams, WorkProductId};
|
|
|
|
pub use graph::WorkProductFileKind;
|
|
|
|
pub use graph::{hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, WorkProduct};
|
|
|
|
pub use prev::PreviousDepGraph;
|
|
|
|
pub use query::DepGraphQuery;
|
|
|
|
pub use safe::AssertDepGraphSafe;
|
|
|
|
pub use safe::DepGraphSafe;
|
|
|
|
pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex};
|
|
|
|
|
|
|
|
use rustc_data_structures::profiling::SelfProfilerRef;
|
|
|
|
use rustc_data_structures::sync::Lock;
|
|
|
|
use rustc_data_structures::thin_vec::ThinVec;
|
|
|
|
use rustc_errors::Diagnostic;
|
|
|
|
|
|
|
|
use std::fmt;
|
|
|
|
use std::hash::Hash;
|
|
|
|
|
|
|
|
pub trait DepContext: Copy {
|
|
|
|
type DepKind: self::DepKind;
|
|
|
|
type StableHashingContext: crate::HashStableContext;
|
|
|
|
|
|
|
|
/// Create a hashing context for hashing new results.
|
|
|
|
fn create_stable_hashing_context(&self) -> Self::StableHashingContext;
|
|
|
|
|
2020-03-20 23:21:57 +00:00
|
|
|
/// Try to force a dep node to execute and see if it's green.
|
2020-03-22 19:47:30 +00:00
|
|
|
fn try_force_from_dep_node(&self, dep_node: &DepNode<Self::DepKind>) -> bool;
|
2020-03-18 09:25:22 +00:00
|
|
|
|
|
|
|
/// Return whether the current session is tainted by errors.
|
|
|
|
fn has_errors_or_delayed_span_bugs(&self) -> bool;
|
|
|
|
|
|
|
|
/// Return the diagnostic handler.
|
|
|
|
fn diagnostic(&self) -> &rustc_errors::Handler;
|
|
|
|
|
|
|
|
/// Load data from the on-disk cache.
|
|
|
|
fn try_load_from_on_disk_cache(&self, dep_node: &DepNode<Self::DepKind>);
|
|
|
|
|
|
|
|
/// Load diagnostics associated to the node in the previous session.
|
|
|
|
fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec<Diagnostic>;
|
|
|
|
|
|
|
|
/// Register diagnostics for the given node, for use in next session.
|
|
|
|
fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec<Diagnostic>);
|
|
|
|
|
|
|
|
/// Access the profiler.
|
|
|
|
fn profiler(&self) -> &SelfProfilerRef;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Describe the different families of dependency nodes.
|
|
|
|
pub trait DepKind: Copy + fmt::Debug + Eq + Ord + Hash {
|
|
|
|
/// Return whether this kind always require evaluation.
|
|
|
|
fn is_eval_always(&self) -> bool;
|
|
|
|
|
|
|
|
/// Return whether this kind requires additional parameters to be executed.
|
|
|
|
fn has_params(&self) -> bool;
|
|
|
|
|
|
|
|
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
|
|
|
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
|
|
|
|
|
|
|
/// Execute the operation with provided dependencies.
|
|
|
|
fn with_deps<OP, R>(deps: Option<&Lock<TaskDeps<Self>>>, op: OP) -> R
|
|
|
|
where
|
|
|
|
OP: FnOnce() -> R;
|
|
|
|
|
|
|
|
/// Access dependencies from current implicit context.
|
|
|
|
fn read_deps<OP>(op: OP) -> ()
|
|
|
|
where
|
|
|
|
OP: for<'a> FnOnce(Option<&'a Lock<TaskDeps<Self>>>) -> ();
|
|
|
|
}
|