1
1
use crate :: arena:: Arena ;
2
- use crate :: hir:: map:: { Entry , HirOwnerData , Map } ;
3
- use crate :: hir:: { Owner , OwnerNodes , ParentedNode } ;
2
+ use crate :: hir:: map:: { HirOwnerData , Map } ;
3
+ use crate :: hir:: { IndexedHir , Owner , OwnerNodes , ParentedNode } ;
4
4
use crate :: ich:: StableHashingContext ;
5
- use crate :: middle:: cstore:: CrateStore ;
6
5
use rustc_data_structures:: fingerprint:: Fingerprint ;
7
6
use rustc_data_structures:: fx:: FxHashMap ;
8
7
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
9
- use rustc_data_structures:: svh:: Svh ;
10
8
use rustc_hir as hir;
9
+ use rustc_hir:: def_id:: LocalDefId ;
11
10
use rustc_hir:: def_id:: CRATE_DEF_INDEX ;
12
- use rustc_hir:: def_id:: { LocalDefId , LOCAL_CRATE } ;
13
- use rustc_hir:: definitions:: { self , DefPathHash } ;
11
+ use rustc_hir:: definitions;
14
12
use rustc_hir:: intravisit:: { self , NestedVisitorMap , Visitor } ;
15
13
use rustc_hir:: * ;
16
14
use rustc_index:: vec:: { Idx , IndexVec } ;
17
- use rustc_session:: { CrateDisambiguator , Session } ;
15
+ use rustc_session:: Session ;
18
16
use rustc_span:: source_map:: SourceMap ;
19
- use rustc_span:: { Span , Symbol , DUMMY_SP } ;
17
+ use rustc_span:: { Span , DUMMY_SP } ;
20
18
21
19
use std:: iter:: repeat;
22
20
@@ -31,6 +29,7 @@ pub(super) struct NodeCollector<'a, 'hir> {
31
29
source_map : & ' a SourceMap ,
32
30
33
31
map : IndexVec < LocalDefId , HirOwnerData < ' hir > > ,
32
+ parenting : FxHashMap < LocalDefId , HirId > ,
34
33
35
34
/// The parent of this node
36
35
parent_node : hir:: HirId ,
@@ -40,10 +39,6 @@ pub(super) struct NodeCollector<'a, 'hir> {
40
39
definitions : & ' a definitions:: Definitions ,
41
40
42
41
hcx : StableHashingContext < ' a > ,
43
-
44
- // We are collecting HIR hashes here so we can compute the
45
- // crate hash from them later on.
46
- hir_body_nodes : Vec < ( DefPathHash , Fingerprint ) > ,
47
42
}
48
43
49
44
fn insert_vec_map < K : Idx , V : Clone > ( map : & mut IndexVec < K , Option < V > > , k : K , v : V ) {
@@ -58,34 +53,20 @@ fn insert_vec_map<K: Idx, V: Clone>(map: &mut IndexVec<K, Option<V>>, k: K, v: V
58
53
59
54
fn hash_body (
60
55
hcx : & mut StableHashingContext < ' _ > ,
61
- def_path_hash : DefPathHash ,
62
56
item_like : impl for < ' a > HashStable < StableHashingContext < ' a > > ,
63
- hir_body_nodes : & mut Vec < ( DefPathHash , Fingerprint ) > ,
64
57
) -> Fingerprint {
65
- let hash = {
66
- let mut stable_hasher = StableHasher :: new ( ) ;
67
- hcx. while_hashing_hir_bodies ( true , |hcx| {
68
- item_like. hash_stable ( hcx, & mut stable_hasher) ;
69
- } ) ;
70
- stable_hasher. finish ( )
71
- } ;
72
- hir_body_nodes. push ( ( def_path_hash, hash) ) ;
73
- hash
58
+ let mut stable_hasher = StableHasher :: new ( ) ;
59
+ hcx. while_hashing_hir_bodies ( true , |hcx| {
60
+ item_like. hash_stable ( hcx, & mut stable_hasher) ;
61
+ } ) ;
62
+ stable_hasher. finish ( )
74
63
}
75
64
76
- fn upstream_crates ( cstore : & dyn CrateStore ) -> Vec < ( Symbol , Fingerprint , Svh ) > {
77
- let mut upstream_crates: Vec < _ > = cstore
78
- . crates_untracked ( )
79
- . iter ( )
80
- . map ( |& cnum| {
81
- let name = cstore. crate_name_untracked ( cnum) ;
82
- let disambiguator = cstore. crate_disambiguator_untracked ( cnum) . to_fingerprint ( ) ;
83
- let hash = cstore. crate_hash_untracked ( cnum) ;
84
- ( name, disambiguator, hash)
85
- } )
86
- . collect ( ) ;
87
- upstream_crates. sort_unstable_by_key ( |& ( name, dis, _) | ( name. as_str ( ) , dis) ) ;
88
- upstream_crates
65
+ /// Represents an entry and its parent `HirId`.
66
+ #[ derive( Copy , Clone , Debug ) ]
67
+ pub struct Entry < ' hir > {
68
+ parent : HirId ,
69
+ node : Node < ' hir > ,
89
70
}
90
71
91
72
impl < ' a , ' hir > NodeCollector < ' a , ' hir > {
@@ -96,11 +77,6 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
96
77
definitions : & ' a definitions:: Definitions ,
97
78
mut hcx : StableHashingContext < ' a > ,
98
79
) -> NodeCollector < ' a , ' hir > {
99
- let root_mod_def_path_hash =
100
- definitions. def_path_hash ( LocalDefId { local_def_index : CRATE_DEF_INDEX } ) ;
101
-
102
- let mut hir_body_nodes = Vec :: new ( ) ;
103
-
104
80
let hash = {
105
81
let Crate {
106
82
ref item,
@@ -120,7 +96,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
120
96
attrs : _,
121
97
} = * krate;
122
98
123
- hash_body ( & mut hcx, root_mod_def_path_hash , item, & mut hir_body_nodes )
99
+ hash_body ( & mut hcx, item)
124
100
} ;
125
101
126
102
let mut collector = NodeCollector {
@@ -131,10 +107,10 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
131
107
current_dep_node_owner : LocalDefId { local_def_index : CRATE_DEF_INDEX } ,
132
108
definitions,
133
109
hcx,
134
- hir_body_nodes,
135
110
map : ( 0 ..definitions. def_index_count ( ) )
136
111
. map ( |_| HirOwnerData { signature : None , with_bodies : None } )
137
112
. collect ( ) ,
113
+ parenting : FxHashMap :: default ( ) ,
138
114
} ;
139
115
collector. insert_entry (
140
116
hir:: CRATE_HIR_ID ,
@@ -145,55 +121,13 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
145
121
collector
146
122
}
147
123
148
- pub ( super ) fn finalize_and_compute_crate_hash (
149
- mut self ,
150
- crate_disambiguator : CrateDisambiguator ,
151
- cstore : & dyn CrateStore ,
152
- commandline_args_hash : u64 ,
153
- ) -> ( IndexVec < LocalDefId , HirOwnerData < ' hir > > , Svh ) {
124
+ pub ( super ) fn finalize_and_compute_crate_hash ( mut self ) -> IndexedHir < ' hir > {
154
125
// Insert bodies into the map
155
126
for ( id, body) in self . krate . bodies . iter ( ) {
156
127
let bodies = & mut self . map [ id. hir_id . owner ] . with_bodies . as_mut ( ) . unwrap ( ) . bodies ;
157
128
assert ! ( bodies. insert( id. hir_id. local_id, body) . is_none( ) ) ;
158
129
}
159
-
160
- self . hir_body_nodes . sort_unstable_by_key ( |bn| bn. 0 ) ;
161
-
162
- let node_hashes = self . hir_body_nodes . iter ( ) . fold (
163
- Fingerprint :: ZERO ,
164
- |combined_fingerprint, & ( def_path_hash, fingerprint) | {
165
- combined_fingerprint. combine ( def_path_hash. 0 . combine ( fingerprint) )
166
- } ,
167
- ) ;
168
-
169
- let upstream_crates = upstream_crates ( cstore) ;
170
-
171
- // We hash the final, remapped names of all local source files so we
172
- // don't have to include the path prefix remapping commandline args.
173
- // If we included the full mapping in the SVH, we could only have
174
- // reproducible builds by compiling from the same directory. So we just
175
- // hash the result of the mapping instead of the mapping itself.
176
- let mut source_file_names: Vec < _ > = self
177
- . source_map
178
- . files ( )
179
- . iter ( )
180
- . filter ( |source_file| source_file. cnum == LOCAL_CRATE )
181
- . map ( |source_file| source_file. name_hash )
182
- . collect ( ) ;
183
-
184
- source_file_names. sort_unstable ( ) ;
185
-
186
- let crate_hash_input = (
187
- ( ( node_hashes, upstream_crates) , source_file_names) ,
188
- ( commandline_args_hash, crate_disambiguator. to_fingerprint ( ) ) ,
189
- ) ;
190
-
191
- let mut stable_hasher = StableHasher :: new ( ) ;
192
- crate_hash_input. hash_stable ( & mut self . hcx , & mut stable_hasher) ;
193
- let crate_hash: Fingerprint = stable_hasher. finish ( ) ;
194
-
195
- let svh = Svh :: new ( crate_hash. to_smaller_hash ( ) ) ;
196
- ( self . map , svh)
130
+ IndexedHir { map : self . map , parenting : self . parenting }
197
131
}
198
132
199
133
fn insert_entry ( & mut self , id : HirId , entry : Entry < ' hir > , hash : Fingerprint ) {
@@ -218,8 +152,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
218
152
nodes. hash = hash;
219
153
220
154
debug_assert ! ( data. signature. is_none( ) ) ;
221
- data. signature =
222
- Some ( self . arena . alloc ( Owner { parent : entry. parent , node : entry. node } ) ) ;
155
+ data. signature = Some ( self . arena . alloc ( Owner { node : entry. node } ) ) ;
223
156
224
157
let dk_parent = self . definitions . def_key ( id. owner ) . parent ;
225
158
if let Some ( dk_parent) = dk_parent {
@@ -231,6 +164,8 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
231
164
id. owner, dk_parent, entry. parent,
232
165
)
233
166
}
167
+
168
+ debug_assert_eq ! ( self . parenting. get( & id. owner) , Some ( & entry. parent) ) ;
234
169
}
235
170
} else {
236
171
assert_eq ! ( entry. parent. owner, id. owner) ;
@@ -294,15 +229,28 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> {
294
229
f : F ,
295
230
) {
296
231
let prev_owner = self . current_dep_node_owner ;
297
-
298
- let def_path_hash = self . definitions . def_path_hash ( dep_node_owner) ;
299
-
300
- let hash = hash_body ( & mut self . hcx , def_path_hash, item_like, & mut self . hir_body_nodes ) ;
232
+ let hash = hash_body ( & mut self . hcx , item_like) ;
301
233
302
234
self . current_dep_node_owner = dep_node_owner;
303
235
f ( self , hash) ;
304
236
self . current_dep_node_owner = prev_owner;
305
237
}
238
+
239
+ fn insert_nested ( & mut self , item : LocalDefId ) {
240
+ #[ cfg( debug_assertions) ]
241
+ {
242
+ let dk_parent = self . definitions . def_key ( item) . parent . unwrap ( ) ;
243
+ let dk_parent = LocalDefId { local_def_index : dk_parent } ;
244
+ let dk_parent = self . definitions . local_def_id_to_hir_id ( dk_parent) ;
245
+ debug_assert_eq ! (
246
+ dk_parent. owner, self . parent_node. owner,
247
+ "Different parents for {:?}" ,
248
+ item
249
+ )
250
+ }
251
+
252
+ assert_eq ! ( self . parenting. insert( item, self . parent_node) , None ) ;
253
+ }
306
254
}
307
255
308
256
impl < ' a , ' hir > Visitor < ' hir > for NodeCollector < ' a , ' hir > {
@@ -318,18 +266,22 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
318
266
319
267
fn visit_nested_item ( & mut self , item : ItemId ) {
320
268
debug ! ( "visit_nested_item: {:?}" , item) ;
269
+ self . insert_nested ( item. def_id ) ;
321
270
self . visit_item ( self . krate . item ( item) ) ;
322
271
}
323
272
324
273
fn visit_nested_trait_item ( & mut self , item_id : TraitItemId ) {
274
+ self . insert_nested ( item_id. def_id ) ;
325
275
self . visit_trait_item ( self . krate . trait_item ( item_id) ) ;
326
276
}
327
277
328
278
fn visit_nested_impl_item ( & mut self , item_id : ImplItemId ) {
279
+ self . insert_nested ( item_id. def_id ) ;
329
280
self . visit_impl_item ( self . krate . impl_item ( item_id) ) ;
330
281
}
331
282
332
283
fn visit_nested_foreign_item ( & mut self , foreign_id : ForeignItemId ) {
284
+ self . insert_nested ( foreign_id. def_id ) ;
333
285
self . visit_foreign_item ( self . krate . foreign_item ( foreign_id) ) ;
334
286
}
335
287
@@ -517,6 +469,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
517
469
self . definitions . local_def_id_to_hir_id ( LocalDefId { local_def_index } )
518
470
} ) ;
519
471
self . with_parent ( parent, |this| {
472
+ this. insert_nested ( macro_def. def_id ) ;
520
473
this. with_dep_node_owner ( macro_def. def_id , macro_def, |this, hash| {
521
474
this. insert_with_hash (
522
475
macro_def. span ,
0 commit comments