@@ -46,6 +46,10 @@ impl std::convert::From<DepNodeIndex> for QueryInvocationId {
46
46
}
47
47
48
48
struct DepGraphData < K : DepKind > {
49
+ /// The dep-graph from the previous compilation session. It contains all
50
+ /// nodes and edges as well as all fingerprints of nodes that have them.
51
+ serialized : SerializedDepGraph < K > ,
52
+
49
53
/// The dep-graph from the compilation session. It contains all
50
54
/// nodes and edges as well as all fingerprints of nodes that have them.
51
55
graph : RwLock < CurrentDepGraph < K > > ,
@@ -118,9 +122,11 @@ impl<K: DepKind> DepGraph<K> {
118
122
Err ( _) => None ,
119
123
} ;
120
124
125
+ let graph = RwLock :: new ( CurrentDepGraph :: new ( & prev_graph) ) ;
121
126
DepGraph {
122
127
data : Some ( Lrc :: new ( DepGraphData {
123
- graph : RwLock :: new ( CurrentDepGraph :: new ( prev_graph) ) ,
128
+ serialized : prev_graph,
129
+ graph,
124
130
emitting_diagnostics : Default :: default ( ) ,
125
131
previous_work_products : prev_work_products,
126
132
dep_node_debug : Default :: default ( ) ,
@@ -148,7 +154,7 @@ impl<K: DepKind> DepGraph<K> {
148
154
149
155
pub fn query ( & self ) -> DepGraphQuery < K > {
150
156
let data = self . data . as_ref ( ) . unwrap ( ) ;
151
- data. graph . read ( ) . query ( )
157
+ data. graph . read ( ) . query ( & data . serialized )
152
158
}
153
159
154
160
pub fn assert_ignored ( & self ) {
@@ -239,6 +245,7 @@ impl<K: DepKind> DepGraph<K> {
239
245
240
246
// Intern the new `DepNode`.
241
247
let dep_node_index = data. graph . write ( ) . intern_task_node (
248
+ & data. serialized ,
242
249
key,
243
250
& edges[ ..] ,
244
251
current_fingerprint,
@@ -284,8 +291,11 @@ impl<K: DepKind> DepGraph<K> {
284
291
hash : data. anon_id_seed . combine ( hasher. finish ( ) ) . into ( ) ,
285
292
} ;
286
293
287
- let dep_node_index =
288
- data. graph . write ( ) . intern_anon_node ( target_dep_node, & task_deps. reads [ ..] ) ;
294
+ let dep_node_index = data. graph . write ( ) . intern_anon_node (
295
+ & data. serialized ,
296
+ target_dep_node,
297
+ & task_deps. reads [ ..] ,
298
+ ) ;
289
299
290
300
( result, dep_node_index)
291
301
} else {
@@ -334,7 +344,10 @@ impl<K: DepKind> DepGraph<K> {
334
344
#[ cfg( debug_assertions) ]
335
345
if let Some ( target) = task_deps. node {
336
346
if let Some ( ref forbidden_edge) = _data. forbidden_edge {
337
- let src = self . dep_node_of ( dep_node_index) ;
347
+ let src = _data
348
+ . graph
349
+ . read ( )
350
+ . index_to_node ( & _data. serialized , dep_node_index) ;
338
351
if forbidden_edge. test ( & src, & target) {
339
352
panic ! ( "forbidden edge {:?} -> {:?} created" , src, target)
340
353
}
@@ -352,24 +365,18 @@ impl<K: DepKind> DepGraph<K> {
352
365
#[ inline]
353
366
fn dep_node_index_of_opt ( & self , dep_node : & DepNode < K > ) -> Option < DepNodeIndex > {
354
367
let data = self . data . as_ref ( ) ?;
355
- data. graph . read ( ) . dep_node_index_of_opt ( dep_node)
368
+ data. graph . read ( ) . dep_node_index_of_opt ( & data . serialized , dep_node)
356
369
}
357
370
358
371
#[ inline]
359
372
pub fn dep_node_exists ( & self , dep_node : & DepNode < K > ) -> bool {
360
373
self . dep_node_index_of_opt ( dep_node) . is_some ( )
361
374
}
362
375
363
- #[ inline]
364
- fn dep_node_of ( & self , dep_node_index : DepNodeIndex ) -> DepNode < K > {
365
- let data = self . data . as_ref ( ) . unwrap ( ) ;
366
- data. graph . read ( ) . dep_node_of ( dep_node_index)
367
- }
368
-
369
376
#[ inline]
370
377
pub ( crate ) fn fingerprint_of ( & self , dep_node_index : DepNodeIndex ) -> Fingerprint {
371
378
let data = self . data . as_ref ( ) . unwrap ( ) ;
372
- data. graph . read ( ) . fingerprint_of ( dep_node_index)
379
+ data. graph . read ( ) . fingerprint_of ( & data . serialized , dep_node_index)
373
380
}
374
381
375
382
/// Checks whether a previous work product exists for `v` and, if
@@ -405,8 +412,8 @@ impl<K: DepKind> DepGraph<K> {
405
412
pub fn node_color ( & self , dep_node : & DepNode < K > ) -> Option < DepNodeColor > {
406
413
if let Some ( ref data) = self . data {
407
414
let graph = data. graph . read ( ) ;
408
- if let Some ( prev_index) = graph. node_to_index_opt ( dep_node) {
409
- return graph . color ( prev_index) ;
415
+ if let Some ( prev_index) = graph. node_to_index_opt ( & data . serialized , dep_node) {
416
+ return data . serialized . color ( prev_index) ;
410
417
} else {
411
418
// This is a node that did not exist in the previous compilation
412
419
// session, so we consider it to be red.
@@ -444,8 +451,8 @@ impl<K: DepKind> DepGraph<K> {
444
451
let data = self . data . as_ref ( ) ?;
445
452
446
453
// Return None if the dep node didn't exist in the previous session
447
- let prev_index = data. graph . read ( ) . node_to_index_opt ( dep_node) ?;
448
- let prev_deps = data. graph . read ( ) . color_or_edges ( prev_index) ;
454
+ let prev_index = data. graph . read ( ) . node_to_index_opt ( & data . serialized , dep_node) ?;
455
+ let prev_deps = data. serialized . color_or_edges ( prev_index) ;
449
456
let prev_deps = match prev_deps {
450
457
Err ( prev_deps) => prev_deps,
451
458
Ok ( DepNodeColor :: Green ) => return Some ( ( prev_index, prev_index. rejuvenate ( ) ) ) ,
@@ -468,7 +475,7 @@ impl<K: DepKind> DepGraph<K> {
468
475
parent_dep_node_index : SerializedDepNodeIndex ,
469
476
dep_node : & DepNode < K > ,
470
477
) -> Option < ( ) > {
471
- let dep_dep_node_color = data. graph . read ( ) . color_or_edges ( parent_dep_node_index) ;
478
+ let dep_dep_node_color = data. serialized . color_or_edges ( parent_dep_node_index) ;
472
479
let prev_deps = match dep_dep_node_color {
473
480
Ok ( DepNodeColor :: Green ) => {
474
481
// This dependency has been marked as green before, we are
@@ -477,7 +484,7 @@ impl<K: DepKind> DepGraph<K> {
477
484
debug ! (
478
485
"try_mark_parent_green({:?}) --- found dependency {:?} to be immediately green" ,
479
486
dep_node,
480
- data. graph . read ( ) . index_to_node( parent_dep_node_index)
487
+ data. serialized . index_to_node( parent_dep_node_index)
481
488
) ;
482
489
return Some ( ( ) ) ;
483
490
}
@@ -489,7 +496,7 @@ impl<K: DepKind> DepGraph<K> {
489
496
debug ! (
490
497
"try_mark_parent_green({:?}) - END - dependency {:?} was immediately red" ,
491
498
dep_node,
492
- data. graph . read ( ) . index_to_node( parent_dep_node_index)
499
+ data. serialized . index_to_node( parent_dep_node_index)
493
500
) ;
494
501
return None ;
495
502
}
@@ -503,12 +510,12 @@ impl<K: DepKind> DepGraph<K> {
503
510
is unknown, trying to mark it green",
504
511
dep_node,
505
512
{
506
- let dep_dep_node = data. graph . read ( ) . index_to_node( parent_dep_node_index) ;
513
+ let dep_dep_node = data. serialized . index_to_node( parent_dep_node_index) ;
507
514
( dep_dep_node, dep_dep_node. hash)
508
515
}
509
516
) ;
510
517
511
- let dep_dep_node = & data. graph . read ( ) . index_to_node ( parent_dep_node_index) ;
518
+ let dep_dep_node = & data. serialized . index_to_node ( parent_dep_node_index) ;
512
519
let node_index =
513
520
self . try_mark_previous_green ( tcx, data, parent_dep_node_index, prev_deps, dep_dep_node) ;
514
521
if node_index. is_some ( ) {
@@ -533,7 +540,7 @@ impl<K: DepKind> DepGraph<K> {
533
540
return None ;
534
541
}
535
542
536
- let dep_dep_node_color = data. graph . read ( ) . color ( parent_dep_node_index) ;
543
+ let dep_dep_node_color = data. serialized . color ( parent_dep_node_index) ;
537
544
538
545
match dep_dep_node_color {
539
546
Some ( DepNodeColor :: Green ) => {
@@ -592,15 +599,15 @@ impl<K: DepKind> DepGraph<K> {
592
599
593
600
// We never try to mark eval_always nodes as green
594
601
debug_assert ! ( !dep_node. kind. is_eval_always( ) ) ;
595
- debug_assert_eq ! ( data. graph . read ( ) . index_to_node( prev_dep_node_index) , * dep_node) ;
602
+ debug_assert_eq ! ( data. serialized . index_to_node( prev_dep_node_index) , * dep_node) ;
596
603
597
604
for & dep_dep_node_index in prev_deps {
598
605
self . try_mark_parent_green ( tcx, data, dep_dep_node_index, dep_node) ?
599
606
}
600
607
601
608
#[ cfg( not( parallel_compiler) ) ]
602
609
debug_assert_eq ! (
603
- data. graph . read ( ) . color( prev_dep_node_index) ,
610
+ data. serialized . color( prev_dep_node_index) ,
604
611
None ,
605
612
"DepGraph::try_mark_previous_green() - Duplicate DepNodeColor \
606
613
insertion for {:?}",
@@ -616,7 +623,7 @@ impl<K: DepKind> DepGraph<K> {
616
623
let dep_node_index = {
617
624
// We allocating an entry for the node in the current dependency graph and
618
625
// adding all the appropriate edges imported from the previous graph
619
- data. graph . write ( ) . intern_dark_green_node ( prev_dep_node_index)
626
+ data. serialized . intern_dark_green_node ( prev_dep_node_index)
620
627
} ;
621
628
622
629
// ... and emitting any stored diagnostic.
@@ -672,11 +679,10 @@ impl<K: DepKind> DepGraph<K> {
672
679
let _prof_timer = tcx. profiler ( ) . generic_activity ( "incr_comp_query_cache_promotion" ) ;
673
680
674
681
let data = self . data . as_ref ( ) . unwrap ( ) ;
675
- let graph = data. graph . read ( ) ;
676
- for prev_index in graph. serialized_indices ( ) {
677
- match graph. color ( prev_index) {
682
+ for prev_index in data. serialized . serialized_indices ( ) {
683
+ match data. serialized . color ( prev_index) {
678
684
Some ( DepNodeColor :: Green ) => {
679
- let dep_node = data. graph . read ( ) . index_to_node ( prev_index) ;
685
+ let dep_node = data. serialized . index_to_node ( prev_index) ;
680
686
debug ! ( "PROMOTE {:?} {:?}" , prev_index, dep_node) ;
681
687
qcx. try_load_from_on_disk_cache ( & dep_node) ;
682
688
}
@@ -692,11 +698,10 @@ impl<K: DepKind> DepGraph<K> {
692
698
// Register reused dep nodes (i.e. nodes we've marked red or green) with the context.
693
699
pub fn register_reused_dep_nodes < Ctxt : DepContext < DepKind = K > > ( & self , tcx : Ctxt ) {
694
700
let data = self . data . as_ref ( ) . unwrap ( ) ;
695
- let graph = data. graph . read ( ) ;
696
- for prev_index in graph. serialized_indices ( ) {
697
- match graph. color ( prev_index) {
701
+ for prev_index in data. serialized . serialized_indices ( ) {
702
+ match data. serialized . color ( prev_index) {
698
703
Some ( _) => {
699
- let dep_node = data. graph . read ( ) . index_to_node ( prev_index) ;
704
+ let dep_node = data. serialized . index_to_node ( prev_index) ;
700
705
tcx. register_reused_dep_node ( & dep_node) ;
701
706
}
702
707
None => { }
@@ -717,17 +722,17 @@ impl<K: DepKind> DepGraph<K> {
717
722
718
723
let mut stats: FxHashMap < _ , Stat < K > > = FxHashMap :: with_hasher ( Default :: default ( ) ) ;
719
724
720
- for index in prev. live_indices ( ) {
721
- let kind = prev. dep_node_of ( index) . kind ;
722
- let edge_count = prev. edge_targets_from ( index) . len ( ) ;
725
+ for index in prev. live_indices ( & data . serialized ) {
726
+ let kind = prev. index_to_node ( & data . serialized , index) . kind ;
727
+ let edge_count = prev. edge_targets_from ( & data . serialized , index) . len ( ) ;
723
728
724
729
let stat = stats. entry ( kind) . or_insert ( Stat { kind, node_counter : 0 , edge_counter : 0 } ) ;
725
730
stat. node_counter += 1 ;
726
731
stat. edge_counter += edge_count as u64 ;
727
732
}
728
733
729
- let total_node_count = prev. node_count ( ) ;
730
- let total_edge_count = prev. edge_count ( ) ;
734
+ let total_node_count = prev. node_count ( & data . serialized ) ;
735
+ let total_edge_count = prev. edge_count ( & data . serialized ) ;
731
736
732
737
// Drop the lock guard.
733
738
std:: mem:: drop ( prev) ;
@@ -792,14 +797,19 @@ impl<K: DepKind> DepGraph<K> {
792
797
}
793
798
794
799
pub fn compression_map ( & self ) -> IndexVec < DepNodeIndex , Option < SerializedDepNodeIndex > > {
795
- self . data . as_ref ( ) . unwrap ( ) . graph . read ( ) . compression_map ( )
800
+ let data = self . data . as_ref ( ) . unwrap ( ) ;
801
+ data. graph . read ( ) . compression_map ( & data. serialized )
796
802
}
797
803
798
804
pub fn encode < E : Encoder > ( & self , encoder : & mut E ) -> Result < ( ) , E :: Error >
799
805
where
800
806
K : Encodable < E > ,
801
807
{
802
- if let Some ( data) = & self . data { data. graph . read ( ) . encode ( encoder) } else { Ok ( ( ) ) }
808
+ if let Some ( data) = & self . data {
809
+ data. graph . read ( ) . encode ( & data. serialized , encoder)
810
+ } else {
811
+ Ok ( ( ) )
812
+ }
803
813
}
804
814
}
805
815
0 commit comments