pulley_interpreter::disas

Struct Disassembler

Source
pub struct Disassembler<'a> { /* private fields */ }
Available on crate feature disas only.
Expand description

A Pulley bytecode disassembler.

This is implemented as an OpVisitor, where you pass a Disassembler to a Decoder in order to disassemble instructions from a bytecode stream.

Alternatively, you can use the Disassembler::disassemble_all method to disassemble a complete bytecode stream.

Implementations§

Source§

impl<'a> Disassembler<'a>

Source

pub fn disassemble_all(bytecode: &'a [u8]) -> Result<String>

Disassemble every instruction in the given bytecode stream.

Source

pub fn new(bytecode: &'a [u8]) -> Self

Create a new Disassembler that can be used to incrementally disassemble instructions from the given bytecode stream.

Source

pub fn offsets(&mut self, offsets: bool) -> &mut Self

Whether to prefix each instruction’s disassembly with its offset.

True by default.

Source

pub fn hexdump(&mut self, hexdump: bool) -> &mut Self

Whether to include a hexdump of the bytecode in the disassembly.

True by default.

Source

pub fn disas(&self) -> &str

Get the disassembly thus far.

Trait Implementations§

Source§

impl ExtendedOpVisitor for Disassembler<'_>

Source§

fn trap(&mut self)

Available on crate feature decode only.
Raise a trap.
Source§

fn nop(&mut self)

Available on crate feature decode only.
Do nothing.
Source§

fn get_sp(&mut self, dst: XReg)

Available on crate feature decode only.
Copy the special sp stack pointer register into an x register.
Source§

impl<'a> OpVisitor for Disassembler<'a>

Source§

type BytecodeStream = SafeBytecodeStream<'a>

Available on crate feature decode only.
The type of this visitor’s bytecode stream.
Source§

type Return = ()

Available on crate feature decode only.
The type of values returned by each visitor method.
Source§

fn bytecode(&mut self) -> &mut Self::BytecodeStream

Available on crate feature decode only.
Get this visitor’s underlying bytecode stream.
Source§

fn before_visit(&mut self)

Available on crate feature decode only.
A callback invoked before starting to decode an instruction. Read more
Source§

fn after_visit(&mut self)

Available on crate feature decode only.
A callback invoked after an instruction has been completely decoded. Read more
Source§

fn ret(&mut self)

Available on crate feature decode only.
Transfer control the address in the lr register.
Source§

fn call(&mut self, offset: PcRelOffset)

Available on crate feature decode only.
Transfer control to the PC at the given offset and set the lr register to the PC just after this instruction.
Source§

fn jump(&mut self, offset: PcRelOffset)

Available on crate feature decode only.
Unconditionally transfer control to the PC at the given offset.
Source§

fn br_if(&mut self, cond: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Conditionally transfer control to the given PC offset if cond contains a non-zero value.
Source§

fn br_if_not(&mut self, cond: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Conditionally transfer control to the given PC offset if cond contains a zero value.
Source§

fn br_if_xeq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if a == b.
Source§

fn br_if_xneq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if a != b.
Source§

fn br_if_xslt32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if signed a < b.
Source§

fn br_if_xslteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if signed a <= b.
Source§

fn br_if_xult32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if unsigned a < b.
Source§

fn br_if_xulteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if unsigned a <= b.
Source§

fn br_if_xeq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if a == b.
Source§

fn br_if_xneq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if a != b.
Source§

fn br_if_xslt64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if signed a < b.
Source§

fn br_if_xslteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if signed a <= b.
Source§

fn br_if_xult64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if unsigned a < b.
Source§

fn br_if_xulteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)

Available on crate feature decode only.
Branch if unsigned a <= b.
Source§

fn xmov(&mut self, dst: XReg, src: XReg)

Available on crate feature decode only.
Move between x registers.
Source§

fn fmov(&mut self, dst: FReg, src: FReg)

Available on crate feature decode only.
Move between f registers.
Source§

fn vmov(&mut self, dst: VReg, src: VReg)

Available on crate feature decode only.
Move between v registers.
Source§

fn xconst8(&mut self, dst: XReg, imm: i8)

Available on crate feature decode only.
Set dst = sign_extend(imm8).
Source§

fn xconst16(&mut self, dst: XReg, imm: i16)

Available on crate feature decode only.
Set dst = sign_extend(imm16).
Source§

fn xconst32(&mut self, dst: XReg, imm: i32)

Available on crate feature decode only.
Set dst = sign_extend(imm32).
Source§

fn xconst64(&mut self, dst: XReg, imm: i64)

Available on crate feature decode only.
Set dst = imm64.
Source§

fn xadd32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit wrapping addition: low32(dst) = low32(src1) + low32(src2). Read more
Source§

fn xadd64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit wrapping addition: dst = src1 + src2.
Source§

fn xeq64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit equality.
Source§

fn xneq64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit inequality.
Source§

fn xslt64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit signed less-than.
Source§

fn xslteq64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit signed less-than-equal.
Source§

fn xult64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit unsigned less-than.
Source§

fn xulteq64(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
64-bit unsigned less-than-equal.
Source§

fn xeq32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit equality.
Source§

fn xneq32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit inequality.
Source§

fn xslt32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit signed less-than.
Source§

fn xslteq32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit signed less-than-equal.
Source§

fn xult32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit unsigned less-than.
Source§

fn xulteq32(&mut self, operands: BinaryOperands<XReg>)

Available on crate feature decode only.
32-bit unsigned less-than-equal.
Source§

fn load32_u(&mut self, dst: XReg, ptr: XReg)

Available on crate feature decode only.
dst = zero_extend(load32(ptr))
Source§

fn load32_s(&mut self, dst: XReg, ptr: XReg)

Available on crate feature decode only.
dst = sign_extend(load32(ptr))
Source§

fn load64(&mut self, dst: XReg, ptr: XReg)

Available on crate feature decode only.
dst = load64(ptr)
Source§

fn load32_u_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)

Available on crate feature decode only.
dst = zero_extend(load32(ptr + offset8))
Source§

fn load32_s_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)

Available on crate feature decode only.
dst = sign_extend(load32(ptr + offset8))
Source§

fn load64_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)

Available on crate feature decode only.
dst = load64(ptr + offset8)
Source§

fn load32_u_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)

