pub(crate) struct DepGraphData<D: Deps> {
    current: CurrentDepGraph<D>,
    previous: Arc<SerializedDepGraph>,
    colors: DepNodeColorMap,
    previous_work_products: WorkProductMap,
    dep_node_debug: Lock<FxHashMap<DepNode, String>>,
    debug_loaded_from_disk: Lock<FxHashSet<DepNode>>,
}Fields§
§current: CurrentDepGraph<D>The new encoding of the dependency graph, optimized for red/green
tracking. The current field is the dependency graph of only the
current compilation session: We don’t merge the previous dep-graph into
current one anymore, but we do reference shared data to save space.
previous: Arc<SerializedDepGraph>The dep-graph from the previous compilation session. It contains all nodes and edges as well as all fingerprints of nodes that have them.
colors: DepNodeColorMap§previous_work_products: WorkProductMapWhen we load, there may be .o files, cached MIR, or other such
things available to us. If we find that they are not dirty, we
load the path to the file storing those work-products here into
this map. We can later look for and extract that data.
dep_node_debug: Lock<FxHashMap<DepNode, String>>§debug_loaded_from_disk: Lock<FxHashSet<DepNode>>Used by incremental compilation tests to assert that a particular query result was decoded from disk (not just marked green)
Implementations§
Source§impl<D: Deps> DepGraphData<D>
 
impl<D: Deps> DepGraphData<D>
Sourcepub(crate) fn with_task<Ctxt: HasDepContext<Deps = D>, A: Debug, R>(
    &self,
    key: DepNode,
    cx: Ctxt,
    arg: A,
    task: fn(Ctxt, A) -> R,
    hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
) -> (R, DepNodeIndex)
 
pub(crate) fn with_task<Ctxt: HasDepContext<Deps = D>, A: Debug, R>( &self, key: DepNode, cx: Ctxt, arg: A, task: fn(Ctxt, A) -> R, hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>, ) -> (R, DepNodeIndex)
Starts a new dep-graph task. Dep-graph tasks are specified
using a free function (task) and not a closure – this
is intentional because we want to exercise tight control over
what state they have access to. In particular, we want to
prevent implicit ‘leaks’ of tracked state into the task (which
could then be read without generating correct edges in the
dep-graph – see the rustc dev guide for more details on
the dep-graph). To this end, the task function gets exactly two
pieces of state: the context cx and an argument arg. Both
of these bits of state must be of some type that implements
DepGraphSafe and hence does not leak.
The choice of two arguments is not fundamental. One argument
would work just as well, since multiple values can be
collected using tuples. However, using two arguments works out
to be quite convenient, since it is common to need a context
(cx) and some argument (e.g., a DefId identifying what
item to process).
For cases where you need some other number of arguments:
- If you only need one argument, just use 
()for theargparameter. - If you need 3+ arguments, use a tuple for the
argparameter. 
Sourcepub(crate) fn with_anon_task_inner<Tcx: DepContext<Deps = D>, OP, R>(
    &self,
    cx: Tcx,
    dep_kind: DepKind,
    op: OP,
) -> (R, DepNodeIndex)where
    OP: FnOnce() -> R,
 
pub(crate) fn with_anon_task_inner<Tcx: DepContext<Deps = D>, OP, R>(
    &self,
    cx: Tcx,
    dep_kind: DepKind,
    op: OP,
) -> (R, DepNodeIndex)where
    OP: FnOnce() -> R,
Executes something within an “anonymous” task, that is, a task the
DepNode of which is determined by the list of inputs it read from.
NOTE: this does not actually count as a read of the DepNode here. Using the result of this task without reading the DepNode will result in untracked dependencies which may lead to ICEs as nodes are incorrectly marked green.
FIXME: This could perhaps return a WithDepNode to ensure that the
user of this function actually performs the read; we’ll have to see
how to make that work with anon in execute_job_incr, though.
Sourcefn hash_result_and_alloc_node<Ctxt: DepContext<Deps = D>, R>(
    &self,
    cx: &Ctxt,
    node: DepNode,
    edges: EdgesVec,
    result: &R,
    hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>,
) -> DepNodeIndex
 
