@@ -916,6 +916,11 @@ pub(super) struct CurrentDepGraph<K: DepKind> {
916
916
new_node_to_index : Sharded < FxHashMap < DepNode < K > , DepNodeIndex > > ,
917
917
prev_index_to_index : Lock < IndexVec < SerializedDepNodeIndex , Option < DepNodeIndex > > > ,
918
918
919
+ /// This is used to verify that fingerprints do not change between the creation of a node
920
+ /// and its recomputation.
921
+ #[ cfg( debug_assertions) ]
922
+ fingerprints : Lock < FxHashMap < DepNode < K > , Fingerprint > > ,
923
+
919
924
/// Used to trap when a specific edge is added to the graph.
920
925
/// This is used for debug purposes and is only active with `debug_assertions`.
921
926
#[ cfg( debug_assertions) ]
@@ -999,17 +1004,27 @@ impl<K: DepKind> CurrentDepGraph<K> {
999
1004
anon_id_seed,
1000
1005
#[ cfg( debug_assertions) ]
1001
1006
forbidden_edge,
1007
+ #[ cfg( debug_assertions) ]
1008
+ fingerprints : Lock :: new ( Default :: default ( ) ) ,
1002
1009
total_read_count : AtomicU64 :: new ( 0 ) ,
1003
1010
total_duplicate_read_count : AtomicU64 :: new ( 0 ) ,
1004
1011
node_intern_event_id,
1005
1012
}
1006
1013
}
1007
1014
1008
1015
#[ cfg( debug_assertions) ]
1009
- fn record_edge ( & self , dep_node_index : DepNodeIndex , key : DepNode < K > ) {
1016
+ fn record_edge ( & self , dep_node_index : DepNodeIndex , key : DepNode < K > , fingerprint : Fingerprint ) {
1010
1017
if let Some ( forbidden_edge) = & self . forbidden_edge {
1011
1018
forbidden_edge. index_to_node . lock ( ) . insert ( dep_node_index, key) ;
1012
1019
}
1020
+ match self . fingerprints . lock ( ) . entry ( key) {
1021
+ Entry :: Vacant ( v) => {
1022
+ v. insert ( fingerprint) ;
1023
+ }
1024
+ Entry :: Occupied ( o) => {
1025
+ assert_eq ! ( * o. get( ) , fingerprint, "Unstable fingerprints for {:?}" , key) ;
1026
+ }
1027
+ }
1013
1028
}
1014
1029
1015
1030
/// Writes the node to the current dep-graph and allocates a `DepNodeIndex` for it.
@@ -1021,17 +1036,21 @@ impl<K: DepKind> CurrentDepGraph<K> {
1021
1036
edges : EdgesVec ,
1022
1037
current_fingerprint : Fingerprint ,
1023
1038
) -> DepNodeIndex {
1024
- match self . new_node_to_index . get_shard_by_value ( & key) . lock ( ) . entry ( key) {
1039
+ let dep_node_index = match self . new_node_to_index . get_shard_by_value ( & key) . lock ( ) . entry ( key)
1040
+ {
1025
1041
Entry :: Occupied ( entry) => * entry. get ( ) ,
1026
1042
Entry :: Vacant ( entry) => {
1027
1043
let dep_node_index =
1028
1044
self . encoder . borrow ( ) . send ( profiler, key, current_fingerprint, edges) ;
1029
1045
entry. insert ( dep_node_index) ;
1030
- #[ cfg( debug_assertions) ]
1031
- self . record_edge ( dep_node_index, key) ;
1032
1046
dep_node_index
1033
1047
}
1034
- }
1048
+ } ;
1049
+
1050
+ #[ cfg( debug_assertions) ]
1051
+ self . record_edge ( dep_node_index, key, current_fingerprint) ;
1052
+
1053
+ dep_node_index
1035
1054
}
1036
1055
1037
1056
fn intern_node (
@@ -1072,7 +1091,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
1072
1091
} ;
1073
1092
1074
1093
#[ cfg( debug_assertions) ]
1075
- self . record_edge ( dep_node_index, key) ;
1094
+ self . record_edge ( dep_node_index, key, fingerprint ) ;
1076
1095
( dep_node_index, Some ( ( prev_index, DepNodeColor :: Green ( dep_node_index) ) ) )
1077
1096
} else {
1078
1097
if print_status {
@@ -1094,7 +1113,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
1094
1113
} ;
1095
1114
1096
1115
#[ cfg( debug_assertions) ]
1097
- self . record_edge ( dep_node_index, key) ;
1116
+ self . record_edge ( dep_node_index, key, fingerprint ) ;
1098
1117
( dep_node_index, Some ( ( prev_index, DepNodeColor :: Red ) ) )
1099
1118
}
1100
1119
} else {
@@ -1119,7 +1138,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
1119
1138
} ;
1120
1139
1121
1140
#[ cfg( debug_assertions) ]
1122
- self . record_edge ( dep_node_index, key) ;
1141
+ self . record_edge ( dep_node_index, key, Fingerprint :: ZERO ) ;
1123
1142
( dep_node_index, Some ( ( prev_index, DepNodeColor :: Red ) ) )
1124
1143
}
1125
1144
} else {
@@ -1150,19 +1169,16 @@ impl<K: DepKind> CurrentDepGraph<K> {
1150
1169
Some ( dep_node_index) => dep_node_index,
1151
1170
None => {
1152
1171
let key = prev_graph. index_to_node ( prev_index) ;
1153
- let dep_node_index = self . encoder . borrow ( ) . send (
1154
- profiler,
1155
- key,
1156
- prev_graph. fingerprint_by_index ( prev_index) ,
1157
- prev_graph
1158
- . edge_targets_from ( prev_index)
1159
- . iter ( )
1160
- . map ( |i| prev_index_to_index[ * i] . unwrap ( ) )
1161
- . collect ( ) ,
1162
- ) ;
1172
+ let edges = prev_graph
1173
+ . edge_targets_from ( prev_index)
1174
+ . iter ( )
1175
+ . map ( |i| prev_index_to_index[ * i] . unwrap ( ) )
1176
+ . collect ( ) ;
1177
+ let fingerprint = prev_graph. fingerprint_by_index ( prev_index) ;
1178
+ let dep_node_index = self . encoder . borrow ( ) . send ( profiler, key, fingerprint, edges) ;
1163
1179
prev_index_to_index[ prev_index] = Some ( dep_node_index) ;
1164
1180
#[ cfg( debug_assertions) ]
1165
- self . record_edge ( dep_node_index, key) ;
1181
+ self . record_edge ( dep_node_index, key, fingerprint ) ;
1166
1182
dep_node_index
1167
1183
}
1168
1184
}
0 commit comments