@@ -7,6 +7,7 @@ use rustc_data_structures::fx::FxHashMap;
7
7
use rustc_index:: vec:: { Idx , IndexVec } ;
8
8
use rustc_serialize:: { Decodable , Decoder , Encodable , Encoder } ;
9
9
use std:: convert:: TryInto ;
10
+ use std:: ops:: Range ;
10
11
11
12
#[ derive( Debug , PartialEq , Eq ) ]
12
13
pub enum DepNodeColor {
@@ -67,48 +68,75 @@ static_assert_size!(Option<DepNodeIndex>, 4);
67
68
static_assert_size ! ( Option <SerializedDepNodeIndex >, 4 ) ;
68
69
69
70
#[ derive( Copy , Clone , Encodable , Decodable ) ]
70
- struct ColorAndOffset ( u32 ) ;
71
+ struct ColorAndOffset ( u32 , u32 ) ;
71
72
72
73
impl std:: fmt:: Debug for ColorAndOffset {
73
74
fn fmt ( & self , fmt : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
74
75
fmt. debug_struct ( "ColorAndOffset" )
75
76
. field ( "color" , & self . color ( ) )
76
- . field ( "offset" , & self . offset ( ) )
77
+ . field ( "lifted" , & self . lifted ( ) )
78
+ . field ( "range" , & self . range ( ) )
77
79
. finish ( )
78
80
}
79
81
}
80
82
81
83
impl ColorAndOffset {
82
- fn unknown ( offset : u32 ) -> ColorAndOffset {
83
- debug_assert_eq ! ( offset & TAG_MASK , 0 ) ;
84
- ColorAndOffset ( offset | TAG_UNKNOWN )
84
+ fn unknown ( start : u32 , end : u32 ) -> ColorAndOffset {
85
+ debug_assert_eq ! ( start & TAG_MASK , 0 ) ;
86
+ debug_assert_eq ! ( end & TAG_MASK , 0 ) ;
87
+ ColorAndOffset ( start | TAG_UNKNOWN , end | TAG_UNKNOWN )
85
88
}
86
89
87
- fn new ( color : DepNodeColor , offset : u32 ) -> ColorAndOffset {
88
- let offset: u32 = offset. try_into ( ) . unwrap ( ) ;
89
- debug_assert_eq ! ( offset & TAG_MASK , 0 ) ;
90
- ColorAndOffset ( offset | color. tag ( ) )
90
+ #[ allow( dead_code) ]
91
+ fn new ( color : DepNodeColor , range : Range < usize > ) -> ColorAndOffset {
92
+ let start: u32 = range. start . try_into ( ) . unwrap ( ) ;
93
+ let end: u32 = range. end . try_into ( ) . unwrap ( ) ;
94
+ debug_assert_eq ! ( start & TAG_MASK , 0 ) ;
95
+ debug_assert_eq ! ( end & TAG_MASK , 0 ) ;
96
+ ColorAndOffset ( start | color. tag ( ) , end | TAG_UNKNOWN )
97
+ }
98
+
99
+ fn new_lifted ( color : DepNodeColor , range : Range < usize > ) -> ColorAndOffset {
100
+ let start: u32 = range. start . try_into ( ) . unwrap ( ) ;
101
+ let end: u32 = range. end . try_into ( ) . unwrap ( ) ;
102
+ debug_assert_eq ! ( start & TAG_MASK , 0 ) ;
103
+ debug_assert_eq ! ( end & TAG_MASK , 0 ) ;
104
+ ColorAndOffset ( start | color. tag ( ) , end | TAG_GREEN )
91
105
}
92
106
93
107
fn set_color ( & mut self , color : DepNodeColor ) {
94
108
let offset = self . 0 & OFFSET_MASK ;
95
109
self . 0 = color. tag ( ) | offset;
96
110
}
97
111
98
- fn offset ( self ) -> u32 {
99
- self . 0 & OFFSET_MASK
100
- }
101
-
102
112
fn color ( self ) -> Option < DepNodeColor > {
103
113
let tag = self . 0 & TAG_MASK ;
104
114
match tag {
105
115
TAG_NEW => Some ( DepNodeColor :: New ) ,
106
116
TAG_RED => Some ( DepNodeColor :: Red ) ,
107
117
TAG_GREEN => Some ( DepNodeColor :: Green ) ,
108
118
TAG_UNKNOWN => None ,
109
- _ => panic ! ( ) ,
119
+ _ => unsafe { std:: hint:: unreachable_unchecked ( ) } ,
120
+ }
121
+ }
122
+
123
+ fn lifted ( self ) -> bool {
124
+ let tag = self . 1 & TAG_MASK ;
125
+ match tag {
126
+ TAG_UNKNOWN => false ,
127
+ _ => true ,
110
128
}
111
129
}
130
+
131
+ fn range ( self ) -> Range < usize > {
132
+ let start = ( self . 0 & OFFSET_MASK ) as usize ;
133
+ let end = ( self . 1 & OFFSET_MASK ) as usize ;
134
+ start..end
135
+ }
136
+ }
137
+
138
+ fn shrink_range ( range : Range < usize > ) -> Range < u32 > {
139
+ range. start . try_into ( ) . unwrap ( ) ..range. end . try_into ( ) . unwrap ( )
112
140
}
113
141
114
142
/// Data for use when recompiling the **previous crate**.
@@ -124,7 +152,7 @@ pub struct SerializedDepGraph<K: DepKind> {
124
152
/// For each DepNode, stores the list of edges originating from that
125
153
/// DepNode. Encoded as a [start, end) pair indexing into edge_list_data,
126
154
/// which holds the actual DepNodeIndices of the target nodes.
127
- edge_list_indices : IndexVec < SerializedDepNodeIndex , ( ColorAndOffset , u32 ) > ,
155
+ edge_list_indices : IndexVec < SerializedDepNodeIndex , ColorAndOffset > ,
128
156
/// A flattened list of all edge targets in the graph. Edge sources are
129
157
/// implicit in edge_list_indices.
130
158
edge_list_data : Vec < DepNodeIndex > ,
@@ -143,7 +171,7 @@ pub struct CurrentDepGraph<K: DepKind> {
143
171
/// For each DepNode, stores the list of edges originating from that
144
172
/// DepNode. Encoded as a [start, end) pair indexing into edge_list_data,
145
173
/// which holds the actual DepNodeIndices of the target nodes.
146
- edge_list_indices : IndexVec < SplitIndex , ( u32 , u32 ) > ,
174
+ edge_list_indices : IndexVec < SplitIndex , Range < u32 > > ,
147
175
/// A flattened list of all edge targets in the graph. Edge sources are
148
176
/// implicit in edge_list_indices.
149
177
edge_list_data : Vec < DepNodeIndex > ,
@@ -194,20 +222,20 @@ impl<K: DepKind> CurrentDepGraph<K> {
194
222
debug ! ( "intern_new: {:?} {:?}" , self . from_split( index) , node) ;
195
223
let _index = self . fingerprints . push ( fingerprint) ;
196
224
debug_assert_eq ! ( index, _index) ;
197
- let ( start , end ) = self . insert_deps ( deps) ;
198
- let _index = self . edge_list_indices . push ( ( start , end ) ) ;
225
+ let range = self . insert_deps ( deps) ;
226
+ let _index = self . edge_list_indices . push ( shrink_range ( range ) ) ;
199
227
debug_assert_eq ! ( index, _index) ;
200
228
let index = self . from_split ( index) ;
201
229
let _o = self . index . insert ( node, index) ;
202
230
debug_assert_eq ! ( _o, None ) ;
203
231
index
204
232
}
205
233
206
- fn insert_deps ( & mut self , deps : & [ DepNodeIndex ] ) -> ( u32 , u32 ) {
234
+ fn insert_deps ( & mut self , deps : & [ DepNodeIndex ] ) -> Range < usize > {
207
235
let start = self . edge_list_data . len ( ) ;
208
236
self . edge_list_data . extend ( deps. iter ( ) . copied ( ) ) ;
209
237
let end = self . edge_list_data . len ( ) ;
210
- ( start. try_into ( ) . unwrap ( ) , end. try_into ( ) . unwrap ( ) )
238
+ start.. end
211
239
}
212
240
213
241
fn update_deps (
@@ -216,19 +244,18 @@ impl<K: DepKind> CurrentDepGraph<K> {
216
244
color : DepNodeColor ,
217
245
deps : & [ DepNodeIndex ] ,
218
246
) {
219
- let ( start, _) = self . serialized . edge_list_indices [ index] ;
220
- debug_assert_eq ! ( start. color( ) , None ) ;
221
- let ( start, end) = self . insert_deps ( deps) ;
222
- let len = self . serialized . edge_list_data . len ( ) as u32 ;
223
247
debug ! ( "intern_color: {:?} => {:?}" , index, color) ;
224
- let start = ColorAndOffset :: new ( color, start + len) ;
225
- self . serialized . edge_list_indices [ index] = ( start, end + len) ;
248
+ let range = self . serialized . edge_list_indices [ index] ;
249
+ debug_assert_eq ! ( range. color( ) , None ) ;
250
+ let range = self . insert_deps ( deps) ;
251
+ let range = ColorAndOffset :: new_lifted ( color, range) ;
252
+ self . serialized . edge_list_indices [ index] = range;
226
253
}
227
254
228
255
pub ( crate ) fn intern_dark_green_node ( & mut self , index : SerializedDepNodeIndex ) -> DepNodeIndex {
229
256
debug ! ( "intern_drak_green: {:?}" , index) ;
230
- debug_assert_eq ! ( self . serialized. edge_list_indices[ index] . 0 . color( ) , None ) ;
231
- self . serialized . edge_list_indices [ index] . 0 . set_color ( DepNodeColor :: Green ) ;
257
+ debug_assert_eq ! ( self . serialized. edge_list_indices[ index] . color( ) , None ) ;
258
+ self . serialized . edge_list_indices [ index] . set_color ( DepNodeColor :: Green ) ;
232
259
debug ! ( "intern_color: {:?} => Green" , index) ;
233
260
index. rejuvenate ( )
234
261
}
@@ -329,22 +356,19 @@ impl<K: DepKind> CurrentDepGraph<K> {
329
356
330
357
#[ inline]
331
358
fn serialized_edges ( & self , source : SerializedDepNodeIndex ) -> & [ DepNodeIndex ] {
332
- let ( start, end) = self . serialized . edge_list_indices [ source] ;
333
- let start = start. offset ( ) as usize ;
334
- let end = end as usize ;
335
- let len = self . serialized . edge_list_data . len ( ) ;
336
- if start < len {
337
- & self . serialized . edge_list_data [ start..end]
359
+ let range = self . serialized . edge_list_indices [ source] ;
360
+ if range. lifted ( ) {
361
+ & self . edge_list_data [ range. range ( ) ]
338
362
} else {
339
- & self . edge_list_data [ start - len..end - len ]
363
+ & self . serialized . edge_list_data [ range . range ( ) ]
340
364
}
341
365
}
342
366
343
367
#[ inline]
344
368
fn new_edges ( & self , source : SplitIndex ) -> & [ DepNodeIndex ] {
345
- let ( start , end ) = self . edge_list_indices [ source] ;
346
- let start = start as usize ;
347
- let end = end as usize ;
369
+ let range = & self . edge_list_indices [ source] ;
370
+ let start = range . start as usize ;
371
+ let end = range . end as usize ;
348
372
& self . edge_list_data [ start..end]
349
373
}
350
374
@@ -353,15 +377,14 @@ impl<K: DepKind> CurrentDepGraph<K> {
353
377
& self ,
354
378
source : SerializedDepNodeIndex ,
355
379
) -> Result < DepNodeColor , & ' static [ SerializedDepNodeIndex ] > {
356
- let ( start , end ) = self . serialized . edge_list_indices [ source] ;
357
- if let Some ( color) = start . color ( ) {
380
+ let range = self . serialized . edge_list_indices [ source] ;
381
+ if let Some ( color) = range . color ( ) {
358
382
return Ok ( color) ;
359
383
}
360
- let start = start. offset ( ) as usize ;
361
- let end = end as usize ;
362
384
// The node has not been colored, so the dependencies have not been lifted to point to the
363
385
// new nodes vector.
364
- let edges = & self . serialized . edge_list_data [ start..end] ;
386
+ debug_assert ! ( !range. lifted( ) ) ;
387
+ let edges = & self . serialized . edge_list_data [ range. range ( ) ] ;
365
388
debug_assert_eq ! (
366
389
std:: mem:: size_of:: <DepNodeIndex >( ) ,
367
390
std:: mem:: size_of:: <SerializedDepNodeIndex >( )
@@ -407,14 +430,14 @@ impl<K: DepKind> CurrentDepGraph<K> {
407
430
let index = * self . index . get ( dep_node) ?;
408
431
if let Ok ( prev) = self . as_serialized ( index) {
409
432
// Return none if the node has not been coloured yet.
410
- self . serialized . edge_list_indices [ prev] . 0 . color ( ) ?;
433
+ self . serialized . edge_list_indices [ prev] . color ( ) ?;
411
434
}
412
435
Some ( index)
413
436
}
414
437
415
438
#[ inline]
416
439
pub ( crate ) fn color ( & self , index : SerializedDepNodeIndex ) -> Option < DepNodeColor > {
417
- self . serialized . edge_list_indices [ index] . 0 . color ( )
440
+ self . serialized . edge_list_indices [ index] . color ( )
418
441
}
419
442
420
443
#[ inline]
@@ -432,9 +455,9 @@ impl<K: DepKind> CurrentDepGraph<K> {
432
455
433
456
#[ inline]
434
457
fn live_serialized_indices ( & self ) -> impl Iterator < Item = SerializedDepNodeIndex > + ' _ {
435
- self . serialized . edge_list_indices . iter_enumerated ( ) . filter_map ( |( i, ( s , _ ) ) | {
458
+ self . serialized . edge_list_indices . iter_enumerated ( ) . filter_map ( |( i, range ) | {
436
459
// Return none if the node has not been coloured yet.
437
- let _ = s . color ( ) ?;
460
+ let _ = range . color ( ) ?;
438
461
Some ( i)
439
462
} )
440
463
}
@@ -461,9 +484,9 @@ impl<K: DepKind> CurrentDepGraph<K> {
461
484
fn edge_map ( & self ) -> impl Iterator < Item = & [ DepNodeIndex ] > + ' _ {
462
485
let serialized_edges =
463
486
self . live_serialized_indices ( ) . map ( move |index| self . serialized_edges ( index) ) ;
464
- let new_edges = self . edge_list_indices . iter ( ) . map ( move |& ( start , end ) | {
465
- let start = start as usize ;
466
- let end = end as usize ;
487
+ let new_edges = self . edge_list_indices . iter ( ) . map ( move |range | {
488
+ let start = range . start as usize ;
489
+ let end = range . end as usize ;
467
490
& self . edge_list_data [ start..end]
468
491
} ) ;
469
492
serialized_edges. chain ( new_edges)
@@ -620,7 +643,7 @@ impl<D: Decoder, K: DepKind + Decodable<D>> Decodable<D> for SerializedDepGraph<
620
643
let mut start: u32 = 0 ;
621
644
for i in 0 ..len {
622
645
let end: u32 = d. read_seq_elt ( i, Decodable :: decode) ?;
623
- indices. push ( ( ColorAndOffset :: unknown ( start) , end) ) ;
646
+ indices. push ( ColorAndOffset :: unknown ( start, end) ) ;
624
647
start = end;
625
648
}
626
649
Ok ( indices)
0 commit comments