Skip to content

Commit 70f9a0b

Browse files
incr.comp.: Allow for forcing input nodes lazily.
1 parent 54bbd56 commit 70f9a0b

File tree

1 file changed

+70
-51
lines changed

1 file changed

+70
-51
lines changed

src/librustc/dep_graph/graph.rs

Lines changed: 70 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -506,60 +506,57 @@ impl DepGraph {
506506
return None
507507
}
508508
None => {
509-
if dep_dep_node.kind.is_input() {
510-
// This input does not exist anymore.
511-
debug_assert!(dep_dep_node.extract_def_id(tcx).is_none(),
512-
"Encountered input {:?} without color",
513-
dep_dep_node);
514-
debug!("try_mark_green({:?}) - END - dependency {:?} \
515-
was deleted input", dep_node, dep_dep_node);
516-
return None;
509+
// We don't know the state of this dependency. If it isn't
510+
// an input node, let's try to mark it green recursively.
511+
if !dep_dep_node.kind.is_input() {
512+
debug!("try_mark_green({:?}) --- state of dependency {:?} \
513+
is unknown, trying to mark it green", dep_node,
514+
dep_dep_node);
515+
516+
if let Some(node_index) = self.try_mark_green(tcx, dep_dep_node) {
517+
debug!("try_mark_green({:?}) --- managed to MARK \
518+
dependency {:?} as green", dep_node, dep_dep_node);
519+
current_deps.push(node_index);
520+
continue;
521+
}
517522
}
518523

519-
debug!("try_mark_green({:?}) --- state of dependency {:?} \
520-
is unknown, trying to mark it green", dep_node,
521-
dep_dep_node);
522-
523-
// We don't know the state of this dependency. Let's try to
524-
// mark it green.
525-
if let Some(node_index) = self.try_mark_green(tcx, dep_dep_node) {
526-
debug!("try_mark_green({:?}) --- managed to MARK \
527-
dependency {:?} as green", dep_node, dep_dep_node);
528-
current_deps.push(node_index);
529-
} else {
530-
// We failed to mark it green, so we try to force the query.
531-
debug!("try_mark_green({:?}) --- trying to force \
532-
dependency {:?}", dep_node, dep_dep_node);
533-
if ::ty::maps::force_from_dep_node(tcx, dep_dep_node) {
534-
let dep_dep_node_color = data.colors
535-
.borrow()
536-
.get(dep_dep_node)
537-
.cloned();
538-
match dep_dep_node_color {
539-
Some(DepNodeColor::Green(node_index)) => {
540-
debug!("try_mark_green({:?}) --- managed to \
541-
FORCE dependency {:?} to green",
542-
dep_node, dep_dep_node);
543-
current_deps.push(node_index);
544-
}
545-
Some(DepNodeColor::Red) => {
546-
debug!("try_mark_green({:?}) - END - \
547-
dependency {:?} was red after forcing",
548-
dep_node,
549-
dep_dep_node);
550-
return None
551-
}
552-
None => {
553-
bug!("try_mark_green() - Forcing the DepNode \
554-
should have set its color")
555-
}
524+
// We failed to mark it green, so we try to force the query.
525+
debug!("try_mark_green({:?}) --- trying to force \
526+
dependency {:?}", dep_node, dep_dep_node);
527+
if ::ty::maps::force_from_dep_node(tcx, dep_dep_node) {
528+
let dep_dep_node_color = data.colors
529+
.borrow()
530+
.get(dep_dep_node)
531+
.cloned();
532+
match dep_dep_node_color {
533+
Some(DepNodeColor::Green(node_index)) => {
534+
debug!("try_mark_green({:?}) --- managed to \
535+
FORCE dependency {:?} to green",
536+
dep_node, dep_dep_node);
537+
current_deps.push(node_index);
538+
}
539+
Some(DepNodeColor::Red) => {
540+
debug!("try_mark_green({:?}) - END - \
541+
dependency {:?} was red after forcing",
542+
dep_node,
543+
dep_dep_node);
544+
return None
545+
}
546+
None => {
547+
bug!("try_mark_green() - Forcing the DepNode \
548+
should have set its color")
556549
}
557-
} else {
558-
// The DepNode could not be forced.
559-
debug!("try_mark_green({:?}) - END - dependency {:?} \
560-
could not be forced", dep_node, dep_dep_node);
561-
return None
562550
}
551+
} else {
552+
debug_assert!(!dep_dep_node.kind.is_input() ||
553+
dep_dep_node.extract_def_id(tcx).is_none(),
554+
"Could not force input that should still exist.");
555+
556+
// The DepNode could not be forced.
557+
debug!("try_mark_green({:?}) - END - dependency {:?} \
558+
could not be forced", dep_node, dep_dep_node);
559+
return None
563560
}
564561
}
565562
}
@@ -772,7 +769,27 @@ impl CurrentDepGraph {
772769
read_set: _,
773770
reads
774771
} = popped_node {
775-
debug_assert_eq!(node, key);
772+
assert_eq!(node, key);
773+
774+
// If this is an input node, we expect that it either has no
775+
// dependencies, or that it just depends on DepKind::CrateMetadata
776+
// or DepKind::Krate. This happens for some "thin wrapper queries"
777+
// like `crate_disambiguator` which sometimes have zero deps (for
778+
// when called for LOCAL_CRATE) or they depend on a CrateMetadata
779+
// node.
780+
if cfg!(debug_assertions) {
781+
if node.kind.is_input() && reads.len() > 0 &&
782+
reads.iter().any(|&i| {
783+
!(self.nodes[i].kind == DepKind::CrateMetadata ||
784+
self.nodes[i].kind == DepKind::Krate)
785+
})
786+
{
787+
bug!("Input node {:?} with unexpected reads: {:?}",
788+
node,
789+
reads.iter().map(|&i| self.nodes[i]).collect::<Vec<_>>())
790+
}
791+
}
792+
776793
self.alloc_node(node, reads)
777794
} else {
778795
bug!("pop_task() - Expected regular task to be popped")
@@ -793,6 +810,8 @@ impl CurrentDepGraph {
793810
read_set: _,
794811
reads
795812
} = popped_node {
813+
debug_assert!(!kind.is_input());
814+
796815
let mut fingerprint = self.anon_id_seed;
797816
let mut hasher = StableHasher::new();
798817

0 commit comments

Comments
 (0)