[−][src]Enum gimli::read::Operation
A single decoded DWARF expression operation.
DWARF expression evaluation is done in two parts: first the raw bytes of the next part of the expression are decoded; and then the decoded operation is evaluated. This approach lets other consumers inspect the DWARF expression without reimplementing the decoding operation.
Multiple DWARF opcodes may decode into a single Operation
. For
example, both DW_OP_deref
and DW_OP_xderef
are represented
using Operation::Deref
.
Variants
Dereference the topmost value of the stack.
Fields of Deref
base_type: UnitOffset<Offset>
The DIE of the base type or 0 to indicate the generic type
size: u8
The size of the data to dereference.
space: bool
True if the dereference operation takes an address space argument from the stack; false otherwise.
Drop an item from the stack.
Pick an item from the stack and push it on top of the stack.
This operation handles DW_OP_pick
, DW_OP_dup
, and
DW_OP_over
.
Swap the top two stack items.
Rotate the top three stack items.
Take the absolute value of the top of the stack.
Bitwise and
of the top two values on the stack.
Divide the top two values on the stack.
Subtract the top two values on the stack.
Modulus of the top two values on the stack.
Multiply the top two values on the stack.
Negate the top of the stack.
Bitwise not
of the top of the stack.
Bitwise or
of the top two values on the stack.
Add the top two values on the stack.
Add a constant to the topmost value on the stack.
Logical left shift of the 2nd value on the stack by the number of bits given by the topmost value on the stack.
Right shift of the 2nd value on the stack by the number of bits given by the topmost value on the stack.
Arithmetic left shift of the 2nd value on the stack by the number of bits given by the topmost value on the stack.
Bitwise xor
of the top two values on the stack.
Branch to the target location if the top of stack is nonzero.
Compare the top two stack values for equality.
Compare the top two stack values using >=
.
Compare the top two stack values using >
.
Compare the top two stack values using <=
.
Compare the top two stack values using <
.
Compare the top two stack values using !=
.
Unconditional branch to the target location.
Push an unsigned constant value on the stack. This handles multiple DWARF opcodes.
Push a signed constant value on the stack. This handles multiple DWARF opcodes.
Indicate that this piece's location is in the given register. Completes the piece or expression.
Fields of Register
register: Register
The register number.
Find the value of the given register, add the offset, and then push the resulting sum on the stack.
Fields of RegisterOffset
register: Register
The register number.
offset: i64
The offset to add.
base_type: UnitOffset<Offset>
The DIE of the base type or 0 to indicate the generic type
Compute the frame base (using DW_AT_frame_base
), add the
given offset, and then push the resulting sum on the stack.
No operation.
Push the object address on the stack.
Evaluate a DWARF expression as a subroutine. The expression
comes from the DW_AT_location
attribute of the indicated
DIE.
Fields of Call
offset: DieReference<Offset>
The DIE to use.
Compute the address of a thread-local variable and push it on the stack.
Compute the call frame CFA and push it on the stack.
Terminate a piece.
Fields of Piece
size_in_bits: u64
The size of this piece in bits.
bit_offset: Option<u64>
The bit offset of this piece. If None
, then this piece
was specified using DW_OP_piece
and should start at the
next byte boundary.
Represents DW_OP_implicit_value
.
The object has no location, but has a known constant value.
Completes the piece or expression.
Represents DW_OP_stack_value
.
The object has no location, but its value is at the top of the stack.
Completes the piece or expression.
Represents DW_OP_implicit_pointer
. The object is a pointer to
a value which has no actual location, such as an implicit value or
a stack value.
Completes the piece or expression.
Fields of ImplicitPointer
value: DebugInfoOffset<Offset>
The .debug_info
offset of the value that this is an implicit pointer into.
byte_offset: i64
The byte offset into the value that the implicit pointer points to.
Represents DW_OP_entry_value
. Evaluate an expression at the entry to
the current subprogram, and push it on the stack.
Represents DW_OP_GNU_parameter_ref
. This represents a parameter that was
optimized out. The offset points to the definition of the parameter, and is
matched to the DW_TAG_GNU_call_site_parameter
in the caller that also
points to the same definition of the parameter.
Fields of ParameterRef
offset: UnitOffset<Offset>
The DIE to use.
Represents DW_OP_addr
.
Relocate the address if needed, and push it on the stack.
Represents DW_OP_addrx
.
Read the address at the given index in `.debug_addr, relocate the address if needed,
and push it on the stack.
Fields of AddressIndex
index: DebugAddrIndex<Offset>
The index of the address in .debug_addr
.
Represents DW_OP_constx
.
Read the address at the given index in `.debug_addr, and push it on the stack.
Do not relocate the address.
Fields of ConstantIndex
index: DebugAddrIndex<Offset>
The index of the address in .debug_addr
.
Represents DW_OP_const_type
.
Interpret the value bytes as a constant of a given type, and push it on the stack.
Fields of TypedLiteral
Represents DW_OP_convert
.
Pop the top stack entry, convert it to a different type, and push it on the stack.
Fields of Convert
base_type: UnitOffset<Offset>
The DIE of the base type.
Represents DW_OP_reinterpret
.
Pop the top stack entry, reinterpret the bits in its value as a different type,
and push it on the stack.
Fields of Reinterpret
base_type: UnitOffset<Offset>
The DIE of the base type.
Implementations
impl<R, Offset> Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
pub fn parse(bytes: &mut R, encoding: Encoding) -> Result<Operation<R, Offset>>
[src]
Parse a single DWARF expression operation.
This is useful when examining a DWARF expression for reasons other than direct evaluation.
bytes
points to a the operation to decode. It should point into
the same array as bytecode
, which should be the entire
expression.
Trait Implementations
impl<R: Clone, Offset: Clone> Clone for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
fn clone(&self) -> Operation<R, Offset>
[src]
fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl<R: Copy, Offset: Copy> Copy for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
impl<R: Debug, Offset: Debug> Debug for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
impl<R: Eq, Offset: Eq> Eq for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
impl<R: PartialEq, Offset: PartialEq> PartialEq<Operation<R, Offset>> for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
fn eq(&self, other: &Operation<R, Offset>) -> bool
[src]
fn ne(&self, other: &Operation<R, Offset>) -> bool
[src]
impl<R, Offset> StructuralEq for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
impl<R, Offset> StructuralPartialEq for Operation<R, Offset> where
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
[src]
R: Reader<Offset = Offset>,
Offset: ReaderOffset,
Auto Trait Implementations
impl<R, Offset> Send for Operation<R, Offset> where
Offset: Send,
R: Send,
Offset: Send,
R: Send,
impl<R, Offset> Sync for Operation<R, Offset> where
Offset: Sync,
R: Sync,
Offset: Sync,
R: Sync,
impl<R, Offset> Unpin for Operation<R, Offset> where
Offset: Unpin,
R: Unpin,
Offset: Unpin,
R: Unpin,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T
[src]
fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,