summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_query_system/src/dep_graph/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_query_system/src/dep_graph/mod.rs')
-rw-r--r--compiler/rustc_query_system/src/dep_graph/mod.rs34
1 files changed, 29 insertions, 5 deletions
diff --git a/compiler/rustc_query_system/src/dep_graph/mod.rs b/compiler/rustc_query_system/src/dep_graph/mod.rs
index 6969f2dbe..40e713198 100644
--- a/compiler/rustc_query_system/src/dep_graph/mod.rs
+++ b/compiler/rustc_query_system/src/dep_graph/mod.rs
@@ -6,7 +6,8 @@ mod serialized;
pub use dep_node::{DepKindStruct, DepNode, DepNodeParams, WorkProductId};
pub use graph::{
- hash_result, DepGraph, DepNodeColor, DepNodeIndex, TaskDeps, TaskDepsRef, WorkProduct,
+ hash_result, DepGraph, DepGraphData, DepNodeColor, DepNodeIndex, TaskDeps, TaskDepsRef,
+ WorkProduct,
};
pub use query::DepGraphQuery;
pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex};
@@ -16,8 +17,10 @@ use rustc_data_structures::profiling::SelfProfilerRef;
use rustc_serialize::{opaque::FileEncoder, Encodable};
use rustc_session::Session;
-use std::fmt;
use std::hash::Hash;
+use std::{fmt, panic};
+
+use self::graph::{print_markframe_trace, MarkFrame};
pub trait DepContext: Copy {
type DepKind: self::DepKind;
@@ -52,11 +55,23 @@ pub trait DepContext: Copy {
}
/// Try to force a dep node to execute and see if it's green.
- #[instrument(skip(self), level = "debug")]
- fn try_force_from_dep_node(self, dep_node: DepNode<Self::DepKind>) -> bool {
+ #[inline]
+ #[instrument(skip(self, frame), level = "debug")]
+ fn try_force_from_dep_node(
+ self,
+ dep_node: DepNode<Self::DepKind>,
+ frame: Option<&MarkFrame<'_>>,
+ ) -> bool {
let cb = self.dep_kind_info(dep_node.kind);
if let Some(f) = cb.force_from_dep_node {
- f(self, dep_node);
+ if let Err(value) = panic::catch_unwind(panic::AssertUnwindSafe(|| {
+ f(self, dep_node);
+ })) {
+ if !value.is::<rustc_errors::FatalErrorMarker>() {
+ print_markframe_trace(self.dep_graph(), frame);
+ }
+ panic::resume_unwind(value)
+ }
true
} else {
false
@@ -88,6 +103,15 @@ impl<T: DepContext> HasDepContext for T {
}
}
+impl<T: HasDepContext, Q: Copy> HasDepContext for (T, Q) {
+ type DepKind = T::DepKind;
+ type DepContext = T::DepContext;
+
+ fn dep_context(&self) -> &Self::DepContext {
+ self.0.dep_context()
+ }
+}
+
/// Describes the contents of the fingerprint generated by a given query.
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum FingerprintStyle {