mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
Rollup merge of #124252 - michaelwoerister:better-forbidden-read-ice, r=oli-obk
Improve ICE message for forbidden dep-graph reads. The new message mentions the main context that the ICE might occur in and it mentions the query/dep-node that is being read. cc https://github.com/rust-lang/rust/pull/123781, where this would have been helpful.
This commit is contained in:
commit
a60ccc1876
@ -459,7 +459,8 @@ impl<D: Deps> DepGraph<D> {
|
|||||||
}
|
}
|
||||||
TaskDepsRef::Ignore => return,
|
TaskDepsRef::Ignore => return,
|
||||||
TaskDepsRef::Forbid => {
|
TaskDepsRef::Forbid => {
|
||||||
panic!("Illegal read of: {dep_node_index:?}")
|
// Reading is forbidden in this context. ICE with a useful error message.
|
||||||
|
panic_on_forbidden_read(data, dep_node_index)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let task_deps = &mut *task_deps;
|
let task_deps = &mut *task_deps;
|
||||||
@ -1366,3 +1367,45 @@ pub(crate) fn print_markframe_trace<D: Deps>(graph: &DepGraph<D>, frame: Option<
|
|||||||
|
|
||||||
eprintln!("end of try_mark_green dep node stack");
|
eprintln!("end of try_mark_green dep node stack");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cold]
|
||||||
|
#[inline(never)]
|
||||||
|
fn panic_on_forbidden_read<D: Deps>(data: &DepGraphData<D>, dep_node_index: DepNodeIndex) -> ! {
|
||||||
|
// We have to do an expensive reverse-lookup of the DepNode that
|
||||||
|
// corresponds to `dep_node_index`, but that's OK since we are about
|
||||||
|
// to ICE anyway.
|
||||||
|
let mut dep_node = None;
|
||||||
|
|
||||||
|
// First try to find the dep node among those that already existed in the
|
||||||
|
// previous session
|
||||||
|
for (prev_index, index) in data.current.prev_index_to_index.lock().iter_enumerated() {
|
||||||
|
if index == &Some(dep_node_index) {
|
||||||
|
dep_node = Some(data.previous.index_to_node(prev_index));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if dep_node.is_none() {
|
||||||
|
// Try to find it among the new nodes
|
||||||
|
for shard in data.current.new_node_to_index.lock_shards() {
|
||||||
|
if let Some((node, _)) = shard.iter().find(|(_, index)| **index == dep_node_index) {
|
||||||
|
dep_node = Some(*node);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let dep_node = dep_node.map_or_else(
|
||||||
|
|| format!("with index {:?}", dep_node_index),
|
||||||
|
|dep_node| format!("`{:?}`", dep_node),
|
||||||
|
);
|
||||||
|
|
||||||
|
panic!(
|
||||||
|
"Error: trying to record dependency on DepNode {dep_node} in a \
|
||||||
|
context that does not allow it (e.g. during query deserialization). \
|
||||||
|
The most common case of recording a dependency on a DepNode `foo` is \
|
||||||
|
when the correspondng query `foo` is invoked. Invoking queries is not \
|
||||||
|
allowed as part of loading something from the incremental on-disk cache. \
|
||||||
|
See <https://github.com/rust-lang/rust/pull/91919>."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user