Struct gimli::read::UnwindTableRow

source ·
pub struct UnwindTableRow<R: Reader, S: UnwindContextStorage<R> = StoreOnHeap> { /* 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<R: Reader, S: UnwindContextStorage<R>> UnwindTableRow<R, S>

source

pub fn start_address(&self) -> u64

Get the starting PC address that this row applies to.

source

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().

source

pub fn contains(&self, address: u64) -> bool

Return true if the given address is within this row’s address range, false otherwise.

source

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.

source

pub fn cfa(&self) -> &CfaRule<R>

Get the canonical frame address (CFA) recovery rule for this row.

source

pub fn register(&self, register: Register) -> RegisterRule<R>

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
source

pub fn registers(&self) -> RegisterRuleIter<'_, R>

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<R: Reader, S: UnwindContextStorage<R>> Clone for UnwindTableRow<R, S>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<R: Reader, S: UnwindContextStorage<R>> Debug for UnwindTableRow<R, S>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<R: Reader, S: UnwindContextStorage<R>> Default for UnwindTableRow<R, S>

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<R: PartialEq + Reader, S: PartialEq + UnwindContextStorage<R>> PartialEq<UnwindTableRow<R, S>> for UnwindTableRow<R, S>

source§

fn eq(&self, other: &UnwindTableRow<R, S>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<R: Eq + Reader, S: Eq + UnwindContextStorage<R>> Eq for UnwindTableRow<R, S>

source§

impl<R: Reader, S: UnwindContextStorage<R>> StructuralEq for UnwindTableRow<R, S>

source§

impl<R: Reader, S: UnwindContextStorage<R>> StructuralPartialEq for UnwindTableRow<R, S>

Auto Trait Implementations§

§

impl<R, S> RefUnwindSafe for UnwindTableRow<R, S>where R: RefUnwindSafe, <<S as UnwindContextStorage<R>>::Rules as Sealed>::Storage: RefUnwindSafe,

§

impl<R, S> Send for UnwindTableRow<R, S>where R: Send, <<S as UnwindContextStorage<R>>::Rules as Sealed>::Storage: Send,

§

impl<R, S> Sync for UnwindTableRow<R, S>where R: Sync, <<S as UnwindContextStorage<R>>::Rules as Sealed>::Storage: Sync,

§

impl<R, S> Unpin for UnwindTableRow<R, S>where R: Unpin, <<S as UnwindContextStorage<R>>::Rules as Sealed>::Storage: Unpin,

§

impl<R, S> UnwindSafe for UnwindTableRow<R, S>where R: UnwindSafe, <<S as UnwindContextStorage<R>>::Rules as Sealed>::Storage: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.