@@ -6,6 +6,7 @@ use rustc_data_structures::sharded::{self, Sharded};
6
6
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
7
7
use rustc_data_structures:: steal:: Steal ;
8
8
use rustc_data_structures:: sync:: { AtomicU32 , AtomicU64 , Lock , Lrc , Ordering } ;
9
+ use rustc_data_structures:: OnDrop ;
9
10
use rustc_index:: vec:: IndexVec ;
10
11
use rustc_serialize:: opaque:: { FileEncodeResult , FileEncoder } ;
11
12
use smallvec:: { smallvec, SmallVec } ;
@@ -671,17 +672,24 @@ impl<K: DepKind> DepGraph<K> {
671
672
let prev_index = data. previous . node_to_index_opt ( dep_node) ?;
672
673
673
674
match data. colors . get ( prev_index) {
674
- Some ( DepNodeColor :: Green ( dep_node_index) ) => Some ( ( prev_index, dep_node_index) ) ,
675
- Some ( DepNodeColor :: Red ) => None ,
676
- None => {
677
- // This DepNode and the corresponding query invocation existed
678
- // in the previous compilation session too, so we can try to
679
- // mark it as green by recursively marking all of its
680
- // dependencies green.
681
- self . try_mark_previous_green ( qcx, data, prev_index, & dep_node)
682
- . map ( |dep_node_index| ( prev_index, dep_node_index) )
683
- }
675
+ Some ( DepNodeColor :: Green ( dep_node_index) ) => return Some ( ( prev_index, dep_node_index) ) ,
676
+ Some ( DepNodeColor :: Red ) => return None ,
677
+ None => { }
684
678
}
679
+
680
+ let backtrace = backtrace_printer ( qcx. dep_context ( ) . sess ( ) , data, prev_index) ;
681
+
682
+ // This DepNode and the corresponding query invocation existed
683
+ // in the previous compilation session too, so we can try to
684
+ // mark it as green by recursively marking all of its
685
+ // dependencies green.
686
+ let ret = self
687
+ . try_mark_previous_green ( qcx, data, prev_index, & dep_node)
688
+ . map ( |dep_node_index| ( prev_index, dep_node_index) ) ;
689
+
690
+ // We succeeded, no backtrace.
691
+ backtrace. disable ( ) ;
692
+ return ret;
685
693
}
686
694
687
695
#[ instrument( skip( self , qcx, data, parent_dep_node_index) , level = "debug" ) ]
@@ -794,7 +802,10 @@ impl<K: DepKind> DepGraph<K> {
794
802
let prev_deps = data. previous . edge_targets_from ( prev_dep_node_index) ;
795
803
796
804
for & dep_dep_node_index in prev_deps {
797
- self . try_mark_parent_green ( qcx, data, dep_dep_node_index, dep_node) ?
805
+ let backtrace = backtrace_printer ( qcx. dep_context ( ) . sess ( ) , data, dep_dep_node_index) ;
806
+ let success = self . try_mark_parent_green ( qcx, data, dep_dep_node_index, dep_node) ;
807
+ backtrace. disable ( ) ;
808
+ success?;
798
809
}
799
810
800
811
// If we got here without hitting a `return` that means that all
@@ -1364,3 +1375,26 @@ impl DepNodeColorMap {
1364
1375
)
1365
1376
}
1366
1377
}
1378
+
1379
+ fn backtrace_printer < ' a , K : DepKind > (
1380
+ sess : & ' a rustc_session:: Session ,
1381
+ graph : & ' a DepGraphData < K > ,
1382
+ node : SerializedDepNodeIndex ,
1383
+ ) -> OnDrop < impl Fn ( ) + ' a > {
1384
+ OnDrop (
1385
+ #[ inline( never) ]
1386
+ #[ cold]
1387
+ move || {
1388
+ let node = graph. previous . index_to_node ( node) ;
1389
+ // Do not try to rely on DepNode's Debug implementation, since it may panic.
1390
+ let diag = rustc_errors:: Diagnostic :: new (
1391
+ rustc_errors:: Level :: FailureNote ,
1392
+ & format ! (
1393
+ "encountered while trying to mark dependency green: {:?}({})" ,
1394
+ node. kind, node. hash
1395
+ ) ,
1396
+ ) ;
1397
+ sess. diagnostic ( ) . force_print_diagnostic ( diag) ;
1398
+ } ,
1399
+ )
1400
+ }
0 commit comments