fn hash_result_and_alloc_node<Ctxt: DepContext<Deps = D>, R>( &self, cx: &Ctxt, node: DepNode, edges: EdgesVec, result: &R, hash_result: Option<fn(&mut StableHashingContext<'_>, &R) -> Fingerprint>, ) -> DepNodeIndex
Intern the new DepNode with the dependencies up-to-now.
Source§impl<D: Deps> DepGraphData<D>
 
impl<D: Deps> DepGraphData<D>
fn assert_dep_node_not_yet_allocated_in_current_session<S: Display>( &self, dep_node: &DepNode, msg: impl FnOnce() -> S, )
fn node_color(&self, dep_node: &DepNode) -> DepNodeColor
Sourcepub(crate) fn is_index_green(&self, prev_index: SerializedDepNodeIndex) -> bool
 
pub(crate) fn is_index_green(&self, prev_index: SerializedDepNodeIndex) -> bool
Returns true if the given node has been marked as green during the current compilation session. Used in various assertions
pub(crate) fn prev_fingerprint_of( &self, prev_index: SerializedDepNodeIndex, ) -> Fingerprint
pub(crate) fn prev_node_of(&self, prev_index: SerializedDepNodeIndex) -> DepNode
pub(crate) fn mark_debug_loaded_from_disk(&self, dep_node: DepNode)
Sourcefn encode_diagnostic<Qcx: QueryContext>(
    &self,
    qcx: Qcx,
    diagnostic: &DiagInner,
) -> DepNodeIndex
 
fn encode_diagnostic<Qcx: QueryContext>( &self, qcx: Qcx, diagnostic: &DiagInner, ) -> DepNodeIndex
This encodes a diagnostic by creating a node with an unique index and associating
diagnostic with it, for use in the next session.
Sourcefn force_diagnostic_node<Qcx: QueryContext>(
    &self,
    qcx: Qcx,
    prev_index: SerializedDepNodeIndex,
)
 
fn force_diagnostic_node<Qcx: QueryContext>( &self, qcx: Qcx, prev_index: SerializedDepNodeIndex, )
This forces a diagnostic node green by running its side effect. prev_index would
refer to a node created used encode_diagnostic in the previous session.
fn alloc_and_color_node( &self, key: DepNode, edges: EdgesVec, fingerprint: Option<Fingerprint>, ) -> DepNodeIndex
fn promote_node_and_deps_to_current( &self, prev_index: SerializedDepNodeIndex, ) -> DepNodeIndex
Source§impl<D: Deps> DepGraphData<D>
 
impl<D: Deps> DepGraphData<D>
Sourcepub(crate) fn try_mark_green<Qcx: QueryContext<Deps = D>>(
    &self,
    qcx: Qcx,
    dep_node: &DepNode,
) -> Option<(SerializedDepNodeIndex, DepNodeIndex)>
 
pub(crate) fn try_mark_green<Qcx: QueryContext<Deps = D>>( &self, qcx: Qcx, dep_node: &DepNode, ) -> Option<(SerializedDepNodeIndex, DepNodeIndex)>
Try to mark a node index for the node dep_node.
A node will have an index, when it’s already been marked green, or when we can mark it green. This function will mark the current task as a reader of the specified node, when a node index can be found for that node.
fn try_mark_parent_green<Qcx: QueryContext<Deps = D>>( &self, qcx: Qcx, parent_dep_node_index: SerializedDepNodeIndex, frame: &MarkFrame<'_>, ) -> Option<()>
Sourcefn try_mark_previous_green<Qcx: QueryContext<Deps = D>>(
    &self,
    qcx: Qcx,
    prev_dep_node_index: SerializedDepNodeIndex,
    dep_node: &DepNode,
    frame: Option<&MarkFrame<'_>>,
) -> Option<DepNodeIndex>
 
fn try_mark_previous_green<Qcx: QueryContext<Deps = D>>( &self, qcx: Qcx, prev_dep_node_index: SerializedDepNodeIndex, dep_node: &DepNode, frame: Option<&MarkFrame<'_>>, ) -> Option<DepNodeIndex>
Try to mark a dep-node which existed in the previous compilation session as green.
Auto Trait Implementations§
impl<D> DynSend for DepGraphData<D>where
    D: DynSend,
impl<D> DynSync for DepGraphData<D>
impl<D> !Freeze for DepGraphData<D>
impl<D> !RefUnwindSafe for DepGraphData<D>
impl<D> Send for DepGraphData<D>where
    D: Send,
impl<D> !Sync for DepGraphData<D>
impl<D> Unpin for DepGraphData<D>where
    D: Unpin,
impl<D> !UnwindSafe for DepGraphData<D>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
 
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
 
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
 
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
 
impl<T> Pointable for T
Source§impl<Tcx, T> Value<Tcx> for Twhere
    Tcx: DepContext,
 
impl<Tcx, T> Value<Tcx> for Twhere
    Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
Source§impl<T> WithSubscriber for T
 
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
 
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
 
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
    T: 'static,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 656 bytes