@@ -331,7 +331,7 @@ macro_rules! define_queries {
331331 }
332332 } ) *
333333
334- #[ allow( non_upper_case_globals ) ]
334+ #[ allow( nonstandard_style ) ]
335335 pub mod query_callbacks {
336336 use super :: * ;
337337 use rustc_middle:: dep_graph:: DepNode ;
@@ -341,74 +341,83 @@ macro_rules! define_queries {
341341 use rustc_query_system:: dep_graph:: FingerprintStyle ;
342342
343343 // We use this for most things when incr. comp. is turned off.
344- pub const Null : DepKindStruct = DepKindStruct {
345- is_anon: false ,
346- is_eval_always: false ,
347-
348- fingerprint_style: || FingerprintStyle :: Unit ,
349- force_from_dep_node: |_, dep_node| bug!( "force_from_dep_node: encountered {:?}" , dep_node) ,
350- try_load_from_on_disk_cache: |_, _| { } ,
351- } ;
352-
353- pub const TraitSelect : DepKindStruct = DepKindStruct {
354- is_anon: true ,
355- is_eval_always: false ,
344+ pub fn Null ( ) -> DepKindStruct {
345+ DepKindStruct {
346+ is_anon: false ,
347+ is_eval_always: false ,
348+ fingerprint_style: FingerprintStyle :: Unit ,
349+ force_from_dep_node: Some ( |_, dep_node| bug!( "force_from_dep_node: encountered {:?}" , dep_node) ) ,
350+ try_load_from_on_disk_cache: None ,
351+ }
352+ }
356353
357- fingerprint_style: || FingerprintStyle :: Unit ,
358- force_from_dep_node: |_, _| false ,
359- try_load_from_on_disk_cache: |_, _| { } ,
360- } ;
354+ pub fn TraitSelect ( ) -> DepKindStruct {
355+ DepKindStruct {
356+ is_anon: true ,
357+ is_eval_always: false ,
358+ fingerprint_style: FingerprintStyle :: Unit ,
359+ force_from_dep_node: None ,
360+ try_load_from_on_disk_cache: None ,
361+ }
362+ }
361363
362- pub const CompileCodegenUnit : DepKindStruct = DepKindStruct {
363- is_anon: false ,
364- is_eval_always: false ,
364+ pub fn CompileCodegenUnit ( ) -> DepKindStruct {
365+ DepKindStruct {
366+ is_anon: false ,
367+ is_eval_always: false ,
368+ fingerprint_style: FingerprintStyle :: Opaque ,
369+ force_from_dep_node: None ,
370+ try_load_from_on_disk_cache: None ,
371+ }
372+ }
365373
366- fingerprint_style: || FingerprintStyle :: Opaque ,
367- force_from_dep_node: |_, _| false ,
368- try_load_from_on_disk_cache: |_, _| { } ,
369- } ;
374+ pub fn CompileMonoItem ( ) -> DepKindStruct {
375+ DepKindStruct {
376+ is_anon: false ,
377+ is_eval_always: false ,
378+ fingerprint_style: FingerprintStyle :: Opaque ,
379+ force_from_dep_node: None ,
380+ try_load_from_on_disk_cache: None ,
381+ }
382+ }
370383
371- pub const CompileMonoItem : DepKindStruct = DepKindStruct {
372- is_anon: false ,
373- is_eval_always: false ,
384+ $ ( pub fn $name ( ) -> DepKindStruct {
385+ let is_anon = is_anon! ( [ $ ( $modifiers ) * ] ) ;
386+ let is_eval_always = is_eval_always! ( [ $ ( $modifiers ) * ] ) ;
374387
375- fingerprint_style: || FingerprintStyle :: Opaque ,
376- force_from_dep_node: |_, _| false ,
377- try_load_from_on_disk_cache: |_, _| { } ,
378- } ;
388+ let fingerprint_style =
389+ <query_keys:: $name<' _> as DepNodeParams <TyCtxt <' _>>>:: fingerprint_style( ) ;
379390
380- $( pub const $name: DepKindStruct = {
381- const is_anon: bool = is_anon!( [ $( $modifiers) * ] ) ;
382- const is_eval_always: bool = is_eval_always!( [ $( $modifiers) * ] ) ;
391+ if is_anon || !fingerprint_style. reconstructible( ) {
392+ return DepKindStruct {
393+ is_anon,
394+ is_eval_always,
395+ fingerprint_style,
396+ force_from_dep_node: None ,
397+ try_load_from_on_disk_cache: None ,
398+ }
399+ }
383400
384401 #[ inline( always) ]
385- fn fingerprint_style( ) -> FingerprintStyle {
386- <query_keys:: $name<' _> as DepNodeParams <TyCtxt <' _>>>
387- :: fingerprint_style( )
402+ fn recover<' tcx>( tcx: TyCtxt <' tcx>, dep_node: DepNode ) -> Option <query_keys:: $name<' tcx>> {
403+ <query_keys:: $name<' _> as DepNodeParams <TyCtxt <' _>>>:: recover( tcx, & dep_node)
388404 }
389405
390- fn recover<' tcx>( tcx: TyCtxt <' tcx>, dep_node: & DepNode ) -> Option <query_keys:: $name<' tcx>> {
391- <query_keys:: $name<' _> as DepNodeParams <TyCtxt <' _>>>:: recover( tcx, dep_node)
406+ fn force_from_dep_node( tcx: TyCtxt <' _>, dep_node: DepNode ) -> bool {
407+ if let Some ( key) = recover( tcx, dep_node) {
408+ let tcx = QueryCtxt :: from_tcx( tcx) ;
409+ force_query:: <queries:: $name<' _>, _>( tcx, key, dep_node) ;
410+ true
411+ } else {
412+ false
413+ }
392414 }
393415
394- fn force_from_dep_node( tcx: TyCtxt <' _>, dep_node: & DepNode ) -> bool {
395- let tcx = QueryCtxt :: from_tcx( tcx) ;
396- force_query:: <queries:: $name<' _>, _>( tcx, dep_node)
397- }
416+ fn try_load_from_on_disk_cache( tcx: TyCtxt <' _>, dep_node: DepNode ) {
417+ debug_assert!( tcx. dep_graph. is_green( & dep_node) ) ;
398418
399- fn try_load_from_on_disk_cache ( tcx: TyCtxt < ' _> , dep_node: & DepNode ) {
419+ let key = recover ( tcx, dep_node) . unwrap_or_else ( || panic! ( "Failed to recover key for {:?} with hash {}" , dep_node , dep_node . hash ) ) ;
400420 let tcx = QueryCtxt :: from_tcx( tcx) ;
401- if is_anon {
402- return
403- }
404-
405- if !fingerprint_style( ) . reconstructible( ) {
406- return
407- }
408-
409- debug_assert!( tcx. dep_graph. is_green( dep_node) ) ;
410-
411- let key = recover( * tcx, dep_node) . unwrap_or_else( || panic!( "Failed to recover key for {:?} with hash {}" , dep_node, dep_node. hash) ) ;
412421 if queries:: $name:: cache_on_disk( tcx, & key, None ) {
413422 let _ = tcx. $name( key) ;
414423 }
@@ -418,13 +427,15 @@ macro_rules! define_queries {
418427 is_anon,
419428 is_eval_always,
420429 fingerprint_style,
421- force_from_dep_node,
422- try_load_from_on_disk_cache,
430+ force_from_dep_node: Some ( force_from_dep_node ) ,
431+ try_load_from_on_disk_cache: Some ( try_load_from_on_disk_cache ) ,
423432 }
424- } ; ) *
433+ } ) *
425434 }
426435
427- pub static QUERY_CALLBACKS : & [ DepKindStruct ] = & make_dep_kind_array!( query_callbacks) ;
436+ pub fn query_callbacks<' tcx>( arena: & ' tcx Arena <' tcx>) -> & ' tcx [ DepKindStruct ] {
437+ arena. alloc_from_iter( make_dep_kind_array!( query_callbacks) )
438+ }
428439 }
429440}
430441
0 commit comments