Merge pull request #4452 from Stypox/trace-borrow-tracker
Add tracing spans to borrow tracker functions
This commit is contained in:
commit
da4006571b
3 changed files with 62 additions and 1 deletions
|
|
@ -260,6 +260,7 @@ impl GlobalStateInner {
|
|||
kind: MemoryKind,
|
||||
machine: &MiriMachine<'_>,
|
||||
) -> AllocState {
|
||||
let _span = enter_trace_span!(borrow_tracker::new_allocation, ?id, ?alloc_size, ?kind);
|
||||
match self.borrow_tracker_method {
|
||||
BorrowTrackerMethod::StackedBorrows =>
|
||||
AllocState::StackedBorrows(Box::new(RefCell::new(Stacks::new_allocation(
|
||||
|
|
@ -280,6 +281,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
kind: RetagKind,
|
||||
val: &ImmTy<'tcx>,
|
||||
) -> InterpResult<'tcx, ImmTy<'tcx>> {
|
||||
let _span = enter_trace_span!(borrow_tracker::retag_ptr_value, ?kind, ?val.layout);
|
||||
let this = self.eval_context_mut();
|
||||
let method = this.machine.borrow_tracker.as_ref().unwrap().borrow().borrow_tracker_method;
|
||||
match method {
|
||||
|
|
@ -293,6 +295,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
kind: RetagKind,
|
||||
place: &PlaceTy<'tcx>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span = enter_trace_span!(borrow_tracker::retag_place_contents, ?kind, ?place);
|
||||
let this = self.eval_context_mut();
|
||||
let method = this.machine.borrow_tracker.as_ref().unwrap().borrow().borrow_tracker_method;
|
||||
match method {
|
||||
|
|
@ -302,6 +305,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
}
|
||||
|
||||
fn protect_place(&mut self, place: &MPlaceTy<'tcx>) -> InterpResult<'tcx, MPlaceTy<'tcx>> {
|
||||
let _span = enter_trace_span!(borrow_tracker::protect_place, ?place);
|
||||
let this = self.eval_context_mut();
|
||||
let method = this.machine.borrow_tracker.as_ref().unwrap().borrow().borrow_tracker_method;
|
||||
match method {
|
||||
|
|
@ -311,6 +315,8 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
}
|
||||
|
||||
fn expose_tag(&self, alloc_id: AllocId, tag: BorTag) -> InterpResult<'tcx> {
|
||||
let _span =
|
||||
enter_trace_span!(borrow_tracker::expose_tag, alloc_id = alloc_id.0, tag = tag.0);
|
||||
let this = self.eval_context_ref();
|
||||
let method = this.machine.borrow_tracker.as_ref().unwrap().borrow().borrow_tracker_method;
|
||||
match method {
|
||||
|
|
@ -354,6 +360,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
|||
&self,
|
||||
frame: &Frame<'tcx, Provenance, FrameExtra<'tcx>>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span = enter_trace_span!(borrow_tracker::on_stack_pop);
|
||||
let this = self.eval_context_ref();
|
||||
let borrow_tracker = this.machine.borrow_tracker.as_ref().unwrap();
|
||||
// The body of this loop needs `borrow_tracker` immutably
|
||||
|
|
@ -431,6 +438,7 @@ impl AllocState {
|
|||
range: AllocRange,
|
||||
machine: &MiriMachine<'tcx>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span = enter_trace_span!(borrow_tracker::before_memory_read, alloc_id = alloc_id.0);
|
||||
match self {
|
||||
AllocState::StackedBorrows(sb) =>
|
||||
sb.borrow_mut().before_memory_read(alloc_id, prov_extra, range, machine),
|
||||
|
|
@ -452,6 +460,7 @@ impl AllocState {
|
|||
range: AllocRange,
|
||||
machine: &MiriMachine<'tcx>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span = enter_trace_span!(borrow_tracker::before_memory_write, alloc_id = alloc_id.0);
|
||||
match self {
|
||||
AllocState::StackedBorrows(sb) =>
|
||||
sb.get_mut().before_memory_write(alloc_id, prov_extra, range, machine),
|
||||
|
|
@ -473,6 +482,8 @@ impl AllocState {
|
|||
size: Size,
|
||||
machine: &MiriMachine<'tcx>,
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span =
|
||||
enter_trace_span!(borrow_tracker::before_memory_deallocation, alloc_id = alloc_id.0);
|
||||
match self {
|
||||
AllocState::StackedBorrows(sb) =>
|
||||
sb.get_mut().before_memory_deallocation(alloc_id, prov_extra, size, machine),
|
||||
|
|
@ -482,6 +493,7 @@ impl AllocState {
|
|||
}
|
||||
|
||||
pub fn remove_unreachable_tags(&self, tags: &FxHashSet<BorTag>) {
|
||||
let _span = enter_trace_span!(borrow_tracker::remove_unreachable_tags);
|
||||
match self {
|
||||
AllocState::StackedBorrows(sb) => sb.borrow_mut().remove_unreachable_tags(tags),
|
||||
AllocState::TreeBorrows(tb) => tb.borrow_mut().remove_unreachable_tags(tags),
|
||||
|
|
@ -496,6 +508,11 @@ impl AllocState {
|
|||
tag: BorTag,
|
||||
alloc_id: AllocId, // diagnostics
|
||||
) -> InterpResult<'tcx> {
|
||||
let _span = enter_trace_span!(
|
||||
borrow_tracker::release_protector,
|
||||
alloc_id = alloc_id.0,
|
||||
tag = tag.0
|
||||
);
|
||||
match self {
|
||||
AllocState::StackedBorrows(_sb) => interp_ok(()),
|
||||
AllocState::TreeBorrows(tb) =>
|
||||
|
|
@ -506,6 +523,7 @@ impl AllocState {
|
|||
|
||||
impl VisitProvenance for AllocState {
|
||||
fn visit_provenance(&self, visit: &mut VisitWith<'_>) {
|
||||
let _span = enter_trace_span!(borrow_tracker::visit_provenance);
|
||||
match self {
|
||||
AllocState::StackedBorrows(sb) => sb.visit_provenance(visit),
|
||||
AllocState::TreeBorrows(tb) => tb.visit_provenance(visit),
|
||||
|
|
|
|||
|
|
@ -1431,3 +1431,44 @@ impl ToU64 for usize {
|
|||
self.try_into().unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
/// This struct is needed to enforce `#[must_use]` on values produced by [enter_trace_span] even
|
||||
/// when the "tracing" feature is not enabled.
|
||||
#[must_use]
|
||||
pub struct MaybeEnteredTraceSpan {
|
||||
#[cfg(feature = "tracing")]
|
||||
pub _entered_span: tracing::span::EnteredSpan,
|
||||
}
|
||||
|
||||
/// Enters a [tracing::info_span] only if the "tracing" feature is enabled, otherwise does nothing.
|
||||
/// This is like [rustc_const_eval::enter_trace_span] except that it does not depend on the
|
||||
/// [Machine] trait to check if tracing is enabled, because from the Miri codebase we can directly
|
||||
/// check whether the "tracing" feature is enabled, unlike from the rustc_const_eval codebase.
|
||||
///
|
||||
/// In addition to the syntax accepted by [tracing::span!], this macro optionally allows passing
|
||||
/// the span name (i.e. the first macro argument) in the form `NAME::SUBNAME` (without quotes) to
|
||||
/// indicate that the span has name "NAME" (usually the name of the component) and has an additional
|
||||
/// more specific name "SUBNAME" (usually the function name). The latter is passed to the [tracing]
|
||||
/// infrastructure as a span field with the name "NAME". This allows not being distracted by
|
||||
/// subnames when looking at the trace in <https://ui.perfetto.dev>, but when deeper introspection
|
||||
/// is needed within a component, it's still possible to view the subnames directly in the UI by
|
||||
/// selecting a span, clicking on the "NAME" argument on the right, and clicking on "Visualize
|
||||
/// argument values".
|
||||
/// ```rust
|
||||
/// // for example, the first will expand to the second
|
||||
/// enter_trace_span!(borrow_tracker::on_stack_pop, /* ... */)
|
||||
/// enter_trace_span!("borrow_tracker", borrow_tracker = "on_stack_pop", /* ... */)
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! enter_trace_span {
|
||||
($name:ident :: $subname:ident $($tt:tt)*) => {{
|
||||
enter_trace_span!(stringify!($name), $name = %stringify!(subname) $($tt)*)
|
||||
}};
|
||||
|
||||
($($tt:tt)*) => {
|
||||
$crate::MaybeEnteredTraceSpan {
|
||||
#[cfg(feature = "tracing")]
|
||||
_entered_span: tracing::info_span!($($tt)*).entered()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -140,7 +140,9 @@ pub use crate::eval::{
|
|||
AlignmentCheck, BacktraceStyle, IsolatedOp, MiriConfig, MiriEntryFnType, RejectOpWith,
|
||||
ValidationMode, create_ecx, eval_entry,
|
||||
};
|
||||
pub use crate::helpers::{AccessKind, EvalContextExt as _, ToU64 as _, ToUsize as _};
|
||||
pub use crate::helpers::{
|
||||
AccessKind, EvalContextExt as _, MaybeEnteredTraceSpan, ToU64 as _, ToUsize as _,
|
||||
};
|
||||
pub use crate::intrinsics::EvalContextExt as _;
|
||||
pub use crate::machine::{
|
||||
AllocExtra, DynMachineCallback, FrameExtra, MachineCallback, MemoryKind, MiriInterpCx,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue