1
1
use errors:: Diagnostic ;
2
2
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
3
- use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
3
+ use rustc_data_structures:: fx:: { FxHashMap , FxIndexMap , FxHashSet } ;
4
4
use rustc_index:: vec:: { Idx , IndexVec } ;
5
5
use smallvec:: SmallVec ;
6
6
use rustc_data_structures:: sync:: { Lrc , Lock , AtomicU32 , Ordering } ;
7
7
use std:: env;
8
8
use std:: hash:: Hash ;
9
- use std :: collections :: hash_map :: Entry ;
9
+ use indexmap :: map :: Entry ;
10
10
use std:: mem;
11
11
use crate :: ty:: { self , TyCtxt } ;
12
12
use crate :: util:: common:: { ProfileQueriesMsg , profq_msg} ;
@@ -123,12 +123,12 @@ impl DepGraph {
123
123
124
124
pub fn query ( & self ) -> DepGraphQuery {
125
125
let current_dep_graph = self . data . as_ref ( ) . unwrap ( ) . current . borrow ( ) ;
126
- let nodes: Vec < _ > = current_dep_graph. data . iter ( ) . map ( |n| n. node ) . collect ( ) ;
126
+ let nodes: Vec < _ > = current_dep_graph. data . values ( ) . map ( |n| n. node ) . collect ( ) ;
127
127
let mut edges = Vec :: new ( ) ;
128
- for ( from, edge_targets) in current_dep_graph. data . iter ( )
128
+ for ( from, edge_targets) in current_dep_graph. data . values ( )
129
129
. map ( |d| ( d. node , & d. edges ) ) {
130
130
for & edge_target in edge_targets. iter ( ) {
131
- let to = current_dep_graph. data [ edge_target] . node ;
131
+ let to = * current_dep_graph. data . get_index ( edge_target. index ( ) ) . unwrap ( ) . 0 ;
132
132
edges. push ( ( from, to) ) ;
133
133
}
134
134
}
@@ -397,7 +397,8 @@ impl DepGraph {
397
397
pub fn read ( & self , v : DepNode ) {
398
398
if let Some ( ref data) = self . data {
399
399
let current = data. current . borrow_mut ( ) ;
400
- if let Some ( & dep_node_index) = current. node_to_node_index . get ( & v) {
400
+ if let Some ( ( dep_node_index, _, _) ) = current. data . get_full ( & v) {
401
+ let dep_node_index = DepNodeIndex :: from_usize ( dep_node_index) ;
401
402
std:: mem:: drop ( current) ;
402
403
data. read_index ( dep_node_index) ;
403
404
} else {
@@ -415,21 +416,21 @@ impl DepGraph {
415
416
416
417
#[ inline]
417
418
pub fn dep_node_index_of ( & self , dep_node : & DepNode ) -> DepNodeIndex {
418
- self . data
419
+ DepNodeIndex :: from_usize ( self . data
419
420
. as_ref ( )
420
421
. unwrap ( )
421
422
. current
422
423
. borrow_mut ( )
423
- . node_to_node_index
424
- . get ( dep_node)
425
- . cloned ( )
424
+ . data
425
+ . get_full ( dep_node)
426
426
. unwrap ( )
427
+ . 0 )
427
428
}
428
429
429
430
#[ inline]
430
431
pub fn dep_node_exists ( & self , dep_node : & DepNode ) -> bool {
431
432
if let Some ( ref data) = self . data {
432
- data. current . borrow_mut ( ) . node_to_node_index . contains_key ( dep_node)
433
+ data. current . borrow_mut ( ) . data . contains_key ( dep_node)
433
434
} else {
434
435
false
435
436
}
@@ -438,7 +439,7 @@ impl DepGraph {
438
439
#[ inline]
439
440
pub fn fingerprint_of ( & self , dep_node_index : DepNodeIndex ) -> Fingerprint {
440
441
let current = self . data . as_ref ( ) . expect ( "dep graph enabled" ) . current . borrow_mut ( ) ;
441
- current. data [ dep_node_index] . fingerprint
442
+ current. data . get_index ( dep_node_index. index ( ) ) . unwrap ( ) . 1 . fingerprint
442
443
}
443
444
444
445
pub fn prev_fingerprint_of ( & self , dep_node : & DepNode ) -> Option < Fingerprint > {
@@ -505,25 +506,25 @@ impl DepGraph {
505
506
let current_dep_graph = self . data . as_ref ( ) . unwrap ( ) . current . borrow ( ) ;
506
507
507
508
let fingerprints: IndexVec < SerializedDepNodeIndex , _ > =
508
- current_dep_graph. data . iter ( ) . map ( |d| d. fingerprint ) . collect ( ) ;
509
+ current_dep_graph. data . values ( ) . map ( |d| d. fingerprint ) . collect ( ) ;
509
510
let nodes: IndexVec < SerializedDepNodeIndex , _ > =
510
- current_dep_graph. data . iter ( ) . map ( |d| d. node ) . collect ( ) ;
511
+ current_dep_graph. data . values ( ) . map ( |d| d. node ) . collect ( ) ;
511
512
512
- let total_edge_count: usize = current_dep_graph. data . iter ( )
513
+ let total_edge_count: usize = current_dep_graph. data . values ( )
513
514
. map ( |d| d. edges . len ( ) )
514
515
. sum ( ) ;
515
516
516
517
let mut edge_list_indices = IndexVec :: with_capacity ( nodes. len ( ) ) ;
517
518
let mut edge_list_data = Vec :: with_capacity ( total_edge_count) ;
518
519
519
- for ( current_dep_node_index, edges) in current_dep_graph. data . iter_enumerated ( )
520
+ for ( current_dep_node_index, edges) in current_dep_graph. data . values ( ) . enumerate ( )
520
521
. map ( |( i, d) | ( i, & d. edges ) ) {
521
522
let start = edge_list_data. len ( ) as u32 ;
522
523
// This should really just be a memcpy :/
523
524
edge_list_data. extend ( edges. iter ( ) . map ( |i| SerializedDepNodeIndex :: new ( i. index ( ) ) ) ) ;
524
525
let end = edge_list_data. len ( ) as u32 ;
525
526
526
- debug_assert_eq ! ( current_dep_node_index. index ( ) , edge_list_indices. len( ) ) ;
527
+ debug_assert_eq ! ( current_dep_node_index, edge_list_indices. len( ) ) ;
527
528
edge_list_indices. push ( ( start, end) ) ;
528
529
}
529
530
@@ -613,7 +614,7 @@ impl DepGraph {
613
614
614
615
#[ cfg( not( parallel_compiler) ) ]
615
616
{
616
- debug_assert ! ( !data. current. borrow( ) . node_to_node_index . contains_key( dep_node) ) ;
617
+ debug_assert ! ( !data. current. borrow( ) . data . contains_key( dep_node) ) ;
617
618
debug_assert ! ( data. colors. get( prev_dep_node_index) . is_none( ) ) ;
618
619
}
619
620
@@ -877,7 +878,8 @@ impl DepGraph {
877
878
878
879
pub fn mark_loaded_from_cache ( & self , dep_node_index : DepNodeIndex , state : bool ) {
879
880
debug ! ( "mark_loaded_from_cache({:?}, {})" ,
880
- self . data. as_ref( ) . unwrap( ) . current. borrow( ) . data[ dep_node_index] . node,
881
+ self . data. as_ref( ) . unwrap( ) . current. borrow( )
882
+ . data. get_index( dep_node_index. as_usize( ) ) . unwrap( ) . 0 ,
881
883
state) ;
882
884
883
885
self . data
@@ -890,7 +892,8 @@ impl DepGraph {
890
892
891
893
pub fn was_loaded_from_cache ( & self , dep_node : & DepNode ) -> Option < bool > {
892
894
let data = self . data . as_ref ( ) . unwrap ( ) ;
893
- let dep_node_index = data. current . borrow ( ) . node_to_node_index [ dep_node] ;
895
+ let ( dep_node_index, _, _) = data. current . borrow ( ) . data . get_full ( dep_node) . unwrap ( ) ;
896
+ let dep_node_index = DepNodeIndex :: from_usize ( dep_node_index) ;
894
897
data. loaded_from_cache . borrow ( ) . get ( & dep_node_index) . cloned ( )
895
898
}
896
899
}
@@ -948,8 +951,7 @@ struct DepNodeData {
948
951
}
949
952
950
953
pub ( super ) struct CurrentDepGraph {
951
- data : IndexVec < DepNodeIndex , DepNodeData > ,
952
- node_to_node_index : FxHashMap < DepNode , DepNodeIndex > ,
954
+ data : FxIndexMap < DepNode , DepNodeData > ,
953
955
#[ allow( dead_code) ]
954
956
forbidden_edge : Option < EdgeFilter > ,
955
957
@@ -1001,11 +1003,7 @@ impl CurrentDepGraph {
1001
1003
let new_node_count_estimate = ( prev_graph_node_count * 102 ) / 100 + 200 ;
1002
1004
1003
1005
CurrentDepGraph {
1004
- data : IndexVec :: with_capacity ( new_node_count_estimate) ,
1005
- node_to_node_index : FxHashMap :: with_capacity_and_hasher (
1006
- new_node_count_estimate,
1007
- Default :: default ( ) ,
1008
- ) ,
1006
+ data : FxIndexMap :: with_capacity_and_hasher ( new_node_count_estimate, Default :: default ( ) ) ,
1009
1007
anon_id_seed : stable_hasher. finish ( ) ,
1010
1008
forbidden_edge,
1011
1009
total_read_count : 0 ,
@@ -1052,7 +1050,7 @@ impl CurrentDepGraph {
1052
1050
edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
1053
1051
fingerprint : Fingerprint
1054
1052
) -> DepNodeIndex {
1055
- debug_assert ! ( !self . node_to_node_index . contains_key( & dep_node) ) ;
1053
+ debug_assert ! ( !self . data . contains_key( & dep_node) ) ;
1056
1054
self . intern_node ( dep_node, edges, fingerprint)
1057
1055
}
1058
1056
@@ -1062,18 +1060,15 @@ impl CurrentDepGraph {
1062
1060
edges : SmallVec < [ DepNodeIndex ; 8 ] > ,
1063
1061
fingerprint : Fingerprint
1064
1062
) -> DepNodeIndex {
1065
- debug_assert_eq ! ( self . node_to_node_index. len( ) , self . data. len( ) ) ;
1066
-
1067
- match self . node_to_node_index . entry ( dep_node) {
1068
- Entry :: Occupied ( entry) => * entry. get ( ) ,
1063
+ match self . data . entry ( dep_node) {
1064
+ Entry :: Occupied ( entry) => DepNodeIndex :: from_usize ( entry. index ( ) ) ,
1069
1065
Entry :: Vacant ( entry) => {
1070
- let dep_node_index = DepNodeIndex :: new ( self . data . len ( ) ) ;
1071
- self . data . push ( DepNodeData {
1066
+ let dep_node_index = DepNodeIndex :: from_usize ( entry . index ( ) ) ;
1067
+ entry . insert ( DepNodeData {
1072
1068
node : dep_node,
1073
1069
edges,
1074
1070
fingerprint
1075
1071
} ) ;
1076
- entry. insert ( dep_node_index) ;
1077
1072
dep_node_index
1078
1073
}
1079
1074
}
0 commit comments