@@ -221,8 +221,8 @@ macro_rules! separate_provide_extern_decl {
221
221
( [ ( separate_provide_extern) $( $rest: tt) * ] [ $name: ident] ) => {
222
222
for <' tcx> fn (
223
223
TyCtxt <' tcx>,
224
- query_keys :: $name<' tcx>,
225
- ) -> query_provided :: $name<' tcx>
224
+ queries :: $name:: Key <' tcx>,
225
+ ) -> queries :: $name:: ProvidedValue <' tcx>
226
226
} ;
227
227
( [ $other: tt $( $modifiers: tt) * ] [ $( $args: tt) * ] ) => {
228
228
separate_provide_extern_decl!( [ $( $modifiers) * ] [ $( $args) * ] )
@@ -252,60 +252,37 @@ macro_rules! define_callbacks {
252
252
$( $( #[ $attr: meta] ) *
253
253
[ $( $modifiers: tt) * ] fn $name: ident( $( $K: tt) * ) -> $V: ty, ) * ) => {
254
254
255
- // HACK(eddyb) this is like the `impl QueryConfig for queries::$name`
256
- // below, but using type aliases instead of associated types, to bypass
257
- // the limitations around normalizing under HRTB - for example, this:
258
- // `for<'tcx> fn(...) -> <queries::$name<'tcx> as QueryConfig<TyCtxt<'tcx>>>::Value`
259
- // doesn't currently normalize to `for<'tcx> fn(...) -> query_values::$name<'tcx>`.
260
- // This is primarily used by the `provide!` macro in `rustc_metadata`.
261
- #[ allow( nonstandard_style, unused_lifetimes) ]
262
- pub mod query_keys {
263
- use super :: * ;
264
-
265
- $( pub type $name<' tcx> = $( $K) * ; ) *
266
- }
267
- #[ allow( nonstandard_style, unused_lifetimes) ]
268
- pub mod query_keys_local {
269
- use super :: * ;
270
-
271
- $( pub type $name<' tcx> = local_key_if_separate_extern!( [ $( $modifiers) * ] $( $K) * ) ; ) *
272
- }
273
- #[ allow( nonstandard_style, unused_lifetimes) ]
274
- pub mod query_values {
275
- use super :: * ;
255
+ #[ allow( unused_lifetimes) ]
256
+ pub mod queries {
257
+ $( pub mod $name {
258
+ use super :: super :: * ;
276
259
277
- $ ( pub type $name <' tcx> = $V ; ) *
278
- }
260
+ pub type Key <' tcx> = $( $K ) * ;
261
+ pub type Value < ' tcx> = $V ;
279
262
280
- /// This module specifies the type returned from query providers and the type used for
281
- /// decoding. For regular queries this is the declared returned type `V`, but
282
- /// `arena_cache` will use `<V as Deref>::Target` instead.
283
- #[ allow( nonstandard_style, unused_lifetimes) ]
284
- pub mod query_provided {
285
- use super :: * ;
263
+ pub type LocalKey <' tcx> = local_key_if_separate_extern!( [ $( $modifiers) * ] $( $K) * ) ;
286
264
287
- $(
288
- pub type $name<' tcx> = query_if_arena!( [ $( $modifiers) * ] ( <$V as Deref >:: Target ) ( $V) ) ;
289
- ) *
290
- }
291
-
292
- /// This module has a function per query which takes a `query_provided` value and coverts
293
- /// it to a regular `V` value by allocating it on an arena if the query has the
294
- /// `arena_cache` modifier. This will happen when computing the query using a provider or
295
- /// decoding a stored result.
296
- #[ allow( nonstandard_style, unused_lifetimes) ]
297
- pub mod query_provided_to_value {
298
- use super :: * ;
265
+ /// This type alias specifies the type returned from query providers and the type
266
+ /// used for decoding. For regular queries this is the declared returned type `V`,
267
+ /// but `arena_cache` will use `<V as Deref>::Target` instead.
268
+ pub type ProvidedValue <' tcx> = query_if_arena!(
269
+ [ $( $modifiers) * ]
270
+ ( <$V as Deref >:: Target )
271
+ ( $V)
272
+ ) ;
299
273
300
- $(
274
+ /// This function takes `ProvidedValue` and coverts it to an erased `Value` by
275
+ /// allocating it on an arena if the query has the `arena_cache` modifier. The
276
+ /// value is then erased and returned. This will happen when computing the query
277
+ /// using a provider or decoding a stored result.
301
278
#[ inline( always) ]
302
- pub fn $name <' tcx>(
279
+ pub fn provided_to_erased <' tcx>(
303
280
_tcx: TyCtxt <' tcx>,
304
- value: query_provided :: $name <' tcx>,
305
- ) -> Erase <query_values :: $name <' tcx>> {
281
+ value: ProvidedValue <' tcx>,
282
+ ) -> Erase <Value <' tcx>> {
306
283
erase( query_if_arena!( [ $( $modifiers) * ]
307
284
{
308
- if mem:: needs_drop:: <query_provided :: $name <' tcx>>( ) {
285
+ if mem:: needs_drop:: <ProvidedValue <' tcx>>( ) {
309
286
& * _tcx. query_system. arenas. $name. alloc( value)
310
287
} else {
311
288
& * _tcx. arena. dropless. alloc( value)
@@ -314,47 +291,41 @@ macro_rules! define_callbacks {
314
291
( value)
315
292
) )
316
293
}
317
- ) *
318
- }
319
- #[ allow( nonstandard_style, unused_lifetimes) ]
320
- pub mod query_storage {
321
- use super :: * ;
322
294
323
- $(
324
- pub type $name<' tcx> = <<$( $K) * as Key >:: CacheSelector as CacheSelector <' tcx, Erase <$V>>>:: Cache ;
325
- ) *
295
+ pub type Storage <' tcx> = <
296
+ <$( $K) * as keys:: Key >:: CacheSelector as CacheSelector <' tcx, Erase <$V>>
297
+ >:: Cache ;
298
+
299
+ // Ensure that keys grow no larger than 64 bytes
300
+ #[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
301
+ const _: ( ) = {
302
+ if mem:: size_of:: <Key <' static >>( ) > 64 {
303
+ panic!( "{}" , concat!(
304
+ "the query `" ,
305
+ stringify!( $name) ,
306
+ "` has a key type `" ,
307
+ stringify!( $( $K) * ) ,
308
+ "` that is too large"
309
+ ) ) ;
310
+ }
311
+ } ;
312
+
313
+ // Ensure that values grow no larger than 64 bytes
314
+ #[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
315
+ const _: ( ) = {
316
+ if mem:: size_of:: <Value <' static >>( ) > 64 {
317
+ panic!( "{}" , concat!(
318
+ "the query `" ,
319
+ stringify!( $name) ,
320
+ "` has a value type `" ,
321
+ stringify!( $V) ,
322
+ "` that is too large"
323
+ ) ) ;
324
+ }
325
+ } ;
326
+ } ) *
326
327
}
327
328
328
- $(
329
- // Ensure that keys grow no larger than 64 bytes
330
- #[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
331
- const _: ( ) = {
332
- if mem:: size_of:: <query_keys:: $name<' static >>( ) > 64 {
333
- panic!( "{}" , concat!(
334
- "the query `" ,
335
- stringify!( $name) ,
336
- "` has a key type `" ,
337
- stringify!( $( $K) * ) ,
338
- "` that is too large"
339
- ) ) ;
340
- }
341
- } ;
342
-
343
- // Ensure that values grow no larger than 64 bytes
344
- #[ cfg( all( target_arch = "x86_64" , target_pointer_width = "64" ) ) ]
345
- const _: ( ) = {
346
- if mem:: size_of:: <query_values:: $name<' static >>( ) > 64 {
347
- panic!( "{}" , concat!(
348
- "the query `" ,
349
- stringify!( $name) ,
350
- "` has a value type `" ,
351
- stringify!( $V) ,
352
- "` that is too large"
353
- ) ) ;
354
- }
355
- } ;
356
- ) *
357
-
358
329
pub struct QueryArenas <' tcx> {
359
330
$( $( #[ $attr] ) * pub $name: query_if_arena!( [ $( $modifiers) * ]
360
331
( WorkerLocal <TypedArena <<$V as Deref >:: Target >>)
@@ -375,7 +346,7 @@ macro_rules! define_callbacks {
375
346
376
347
#[ derive( Default ) ]
377
348
pub struct QueryCaches <' tcx> {
378
- $( $( #[ $attr] ) * pub $name: query_storage :: $name<' tcx>, ) *
349
+ $( $( #[ $attr] ) * pub $name: queries :: $name:: Storage <' tcx>, ) *
379
350
}
380
351
381
352
impl <' tcx> TyCtxtEnsure <' tcx> {
@@ -433,7 +404,7 @@ macro_rules! define_callbacks {
433
404
434
405
pub struct DynamicQueries <' tcx> {
435
406
$(
436
- pub $name: DynamicQuery <' tcx, query_storage :: $name<' tcx>>,
407
+ pub $name: DynamicQuery <' tcx, queries :: $name:: Storage <' tcx>>,
437
408
) *
438
409
}
439
410
@@ -447,8 +418,8 @@ macro_rules! define_callbacks {
447
418
pub struct Providers {
448
419
$( pub $name: for <' tcx> fn (
449
420
TyCtxt <' tcx>,
450
- query_keys_local :: $name<' tcx>,
451
- ) -> query_provided :: $name<' tcx>, ) *
421
+ queries :: $name:: LocalKey <' tcx>,
422
+ ) -> queries :: $name:: ProvidedValue <' tcx>, ) *
452
423
}
453
424
454
425
pub struct ExternProviders {
@@ -493,7 +464,7 @@ macro_rules! define_callbacks {
493
464
$( pub $name: for <' tcx> fn (
494
465
TyCtxt <' tcx>,
495
466
Span ,
496
- query_keys :: $name<' tcx>,
467
+ queries :: $name:: Key <' tcx>,
497
468
QueryMode ,
498
469
) -> Option <Erase <$V>>, ) *
499
470
}
@@ -517,11 +488,11 @@ macro_rules! define_feedable {
517
488
$( impl <' tcx, K : IntoQueryParam <$( $K) * > + Copy > TyCtxtFeed <' tcx, K > {
518
489
$( #[ $attr] ) *
519
490
#[ inline( always) ]
520
- pub fn $name( self , value: query_provided :: $name<' tcx>) {
491
+ pub fn $name( self , value: queries :: $name:: ProvidedValue <' tcx>) {
521
492
let key = self . key( ) . into_query_param( ) ;
522
493
523
494
let tcx = self . tcx;
524
- let erased = query_provided_to_value :: $name( tcx, value) ;
495
+ let erased = queries :: $name:: provided_to_erased ( tcx, value) ;
525
496
let value = restore:: <$V>( erased) ;
526
497
let cache = & tcx. query_system. caches. $name;
527
498
@@ -533,12 +504,20 @@ macro_rules! define_feedable {
533
504
let ( value_hash, old_hash) : ( Fingerprint , Fingerprint ) = tcx. with_stable_hashing_context( |mut hcx|
534
505
( hasher( & mut hcx, & value) , hasher( & mut hcx, & old) )
535
506
) ;
536
- assert_eq!(
537
- old_hash, value_hash,
538
- "Trying to feed an already recorded value for query {} key={key:?}:\n old value: {old:?}\n new value: {value:?}" ,
539
- stringify!( $name) ,
540
- )
507
+ if old_hash != value_hash {
508
+ // We have an inconsistency. This can happen if one of the two
509
+ // results is tainted by errors. In this case, delay a bug to
510
+ // ensure compilation is doomed, and keep the `old` value.
511
+ tcx. sess. delay_span_bug( DUMMY_SP , format!(
512
+ "Trying to feed an already recorded value for query {} key={key:?}:\n \
513
+ old value: {old:?}\n new value: {value:?}",
514
+ stringify!( $name) ,
515
+ ) ) ;
516
+ }
541
517
} else {
518
+ // The query is `no_hash`, so we have no way to perform a sanity check.
519
+ // If feeding the same value multiple times needs to be supported,
520
+ // the query should not be marked `no_hash`.
542
521
bug!(
543
522
"Trying to feed an already recorded value for query {} key={key:?}:\n old value: {old:?}\n new value: {value:?}" ,
544
523
stringify!( $name) ,
0 commit comments