Move the codegen_unit
debug assert from rustc_query_system
to query_impl
This allows removing a function from the `DepKind` trait.
This commit is contained in:
parent
ccc8d000f2
commit
00cde6d4b9
3 changed files with 18 additions and 24 deletions
|
@ -27,10 +27,6 @@ impl rustc_query_system::dep_graph::DepKind for DepKind {
|
||||||
const NULL: Self = DepKind::Null;
|
const NULL: Self = DepKind::Null;
|
||||||
const RED: Self = DepKind::Red;
|
const RED: Self = DepKind::Red;
|
||||||
|
|
||||||
fn is_codegen_unit_query(self) -> bool {
|
|
||||||
self == DepKind::codegen_unit
|
|
||||||
}
|
|
||||||
|
|
||||||
fn debug_node(node: &DepNode, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn debug_node(node: &DepNode, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{:?}(", node.kind)?;
|
write!(f, "{:?}(", node.kind)?;
|
||||||
|
|
||||||
|
|
|
@ -380,6 +380,24 @@ where
|
||||||
Q::Key: DepNodeParams<TyCtxt<'tcx>>,
|
Q::Key: DepNodeParams<TyCtxt<'tcx>>,
|
||||||
Q::Value: Value<TyCtxt<'tcx>>,
|
Q::Value: Value<TyCtxt<'tcx>>,
|
||||||
{
|
{
|
||||||
|
// We must avoid ever having to call `force_from_dep_node()` for a
|
||||||
|
// `DepNode::codegen_unit`:
|
||||||
|
// Since we cannot reconstruct the query key of a `DepNode::codegen_unit`, we
|
||||||
|
// would always end up having to evaluate the first caller of the
|
||||||
|
// `codegen_unit` query that *is* reconstructible. This might very well be
|
||||||
|
// the `compile_codegen_unit` query, thus re-codegenning the whole CGU just
|
||||||
|
// to re-trigger calling the `codegen_unit` query with the right key. At
|
||||||
|
// that point we would already have re-done all the work we are trying to
|
||||||
|
// avoid doing in the first place.
|
||||||
|
// The solution is simple: Just explicitly call the `codegen_unit` query for
|
||||||
|
// each CGU, right after partitioning. This way `try_mark_green` will always
|
||||||
|
// hit the cache instead of having to go through `force_from_dep_node`.
|
||||||
|
// This assertion makes sure, we actually keep applying the solution above.
|
||||||
|
debug_assert!(
|
||||||
|
dep_node.kind != DepKind::codegen_unit,
|
||||||
|
"calling force_from_dep_node() on DepKind::codegen_unit"
|
||||||
|
);
|
||||||
|
|
||||||
if let Some(key) = Q::Key::recover(tcx, &dep_node) {
|
if let Some(key) = Q::Key::recover(tcx, &dep_node) {
|
||||||
#[cfg(debug_assertions)]
|
#[cfg(debug_assertions)]
|
||||||
let _guard = tracing::span!(tracing::Level::TRACE, stringify!($name), ?key).entered();
|
let _guard = tracing::span!(tracing::Level::TRACE, stringify!($name), ?key).entered();
|
||||||
|
|
|
@ -55,24 +55,6 @@ pub trait DepContext: Copy {
|
||||||
fn try_force_from_dep_node(self, dep_node: DepNode<Self::DepKind>) -> bool {
|
fn try_force_from_dep_node(self, dep_node: DepNode<Self::DepKind>) -> bool {
|
||||||
debug!("try_force_from_dep_node({:?}) --- trying to force", dep_node);
|
debug!("try_force_from_dep_node({:?}) --- trying to force", dep_node);
|
||||||
|
|
||||||
// We must avoid ever having to call `force_from_dep_node()` for a
|
|
||||||
// `DepNode::codegen_unit`:
|
|
||||||
// Since we cannot reconstruct the query key of a `DepNode::codegen_unit`, we
|
|
||||||
// would always end up having to evaluate the first caller of the
|
|
||||||
// `codegen_unit` query that *is* reconstructible. This might very well be
|
|
||||||
// the `compile_codegen_unit` query, thus re-codegenning the whole CGU just
|
|
||||||
// to re-trigger calling the `codegen_unit` query with the right key. At
|
|
||||||
// that point we would already have re-done all the work we are trying to
|
|
||||||
// avoid doing in the first place.
|
|
||||||
// The solution is simple: Just explicitly call the `codegen_unit` query for
|
|
||||||
// each CGU, right after partitioning. This way `try_mark_green` will always
|
|
||||||
// hit the cache instead of having to go through `force_from_dep_node`.
|
|
||||||
// This assertion makes sure, we actually keep applying the solution above.
|
|
||||||
debug_assert!(
|
|
||||||
!dep_node.kind.is_codegen_unit_query(),
|
|
||||||
"calling force_from_dep_node() on DepKind::codegen_unit"
|
|
||||||
);
|
|
||||||
|
|
||||||
let cb = self.dep_kind_info(dep_node.kind);
|
let cb = self.dep_kind_info(dep_node.kind);
|
||||||
if let Some(f) = cb.force_from_dep_node {
|
if let Some(f) = cb.force_from_dep_node {
|
||||||
f(self, dep_node);
|
f(self, dep_node);
|
||||||
|
@ -136,8 +118,6 @@ pub trait DepKind: Copy + fmt::Debug + Eq + Hash + Send + Encodable<FileEncoder>
|
||||||
/// DepKind to use to create the initial forever-red node.
|
/// DepKind to use to create the initial forever-red node.
|
||||||
const RED: Self;
|
const RED: Self;
|
||||||
|
|
||||||
fn is_codegen_unit_query(self) -> bool;
|
|
||||||
|
|
||||||
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
||||||
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue