@@ -488,6 +488,117 @@ impl<K: DepKind> DepGraph<K> {
488
488
}
489
489
}
490
490
491
+ fn try_mark_parent_green < Ctxt : QueryContext < DepKind = K > > (
492
+ & self ,
493
+ tcx : Ctxt ,
494
+ data : & DepGraphData < K > ,
495
+ parent_dep_node_index : SerializedDepNodeIndex ,
496
+ dep_node : & DepNode < K > ,
497
+ ) -> Option < ( ) > {
498
+ let dep_dep_node_color = data. colors . get ( parent_dep_node_index) ;
499
+ let dep_dep_node = & data. previous . index_to_node ( parent_dep_node_index) ;
500
+
501
+ match dep_dep_node_color {
502
+ Some ( DepNodeColor :: Green ( _) ) => {
503
+ // This dependency has been marked as green before, we are
504
+ // still fine and can continue with checking the other
505
+ // dependencies.
506
+ debug ! (
507
+ "try_mark_previous_green({:?}) --- found dependency {:?} to \
508
+ be immediately green",
509
+ dep_node, dep_dep_node,
510
+ ) ;
511
+ return Some ( ( ) ) ;
512
+ }
513
+ Some ( DepNodeColor :: Red ) => {
514
+ // We found a dependency the value of which has changed
515
+ // compared to the previous compilation session. We cannot
516
+ // mark the DepNode as green and also don't need to bother
517
+ // with checking any of the other dependencies.
518
+ debug ! (
519
+ "try_mark_previous_green({:?}) - END - dependency {:?} was immediately red" ,
520
+ dep_node, dep_dep_node,
521
+ ) ;
522
+ return None ;
523
+ }
524
+ None => { }
525
+ }
526
+
527
+ // We don't know the state of this dependency. If it isn't
528
+ // an eval_always node, let's try to mark it green recursively.
529
+ if !dep_dep_node. kind . is_eval_always ( ) {
530
+ debug ! (
531
+ "try_mark_previous_green({:?}) --- state of dependency {:?} ({}) \
532
+ is unknown, trying to mark it green",
533
+ dep_node, dep_dep_node, dep_dep_node. hash,
534
+ ) ;
535
+
536
+ let node_index =
537
+ self . try_mark_previous_green ( tcx, data, parent_dep_node_index, dep_dep_node) ;
538
+ if node_index. is_some ( ) {
539
+ debug ! (
540
+ "try_mark_previous_green({:?}) --- managed to MARK dependency {:?} as green" ,
541
+ dep_node, dep_dep_node
542
+ ) ;
543
+ return Some ( ( ) ) ;
544
+ }
545
+ }
546
+
547
+ // We failed to mark it green, so we try to force the query.
548
+ debug ! (
549
+ "try_mark_previous_green({:?}) --- trying to force dependency {:?}" ,
550
+ dep_node, dep_dep_node
551
+ ) ;
552
+ if !tcx. try_force_from_dep_node ( dep_dep_node) {
553
+ // The DepNode could not be forced.
554
+ debug ! (
555
+ "try_mark_previous_green({:?}) - END - dependency {:?} could not be forced" ,
556
+ dep_node, dep_dep_node
557
+ ) ;
558
+ return None ;
559
+ }
560
+
561
+ let dep_dep_node_color = data. colors . get ( parent_dep_node_index) ;
562
+
563
+ match dep_dep_node_color {
564
+ Some ( DepNodeColor :: Green ( _) ) => {
565
+ debug ! (
566
+ "try_mark_previous_green({:?}) --- managed to FORCE dependency {:?} to green" ,
567
+ dep_node, dep_dep_node
568
+ ) ;
569
+ return Some ( ( ) ) ;
570
+ }
571
+ Some ( DepNodeColor :: Red ) => {
572
+ debug ! (
573
+ "try_mark_previous_green({:?}) - END - dependency {:?} was red after forcing" ,
574
+ dep_node, dep_dep_node
575
+ ) ;
576
+ return None ;
577
+ }
578
+ None => { }
579
+ }
580
+
581
+ if !tcx. dep_context ( ) . sess ( ) . has_errors_or_delayed_span_bugs ( ) {
582
+ panic ! ( "try_mark_previous_green() - Forcing the DepNode should have set its color" )
583
+ }
584
+
585
+ // If the query we just forced has resulted in
586
+ // some kind of compilation error, we cannot rely on
587
+ // the dep-node color having been properly updated.
588
+ // This means that the query system has reached an
589
+ // invalid state. We let the compiler continue (by
590
+ // returning `None`) so it can emit error messages
591
+ // and wind down, but rely on the fact that this
592
+ // invalid state will not be persisted to the
593
+ // incremental compilation cache because of
594
+ // compilation errors being present.
595
+ debug ! (
596
+ "try_mark_previous_green({:?}) - END - dependency {:?} resulted in compilation error" ,
597
+ dep_node, dep_dep_node
598
+ ) ;
599
+ return None ;
600
+ }
601
+
491
602
/// Try to mark a dep-node which existed in the previous compilation session as green.
492
603
fn try_mark_previous_green < Ctxt : QueryContext < DepKind = K > > (
493
604
& self ,
@@ -512,123 +623,7 @@ impl<K: DepKind> DepGraph<K> {
512
623
let prev_deps = data. previous . edge_targets_from ( prev_dep_node_index) ;
513
624
514
625
for & dep_dep_node_index in prev_deps {
515
- let dep_dep_node_color = data. colors . get ( dep_dep_node_index) ;
516
-
517
- match dep_dep_node_color {
518
- Some ( DepNodeColor :: Green ( _) ) => {
519
- // This dependency has been marked as green before, we are
520
- // still fine and can continue with checking the other
521
- // dependencies.
522
- debug ! (
523
- "try_mark_previous_green({:?}) --- found dependency {:?} to \
524
- be immediately green",
525
- dep_node,
526
- data. previous. index_to_node( dep_dep_node_index)
527
- ) ;
528
- }
529
- Some ( DepNodeColor :: Red ) => {
530
- // We found a dependency the value of which has changed
531
- // compared to the previous compilation session. We cannot
532
- // mark the DepNode as green and also don't need to bother
533
- // with checking any of the other dependencies.
534
- debug ! (
535
- "try_mark_previous_green({:?}) - END - dependency {:?} was \
536
- immediately red",
537
- dep_node,
538
- data. previous. index_to_node( dep_dep_node_index)
539
- ) ;
540
- return None ;
541
- }
542
- None => {
543
- let dep_dep_node = & data. previous . index_to_node ( dep_dep_node_index) ;
544
-
545
- // We don't know the state of this dependency. If it isn't
546
- // an eval_always node, let's try to mark it green recursively.
547
- if !dep_dep_node. kind . is_eval_always ( ) {
548
- debug ! (
549
- "try_mark_previous_green({:?}) --- state of dependency {:?} ({}) \
550
- is unknown, trying to mark it green",
551
- dep_node, dep_dep_node, dep_dep_node. hash,
552
- ) ;
553
-
554
- let node_index = self . try_mark_previous_green (
555
- tcx,
556
- data,
557
- dep_dep_node_index,
558
- dep_dep_node,
559
- ) ;
560
- if node_index. is_some ( ) {
561
- debug ! (
562
- "try_mark_previous_green({:?}) --- managed to MARK \
563
- dependency {:?} as green",
564
- dep_node, dep_dep_node
565
- ) ;
566
- continue ;
567
- }
568
- }
569
-
570
- // We failed to mark it green, so we try to force the query.
571
- debug ! (
572
- "try_mark_previous_green({:?}) --- trying to force \
573
- dependency {:?}",
574
- dep_node, dep_dep_node
575
- ) ;
576
- if tcx. try_force_from_dep_node ( dep_dep_node) {
577
- let dep_dep_node_color = data. colors . get ( dep_dep_node_index) ;
578
-
579
- match dep_dep_node_color {
580
- Some ( DepNodeColor :: Green ( _) ) => {
581
- debug ! (
582
- "try_mark_previous_green({:?}) --- managed to \
583
- FORCE dependency {:?} to green",
584
- dep_node, dep_dep_node
585
- ) ;
586
- }
587
- Some ( DepNodeColor :: Red ) => {
588
- debug ! (
589
- "try_mark_previous_green({:?}) - END - \
590
- dependency {:?} was red after forcing",
591
- dep_node, dep_dep_node
592
- ) ;
593
- return None ;
594
- }
595
- None => {
596
- if !tcx. dep_context ( ) . sess ( ) . has_errors_or_delayed_span_bugs ( ) {
597
- panic ! (
598
- "try_mark_previous_green() - Forcing the DepNode \
599
- should have set its color"
600
- )
601
- } else {
602
- // If the query we just forced has resulted in
603
- // some kind of compilation error, we cannot rely on
604
- // the dep-node color having been properly updated.
605
- // This means that the query system has reached an
606
- // invalid state. We let the compiler continue (by
607
- // returning `None`) so it can emit error messages
608
- // and wind down, but rely on the fact that this
609
- // invalid state will not be persisted to the
610
- // incremental compilation cache because of
611
- // compilation errors being present.
612
- debug ! (
613
- "try_mark_previous_green({:?}) - END - \
614
- dependency {:?} resulted in compilation error",
615
- dep_node, dep_dep_node
616
- ) ;
617
- return None ;
618
- }
619
- }
620
- }
621
- } else {
622
- // The DepNode could not be forced.
623
- debug ! (
624
- "try_mark_previous_green({:?}) - END - dependency {:?} \
625
- could not be forced",
626
- dep_node, dep_dep_node
627
- ) ;
628
- return None ;
629
- }
630
- }
631
- }
626
+ self . try_mark_parent_green ( tcx, data, dep_dep_node_index, dep_node) ?
632
627
}
633
628
634
629
// If we got here without hitting a `return` that means that all
0 commit comments