@@ -3,7 +3,7 @@ use rustc_middle::dep_graph::{DepKindVTable, DepNodeKey, KeyFingerprintStyle};
33use rustc_middle:: query:: QueryCache ;
44
55use crate :: GetQueryVTable ;
6- use crate :: plumbing:: { force_from_dep_node_inner, try_load_from_on_disk_cache_inner } ;
6+ use crate :: plumbing:: { force_from_dep_node_inner, promote_from_disk_inner } ;
77
88/// [`DepKindVTable`] constructors for special dep kinds that aren't queries.
99#[ expect( non_snake_case, reason = "use non-snake case to avoid collision with query names" ) ]
@@ -16,10 +16,10 @@ mod non_query {
1616 is_anon : false ,
1717 is_eval_always : false ,
1818 key_fingerprint_style : KeyFingerprintStyle :: Unit ,
19- force_from_dep_node : Some ( |_, dep_node, _| {
19+ force_from_dep_node_fn : Some ( |_, dep_node, _| {
2020 bug ! ( "force_from_dep_node: encountered {dep_node:?}" )
2121 } ) ,
22- try_load_from_on_disk_cache : None ,
22+ promote_from_disk_fn : None ,
2323 }
2424 }
2525
@@ -29,10 +29,10 @@ mod non_query {
2929 is_anon : false ,
3030 is_eval_always : false ,
3131 key_fingerprint_style : KeyFingerprintStyle :: Unit ,
32- force_from_dep_node : Some ( |_, dep_node, _| {
32+ force_from_dep_node_fn : Some ( |_, dep_node, _| {
3333 bug ! ( "force_from_dep_node: encountered {dep_node:?}" )
3434 } ) ,
35- try_load_from_on_disk_cache : None ,
35+ promote_from_disk_fn : None ,
3636 }
3737 }
3838
@@ -41,11 +41,11 @@ mod non_query {
4141 is_anon : false ,
4242 is_eval_always : false ,
4343 key_fingerprint_style : KeyFingerprintStyle :: Unit ,
44- force_from_dep_node : Some ( |tcx, _, prev_index| {
44+ force_from_dep_node_fn : Some ( |tcx, _, prev_index| {
4545 tcx. dep_graph . force_diagnostic_node ( tcx, prev_index) ;
4646 true
4747 } ) ,
48- try_load_from_on_disk_cache : None ,
48+ promote_from_disk_fn : None ,
4949 }
5050 }
5151
@@ -54,8 +54,8 @@ mod non_query {
5454 is_anon : true ,
5555 is_eval_always : false ,
5656 key_fingerprint_style : KeyFingerprintStyle :: Opaque ,
57- force_from_dep_node : Some ( |_, _, _| bug ! ( "cannot force an anon node" ) ) ,
58- try_load_from_on_disk_cache : None ,
57+ force_from_dep_node_fn : Some ( |_, _, _| bug ! ( "cannot force an anon node" ) ) ,
58+ promote_from_disk_fn : None ,
5959 }
6060 }
6161
@@ -64,8 +64,8 @@ mod non_query {
6464 is_anon : true ,
6565 is_eval_always : false ,
6666 key_fingerprint_style : KeyFingerprintStyle :: Unit ,
67- force_from_dep_node : None ,
68- try_load_from_on_disk_cache : None ,
67+ force_from_dep_node_fn : None ,
68+ promote_from_disk_fn : None ,
6969 }
7070 }
7171
@@ -74,8 +74,8 @@ mod non_query {
7474 is_anon : false ,
7575 is_eval_always : false ,
7676 key_fingerprint_style : KeyFingerprintStyle :: Opaque ,
77- force_from_dep_node : None ,
78- try_load_from_on_disk_cache : None ,
77+ force_from_dep_node_fn : None ,
78+ promote_from_disk_fn : None ,
7979 }
8080 }
8181
@@ -84,8 +84,8 @@ mod non_query {
8484 is_anon : false ,
8585 is_eval_always : false ,
8686 key_fingerprint_style : KeyFingerprintStyle :: Opaque ,
87- force_from_dep_node : None ,
88- try_load_from_on_disk_cache : None ,
87+ force_from_dep_node_fn : None ,
88+ promote_from_disk_fn : None ,
8989 }
9090 }
9191
@@ -94,8 +94,8 @@ mod non_query {
9494 is_anon : false ,
9595 is_eval_always : false ,
9696 key_fingerprint_style : KeyFingerprintStyle :: Unit ,
97- force_from_dep_node : None ,
98- try_load_from_on_disk_cache : None ,
97+ force_from_dep_node_fn : None ,
98+ promote_from_disk_fn : None ,
9999 }
100100 }
101101}
@@ -104,6 +104,7 @@ mod non_query {
104104/// Called from macro-generated code for each query.
105105pub ( crate ) fn make_dep_kind_vtable_for_query < ' tcx , Q > (
106106 is_anon : bool ,
107+ is_cache_on_disk : bool ,
107108 is_eval_always : bool ,
108109) -> DepKindVTable < ' tcx >
109110where
@@ -115,26 +116,20 @@ where
115116 <Q :: Cache as QueryCache >:: Key :: key_fingerprint_style ( )
116117 } ;
117118
118- if is_anon || !key_fingerprint_style. reconstructible ( ) {
119- return DepKindVTable {
120- is_anon,
121- is_eval_always,
122- key_fingerprint_style,
123- force_from_dep_node : None ,
124- try_load_from_on_disk_cache : None ,
125- } ;
119+ // A query dep-node can only be forced or promoted if it can recover a key
120+ // from its key fingerprint.
121+ let can_recover = key_fingerprint_style. is_maybe_recoverable ( ) ;
122+ if is_anon {
123+ assert ! ( !can_recover) ;
126124 }
127125
128126 DepKindVTable {
129127 is_anon,
130128 is_eval_always,
131129 key_fingerprint_style,
132- force_from_dep_node : Some ( |tcx, dep_node, _| {
133- force_from_dep_node_inner ( Q :: query_vtable ( tcx) , tcx, dep_node)
134- } ) ,
135- try_load_from_on_disk_cache : Some ( |tcx, dep_node| {
136- try_load_from_on_disk_cache_inner ( Q :: query_vtable ( tcx) , tcx, dep_node)
137- } ) ,
130+ force_from_dep_node_fn : can_recover. then_some ( force_from_dep_node_inner :: < Q > ) ,
131+ promote_from_disk_fn : ( can_recover && is_cache_on_disk)
132+ . then_some ( promote_from_disk_inner :: < Q > ) ,
138133 }
139134}
140135
0 commit comments