@@ -6,7 +6,6 @@ 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 ;
10
9
use rustc_index:: vec:: IndexVec ;
11
10
use rustc_serialize:: opaque:: { FileEncodeResult , FileEncoder } ;
12
11
use smallvec:: { smallvec, SmallVec } ;
@@ -54,6 +53,11 @@ impl From<DepNodeIndex> for QueryInvocationId {
54
53
}
55
54
}
56
55
56
+ pub struct MarkFrame < ' a > {
57
+ index : SerializedDepNodeIndex ,
58
+ parent : Option < & ' a MarkFrame < ' a > > ,
59
+ }
60
+
57
61
#[ derive( PartialEq ) ]
58
62
pub enum DepNodeColor {
59
63
Red ,
@@ -710,32 +714,26 @@ impl<K: DepKind> DepGraphData<K> {
710
714
let prev_index = self . previous . node_to_index_opt ( dep_node) ?;
711
715
712
716
match self . colors . get ( prev_index) {
713
- Some ( DepNodeColor :: Green ( dep_node_index) ) => return Some ( ( prev_index, dep_node_index) ) ,
714
- Some ( DepNodeColor :: Red ) => return None ,
715
- None => { }
717
+ Some ( DepNodeColor :: Green ( dep_node_index) ) => Some ( ( prev_index, dep_node_index) ) ,
718
+ Some ( DepNodeColor :: Red ) => None ,
719
+ None => {
720
+ // This DepNode and the corresponding query invocation existed
721
+ // in the previous compilation session too, so we can try to
722
+ // mark it as green by recursively marking all of its
723
+ // dependencies green.
724
+ self . try_mark_previous_green ( qcx, prev_index, & dep_node, None )
725
+ . map ( |dep_node_index| ( prev_index, dep_node_index) )
726
+ }
716
727
}
717
-
718
- let backtrace = backtrace_printer ( qcx. dep_context ( ) . sess ( ) , self , prev_index) ;
719
-
720
- // This DepNode and the corresponding query invocation existed
721
- // in the previous compilation session too, so we can try to
722
- // mark it as green by recursively marking all of its
723
- // dependencies green.
724
- let ret = self
725
- . try_mark_previous_green ( qcx, prev_index, & dep_node)
726
- . map ( |dep_node_index| ( prev_index, dep_node_index) ) ;
727
-
728
- // We succeeded, no backtrace.
729
- backtrace. disable ( ) ;
730
- return ret;
731
728
}
732
729
733
- #[ instrument( skip( self , qcx, parent_dep_node_index) , level = "debug" ) ]
730
+ #[ instrument( skip( self , qcx, parent_dep_node_index, frame ) , level = "debug" ) ]
734
731
fn try_mark_parent_green < Qcx : QueryContext < DepKind = K > > (
735
732
& self ,
736
733
qcx : Qcx ,
737
734
parent_dep_node_index : SerializedDepNodeIndex ,
738
735
dep_node : & DepNode < K > ,
736
+ frame : Option < & MarkFrame < ' _ > > ,
739
737
) -> Option < ( ) > {
740
738
let dep_dep_node_color = self . colors . get ( parent_dep_node_index) ;
741
739
let dep_dep_node = & self . previous . index_to_node ( parent_dep_node_index) ;
@@ -767,7 +765,8 @@ impl<K: DepKind> DepGraphData<K> {
767
765
dep_dep_node, dep_dep_node. hash,
768
766
) ;
769
767
770
- let node_index = self . try_mark_previous_green ( qcx, parent_dep_node_index, dep_dep_node) ;
768
+ let node_index =
769
+ self . try_mark_previous_green ( qcx, parent_dep_node_index, dep_dep_node, frame) ;
771
770
772
771
if node_index. is_some ( ) {
773
772
debug ! ( "managed to MARK dependency {dep_dep_node:?} as green" , ) ;
@@ -777,7 +776,7 @@ impl<K: DepKind> DepGraphData<K> {
777
776
778
777
// We failed to mark it green, so we try to force the query.
779
778
debug ! ( "trying to force dependency {dep_dep_node:?}" ) ;
780
- if !qcx. dep_context ( ) . try_force_from_dep_node ( * dep_dep_node) {
779
+ if !qcx. dep_context ( ) . try_force_from_dep_node ( * dep_dep_node, frame ) {
781
780
// The DepNode could not be forced.
782
781
debug ! ( "dependency {dep_dep_node:?} could not be forced" ) ;
783
782
return None ;
@@ -816,13 +815,16 @@ impl<K: DepKind> DepGraphData<K> {
816
815
}
817
816
818
817
/// Try to mark a dep-node which existed in the previous compilation session as green.
819
- #[ instrument( skip( self , qcx, prev_dep_node_index) , level = "debug" ) ]
818
+ #[ instrument( skip( self , qcx, prev_dep_node_index, frame ) , level = "debug" ) ]
820
819
fn try_mark_previous_green < Qcx : QueryContext < DepKind = K > > (
821
820
& self ,
822
821
qcx : Qcx ,
823
822
prev_dep_node_index : SerializedDepNodeIndex ,
824
823
dep_node : & DepNode < K > ,
824
+ frame : Option < & MarkFrame < ' _ > > ,
825
825
) -> Option < DepNodeIndex > {
826
+ let frame = MarkFrame { index : prev_dep_node_index, parent : frame } ;
827
+
826
828
#[ cfg( not( parallel_compiler) ) ]
827
829
{
828
830
debug_assert ! ( !self . dep_node_exists( dep_node) ) ;
@@ -837,10 +839,7 @@ impl<K: DepKind> DepGraphData<K> {
837
839
let prev_deps = self . previous . edge_targets_from ( prev_dep_node_index) ;
838
840
839
841
for & dep_dep_node_index in prev_deps {
840
- let backtrace = backtrace_printer ( qcx. dep_context ( ) . sess ( ) , self , dep_dep_node_index) ;
841
- let success = self . try_mark_parent_green ( qcx, dep_dep_node_index, dep_node) ;
842
- backtrace. disable ( ) ;
843
- success?;
842
+ self . try_mark_parent_green ( qcx, dep_dep_node_index, dep_node, Some ( & frame) ) ?;
844
843
}
845
844
846
845
// If we got here without hitting a `return` that means that all
@@ -1414,25 +1413,25 @@ impl DepNodeColorMap {
1414
1413
}
1415
1414
}
1416
1415
1417
- fn backtrace_printer < ' a , K : DepKind > (
1418
- sess : & ' a rustc_session :: Session ,
1419
- graph : & ' a DepGraphData < K > ,
1420
- node : SerializedDepNodeIndex ,
1421
- ) -> OnDrop < impl Fn ( ) + ' a > {
1422
- OnDrop (
1423
- # [ inline ( never ) ]
1424
- # [ cold ]
1425
- move || {
1426
- let node = graph . previous . index_to_node ( node ) ;
1427
- // Do not try to rely on DepNode's Debug implementation, since it may panic.
1428
- let diag = rustc_errors :: Diagnostic :: new (
1429
- rustc_errors :: Level :: FailureNote ,
1430
- & format ! (
1431
- "encountered while trying to mark dependency green: {:?}({})" ,
1432
- node . kind , node. hash
1433
- ) ,
1434
- ) ;
1435
- sess . diagnostic ( ) . force_print_diagnostic ( diag ) ;
1436
- } ,
1437
- )
1416
+ # [ inline ( never ) ]
1417
+ # [ cold ]
1418
+ pub ( crate ) fn print_markframe_trace < K : DepKind > (
1419
+ graph : & DepGraph < K > ,
1420
+ frame : Option < & MarkFrame < ' _ > > ,
1421
+ ) {
1422
+ let data = graph . data . as_ref ( ) . unwrap ( ) ;
1423
+
1424
+ eprintln ! ( "there was a panic while trying to force a dep node" ) ;
1425
+ eprintln ! ( "try_mark_green dep node stack:" ) ;
1426
+
1427
+ let mut i = 0 ;
1428
+ let mut current = frame ;
1429
+ while let Some ( frame ) = current {
1430
+ let node = data . previous . index_to_node ( frame . index ) ;
1431
+ eprintln ! ( "#{i} {:?}" , node) ;
1432
+ current = frame . parent ;
1433
+ i += 1 ;
1434
+ }
1435
+
1436
+ eprintln ! ( "end of try_mark_green dep node stack" ) ;
1438
1437
}
0 commit comments