blob: badd7a21fac958293d62181b600d526d3602064a [file] [log] [blame]
//! Support for reverse debugging targets.
use crate::target::Target;
/// Target Extension - Reverse continue for targets.
pub trait ReverseCont<Tid>: Target
where
Tid: crate::is_valid_tid::IsValidTid,
{
/// [Reverse continue] the target.
///
/// Reverse continue allows the target to run backwards until it reaches the
/// end of the replay log.
///
/// [Reverse continue]: https://sourceware.org/gdb/current/onlinedocs/gdb/Reverse-Execution.html
fn reverse_cont(&mut self) -> Result<(), Self::Error>;
}
/// See [`ReverseCont`]
pub type ReverseContOps<'a, Tid, T> =
&'a mut dyn ReverseCont<Tid, Arch = <T as Target>::Arch, Error = <T as Target>::Error>;
/// Target Extension - Reverse stepping for targets.
pub trait ReverseStep<Tid>: Target
where
Tid: crate::is_valid_tid::IsValidTid,
{
/// [Reverse step] the specified `Tid`.
///
/// On single threaded targets, `tid` is set to `()` and can be ignored.
///
/// Reverse stepping allows the target to run backwards by one "step" -
/// typically a single instruction.
///
/// [Reverse step]: https://sourceware.org/gdb/current/onlinedocs/gdb/Reverse-Execution.html
fn reverse_step(&mut self, tid: Tid) -> Result<(), Self::Error>;
}
/// See [`ReverseStep`]
pub type ReverseStepOps<'a, Tid, T> =
&'a mut dyn ReverseStep<Tid, Arch = <T as Target>::Arch, Error = <T as Target>::Error>;
/// Describes the point reached in a replay log (used alongside
/// [`BaseStopReason::ReplayLog`](crate::stub::BaseStopReason::ReplayLog))
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ReplayLogPosition {
/// Reached the beginning of the replay log.
Begin,
/// Reached the end of the replay log.
End,
}