Available on crate feature decode only.
dst = zero_extend(load32(ptr + offset64))
Source§

fn load32_s_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)

Available on crate feature decode only.
dst = sign_extend(load32(ptr + offset64))
Source§

fn load64_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)

Available on crate feature decode only.
dst = load64(ptr + offset64)
Source§

fn store32(&mut self, ptr: XReg, src: XReg)

Available on crate feature decode only.
*ptr = low32(src)
Source§

fn store64(&mut self, ptr: XReg, src: XReg)

Available on crate feature decode only.
*ptr = src
Source§

fn store32_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)

Available on crate feature decode only.
*(ptr + sign_extend(offset8)) = low32(src)
Source§

fn store64_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)

Available on crate feature decode only.
*(ptr + sign_extend(offset8)) = src
Source§

fn store32_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)

Available on crate feature decode only.
*(ptr + sign_extend(offset64)) = low32(src)
Source§

fn store64_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)

Available on crate feature decode only.
*(ptr + sign_extend(offset64)) = src
Source§

fn push_frame(&mut self)

Available on crate feature decode only.
push lr; push fp; fp = sp
Source§

fn pop_frame(&mut self)

Available on crate feature decode only.
sp = fp; pop fp; pop lr
Source§

fn xpush32(&mut self, src: XReg)

Available on crate feature decode only.
*sp = low32(src); sp += 4
Source§

fn xpush32_many(&mut self, srcs: RegSet<XReg>)

Available on crate feature decode only.
for src in srcs { xpush32 src }
Source§

fn xpush64(&mut self, src: XReg)

Available on crate feature decode only.
*sp = src; sp += 8
Source§

fn xpush64_many(&mut self, srcs: RegSet<XReg>)

Available on crate feature decode only.
for src in srcs { xpush64 src }
Source§

fn xpop32(&mut self, dst: XReg)

Available on crate feature decode only.
*dst = *sp; sp -= 4
Source§

fn xpop32_many(&mut self, dsts: RegSet<XReg>)

Available on crate feature decode only.
for dst in dsts.rev() { xpop32 dst }
Source§

fn xpop64(&mut self, dst: XReg)

Available on crate feature decode only.
*dst = *sp; sp -= 8
Source§

fn xpop64_many(&mut self, dsts: RegSet<XReg>)

Available on crate feature decode only.
for dst in dsts.rev() { xpop64 dst }
Source§

fn bitcast_int_from_float_32(&mut self, dst: XReg, src: FReg)

Available on crate feature decode only.
low32(dst) = bitcast low32(src) as i32
Source§

fn bitcast_int_from_float_64(&mut self, dst: XReg, src: FReg)

Available on crate feature decode only.
dst = bitcast src as i64
Source§

fn bitcast_float_from_int_32(&mut self, dst: FReg, src: XReg)

Available on crate feature decode only.
low32(dst) = bitcast low32(src) as f32
Source§

fn bitcast_float_from_int_64(&mut self, dst: FReg, src: XReg)

Available on crate feature decode only.
dst = bitcast src as f64

Auto Trait Implementations§

§

impl<'a> Freeze for Disassembler<'a>

§

impl<'a> RefUnwindSafe for Disassembler<'a>

§

impl<'a> Send for Disassembler<'a>

§

impl<'a> Sync for Disassembler<'a>

§

impl<'a> Unpin for Disassembler<'a>

§

impl<'a> UnwindSafe for Disassembler<'a>

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where 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 T
where 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, U> TryFrom<U> for T
where U: Into<T>,

Source§

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 T
where U: TryFrom<T>,

Source§

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.