pub struct UnwindTableRow<T, S = StoreOnHeap>where
T: ReaderOffset,
S: UnwindContextStorage<T>,{ /* private fields */ }
Expand description
A row in the virtual unwind table that describes how to find the values of the registers in the previous frame for a range of PC addresses.
Implementations§
source§impl<T, S> UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
impl<T, S> UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
sourcepub fn start_address(&self) -> u64
pub fn start_address(&self) -> u64
Get the starting PC address that this row applies to.
sourcepub fn end_address(&self) -> u64
pub fn end_address(&self) -> u64
Get the end PC address where this row’s register rules become unapplicable.
In other words, this row describes how to recover the last frame’s
registers for all PCs where row.start_address() <= PC < row.end_address()
. This row does NOT describe how to recover registers
when PC == row.end_address()
.
sourcepub fn contains(&self, address: u64) -> bool
pub fn contains(&self, address: u64) -> bool
Return true
if the given address
is within this row’s address range,
false
otherwise.
sourcepub fn saved_args_size(&self) -> u64
pub fn saved_args_size(&self) -> u64
Returns the amount of args currently on the stack.
When unwinding, if the personality function requested a change in IP, the SP needs to be adjusted by saved_args_size.
sourcepub fn cfa(&self) -> &CfaRule<T>
pub fn cfa(&self) -> &CfaRule<T>
Get the canonical frame address (CFA) recovery rule for this row.
sourcepub fn register(&self, register: Register) -> RegisterRule<T>
pub fn register(&self, register: Register) -> RegisterRule<T>
Get the register recovery rule for the given register number.
The register number mapping is architecture dependent. For example, in the x86-64 ABI the register number mapping is defined in Figure 3.36:
Figure 3.36: DWARF Register Number Mapping
Register Name Number Abbreviation General Purpose Register RAX 0 %rax General Purpose Register RDX 1 %rdx General Purpose Register RCX 2 %rcx General Purpose Register RBX 3 %rbx General Purpose Register RSI 4 %rsi General Purpose Register RDI 5 %rdi General Purpose Register RBP 6 %rbp Stack Pointer Register RSP 7 %rsp Extended Integer Registers 8-15 8-15 %r8-%r15 Return Address RA 16 Vector Registers 0–7 17-24 %xmm0–%xmm7 Extended Vector Registers 8–15 25-32 %xmm8–%xmm15 Floating Point Registers 0–7 33-40 %st0–%st7 MMX Registers 0–7 41-48 %mm0–%mm7 Flag Register 49 %rFLAGS Segment Register ES 50 %es Segment Register CS 51 %cs Segment Register SS 52 %ss Segment Register DS 53 %ds Segment Register FS 54 %fs Segment Register GS 55 %gs Reserved 56-57 FS Base address 58 %fs.base GS Base address 59 %gs.base Reserved 60-61 Task Register 62 %tr LDT Register 63 %ldtr 128-bit Media Control and Status 64 %mxcsr x87 Control Word 65 %fcw x87 Status Word 66 %fsw Upper Vector Registers 16–31 67-82 %xmm16–%xmm31 Reserved 83-117 Vector Mask Registers 0–7 118-125 %k0–%k7 Reserved 126-129
sourcepub fn registers(&self) -> RegisterRuleIter<'_, T> ⓘ
pub fn registers(&self) -> RegisterRuleIter<'_, T> ⓘ
Iterate over all defined register (number, rule)
pairs.
The rules are not iterated in any guaranteed order. Any register that
does not make an appearance in the iterator implicitly has the rule
RegisterRule::Undefined
.
for &(register, ref rule) in unwind_table_row.registers() {
// ...
}
Trait Implementations§
source§impl<T, S> Clone for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
impl<T, S> Clone for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
source§fn clone(&self) -> UnwindTableRow<T, S>
fn clone(&self) -> UnwindTableRow<T, S>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<T, S> Debug for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
impl<T, S> Debug for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
source§impl<T, S> Default for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
impl<T, S> Default for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
source§fn default() -> UnwindTableRow<T, S>
fn default() -> UnwindTableRow<T, S>
source§impl<T, S> PartialEq for UnwindTableRow<T, S>
impl<T, S> PartialEq for UnwindTableRow<T, S>
source§fn eq(&self, other: &UnwindTableRow<T, S>) -> bool
fn eq(&self, other: &UnwindTableRow<T, S>) -> bool
self
and other
values to be equal, and is used
by ==
.impl<T, S> Eq for UnwindTableRow<T, S>
impl<T, S> StructuralPartialEq for UnwindTableRow<T, S>where
T: ReaderOffset,
S: UnwindContextStorage<T>,
Auto Trait Implementations§
impl<T, S> Freeze for UnwindTableRow<T, S>
impl<T, S> RefUnwindSafe for UnwindTableRow<T, S>
impl<T, S> Send for UnwindTableRow<T, S>
impl<T, S> Sync for UnwindTableRow<T, S>
impl<T, S> Unpin for UnwindTableRow<T, S>
impl<T, S> UnwindSafe for UnwindTableRow<T, S>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
source§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.source§impl<I> RecreateContext<I> for I
impl<I> RecreateContext<I> for I
source§fn recreate_context(_original_input: I, tail: I) -> I
fn recreate_context(_original_input: I, tail: I) -> I
source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.