]>
Commit | Line | Data |
---|---|---|
ba9703b0 XL |
1 | use crate::ich::StableHashingContext; |
2 | use crate::ty::query::try_load_from_on_disk_cache; | |
3 | use crate::ty::{self, TyCtxt}; | |
4 | use rustc_data_structures::profiling::SelfProfilerRef; | |
5 | use rustc_data_structures::sync::Lock; | |
6 | use rustc_data_structures::thin_vec::ThinVec; | |
7 | use rustc_errors::Diagnostic; | |
f9f354fc | 8 | use rustc_hir::def_id::LocalDefId; |
ba9703b0 XL |
9 | |
10 | mod dep_node; | |
11 | ||
12 | pub(crate) use rustc_query_system::dep_graph::DepNodeParams; | |
13 | pub use rustc_query_system::dep_graph::{ | |
14 | debug, hash_result, DepContext, DepNodeColor, DepNodeIndex, SerializedDepNodeIndex, | |
f9f354fc | 15 | WorkProduct, WorkProductId, |
ba9703b0 XL |
16 | }; |
17 | ||
18 | pub use dep_node::{label_strs, DepConstructor, DepKind, DepNode, DepNodeExt}; | |
19 | ||
20 | pub type DepGraph = rustc_query_system::dep_graph::DepGraph<DepKind>; | |
21 | pub type TaskDeps = rustc_query_system::dep_graph::TaskDeps<DepKind>; | |
22 | pub type DepGraphQuery = rustc_query_system::dep_graph::DepGraphQuery<DepKind>; | |
23 | pub type PreviousDepGraph = rustc_query_system::dep_graph::PreviousDepGraph<DepKind>; | |
24 | pub type SerializedDepGraph = rustc_query_system::dep_graph::SerializedDepGraph<DepKind>; | |
25 | ||
26 | impl rustc_query_system::dep_graph::DepKind for DepKind { | |
27 | const NULL: Self = DepKind::Null; | |
28 | ||
29 | fn is_eval_always(&self) -> bool { | |
30 | DepKind::is_eval_always(self) | |
31 | } | |
32 | ||
33 | fn has_params(&self) -> bool { | |
34 | DepKind::has_params(self) | |
35 | } | |
36 | ||
37 | fn debug_node(node: &DepNode, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | |
38 | write!(f, "{:?}", node.kind)?; | |
39 | ||
40 | if !node.kind.has_params() && !node.kind.is_anon() { | |
41 | return Ok(()); | |
42 | } | |
43 | ||
44 | write!(f, "(")?; | |
45 | ||
46 | ty::tls::with_opt(|opt_tcx| { | |
47 | if let Some(tcx) = opt_tcx { | |
48 | if let Some(def_id) = node.extract_def_id(tcx) { | |
49 | write!(f, "{}", tcx.def_path_debug_str(def_id))?; | |
50 | } else if let Some(ref s) = tcx.dep_graph.dep_node_debug_str(*node) { | |
51 | write!(f, "{}", s)?; | |
52 | } else { | |
53 | write!(f, "{}", node.hash)?; | |
54 | } | |
55 | } else { | |
56 | write!(f, "{}", node.hash)?; | |
57 | } | |
58 | Ok(()) | |
59 | })?; | |
60 | ||
61 | write!(f, ")") | |
62 | } | |
63 | ||
64 | fn with_deps<OP, R>(task_deps: Option<&Lock<TaskDeps>>, op: OP) -> R | |
65 | where | |
66 | OP: FnOnce() -> R, | |
67 | { | |
68 | ty::tls::with_context(|icx| { | |
69 | let icx = ty::tls::ImplicitCtxt { task_deps, ..icx.clone() }; | |
70 | ||
71 | ty::tls::enter_context(&icx, |_| op()) | |
72 | }) | |
73 | } | |
74 | ||
f9f354fc | 75 | fn read_deps<OP>(op: OP) |
ba9703b0 | 76 | where |
f9f354fc | 77 | OP: for<'a> FnOnce(Option<&'a Lock<TaskDeps>>), |
ba9703b0 XL |
78 | { |
79 | ty::tls::with_context_opt(|icx| { | |
80 | let icx = if let Some(icx) = icx { icx } else { return }; | |
81 | op(icx.task_deps) | |
82 | }) | |
83 | } | |
84 | ||
85 | fn can_reconstruct_query_key(&self) -> bool { | |
86 | DepKind::can_reconstruct_query_key(self) | |
87 | } | |
88 | } | |
89 | ||
90 | impl<'tcx> DepContext for TyCtxt<'tcx> { | |
91 | type DepKind = DepKind; | |
92 | type StableHashingContext = StableHashingContext<'tcx>; | |
93 | ||
94 | fn create_stable_hashing_context(&self) -> Self::StableHashingContext { | |
95 | TyCtxt::create_stable_hashing_context(*self) | |
96 | } | |
97 | ||
98 | fn debug_dep_tasks(&self) -> bool { | |
99 | self.sess.opts.debugging_opts.dep_tasks | |
100 | } | |
f9f354fc XL |
101 | fn debug_dep_node(&self) -> bool { |
102 | self.sess.opts.debugging_opts.incremental_info | |
103 | || self.sess.opts.debugging_opts.query_dep_graph | |
104 | } | |
ba9703b0 XL |
105 | |
106 | fn try_force_from_dep_node(&self, dep_node: &DepNode) -> bool { | |
107 | // FIXME: This match is just a workaround for incremental bugs and should | |
108 | // be removed. https://github.com/rust-lang/rust/issues/62649 is one such | |
109 | // bug that must be fixed before removing this. | |
110 | match dep_node.kind { | |
111 | DepKind::hir_owner | DepKind::hir_owner_nodes | DepKind::CrateMetadata => { | |
112 | if let Some(def_id) = dep_node.extract_def_id(*self) { | |
f9f354fc | 113 | if def_id_corresponds_to_hir_dep_node(*self, def_id.expect_local()) { |
ba9703b0 XL |
114 | if dep_node.kind == DepKind::CrateMetadata { |
115 | // The `DefPath` has corresponding node, | |
116 | // and that node should have been marked | |
117 | // either red or green in `data.colors`. | |
118 | bug!( | |
119 | "DepNode {:?} should have been \ | |
120 | pre-marked as red or green but wasn't.", | |
121 | dep_node | |
122 | ); | |
123 | } | |
124 | } else { | |
125 | // This `DefPath` does not have a | |
126 | // corresponding `DepNode` (e.g. a | |
127 | // struct field), and the ` DefPath` | |
128 | // collided with the `DefPath` of a | |
129 | // proper item that existed in the | |
130 | // previous compilation session. | |
131 | // | |
132 | // Since the given `DefPath` does not | |
133 | // denote the item that previously | |
134 | // existed, we just fail to mark green. | |
135 | return false; | |
136 | } | |
137 | } else { | |
138 | // If the node does not exist anymore, we | |
139 | // just fail to mark green. | |
140 | return false; | |
141 | } | |
142 | } | |
143 | _ => { | |
144 | // For other kinds of nodes it's OK to be | |
145 | // forced. | |
146 | } | |
147 | } | |
148 | ||
149 | debug!("try_force_from_dep_node({:?}) --- trying to force", dep_node); | |
150 | ty::query::force_from_dep_node(*self, dep_node) | |
151 | } | |
152 | ||
153 | fn has_errors_or_delayed_span_bugs(&self) -> bool { | |
154 | self.sess.has_errors_or_delayed_span_bugs() | |
155 | } | |
156 | ||
157 | fn diagnostic(&self) -> &rustc_errors::Handler { | |
158 | self.sess.diagnostic() | |
159 | } | |
160 | ||
161 | // Interactions with on_disk_cache | |
162 | fn try_load_from_on_disk_cache(&self, dep_node: &DepNode) { | |
163 | try_load_from_on_disk_cache(*self, dep_node) | |
164 | } | |
165 | ||
166 | fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec<Diagnostic> { | |
167 | self.queries.on_disk_cache.load_diagnostics(*self, prev_dep_node_index) | |
168 | } | |
169 | ||
170 | fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec<Diagnostic>) { | |
171 | self.queries.on_disk_cache.store_diagnostics(dep_node_index, diagnostics) | |
172 | } | |
173 | ||
174 | fn store_diagnostics_for_anon_node( | |
175 | &self, | |
176 | dep_node_index: DepNodeIndex, | |
177 | diagnostics: ThinVec<Diagnostic>, | |
178 | ) { | |
179 | self.queries.on_disk_cache.store_diagnostics_for_anon_node(dep_node_index, diagnostics) | |
180 | } | |
181 | ||
182 | fn profiler(&self) -> &SelfProfilerRef { | |
183 | &self.prof | |
184 | } | |
185 | } | |
186 | ||
f9f354fc | 187 | fn def_id_corresponds_to_hir_dep_node(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { |
3dfed10e | 188 | let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); |
f9f354fc | 189 | def_id == hir_id.owner |
ba9703b0 | 190 | } |