pub struct Disassembler<'a> { /* private fields */ }
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>
impl<'a> Disassembler<'a>
Sourcepub fn disassemble_all(bytecode: &'a [u8]) -> Result<String>
pub fn disassemble_all(bytecode: &'a [u8]) -> Result<String>
Disassemble every instruction in the given bytecode stream.
Sourcepub fn new(bytecode: &'a [u8]) -> Self
pub fn new(bytecode: &'a [u8]) -> Self
Create a new Disassembler
that can be used to incrementally
disassemble instructions from the given bytecode stream.
Sourcepub fn offsets(&mut self, offsets: bool) -> &mut Self
pub fn offsets(&mut self, offsets: bool) -> &mut Self
Whether to prefix each instruction’s disassembly with its offset.
True by default.
Sourcepub fn hexdump(&mut self, hexdump: bool) -> &mut Self
pub fn hexdump(&mut self, hexdump: bool) -> &mut Self
Whether to include a hexdump of the bytecode in the disassembly.
True by default.
Sourcepub fn start_offset(&mut self, offset: usize) -> &mut Self
pub fn start_offset(&mut self, offset: usize) -> &mut Self
Configures the offset that this function starts from, if it doesn’t start from 0.
This can possibly be useful when a single function at a time is being disassembled.
Trait Implementations§
Source§impl ExtendedOpVisitor for Disassembler<'_>
impl ExtendedOpVisitor for Disassembler<'_>
Source§fn call_indirect_host(&mut self, sig: u8)
fn call_indirect_host(&mut self, sig: u8)
decode
only.Source§impl<'a> OpVisitor for Disassembler<'a>
impl<'a> OpVisitor for Disassembler<'a>
Source§type BytecodeStream = SafeBytecodeStream<'a>
type BytecodeStream = SafeBytecodeStream<'a>
decode
only.Source§type Return = ()
type Return = ()
decode
only.Source§fn bytecode(&mut self) -> &mut Self::BytecodeStream
fn bytecode(&mut self) -> &mut Self::BytecodeStream
decode
only.Source§fn before_visit(&mut self)
fn before_visit(&mut self)
decode
only.Source§fn after_visit(&mut self)
fn after_visit(&mut self)
decode
only.Source§fn ret(&mut self)
fn ret(&mut self)
decode
only.lr
register.Source§fn call(&mut self, offset: PcRelOffset)
fn call(&mut self, offset: PcRelOffset)
decode
only.lr
register to the PC just after this instruction.Source§fn call_indirect(&mut self, reg: XReg)
fn call_indirect(&mut self, reg: XReg)
decode
only.reg
and set lr
to the PC just
after this instruction.Source§fn jump(&mut self, offset: PcRelOffset)
fn jump(&mut self, offset: PcRelOffset)
decode
only.Source§fn br_if(&mut self, cond: XReg, offset: PcRelOffset)
fn br_if(&mut self, cond: XReg, offset: PcRelOffset)
decode
only.cond
contains a non-zero value.Source§fn br_if_not(&mut self, cond: XReg, offset: PcRelOffset)
fn br_if_not(&mut self, cond: XReg, offset: PcRelOffset)
decode
only.cond
contains a zero value.Source§fn br_if_xeq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xeq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a == b
.Source§fn br_if_xneq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xneq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a !=
b.Source§fn br_if_xslt32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xslt32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a < b
.Source§fn br_if_xslteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xslteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a <= b
.Source§fn br_if_xult32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xult32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a < b
.Source§fn br_if_xulteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xulteq32(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a <= b
.Source§fn br_if_xeq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xeq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a == b
.Source§fn br_if_xneq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xneq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a !=
b.Source§fn br_if_xslt64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xslt64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a < b
.Source§fn br_if_xslteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xslteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a <= b
.Source§fn br_if_xult64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xult64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a < b
.Source§fn br_if_xulteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
fn br_if_xulteq64(&mut self, a: XReg, b: XReg, offset: PcRelOffset)
decode
only.a <= b
.Source§fn br_table32(&mut self, idx: XReg, amt: u32)
fn br_table32(&mut self, idx: XReg, amt: u32)
decode
only.idx
. Read moreSource§fn xmov(&mut self, dst: XReg, src: XReg)
fn xmov(&mut self, dst: XReg, src: XReg)
decode
only.x
registers.Source§fn fmov(&mut self, dst: FReg, src: FReg)
fn fmov(&mut self, dst: FReg, src: FReg)
decode
only.f
registers.Source§fn vmov(&mut self, dst: VReg, src: VReg)
fn vmov(&mut self, dst: VReg, src: VReg)
decode
only.v
registers.Source§fn xconst8(&mut self, dst: XReg, imm: i8)
fn xconst8(&mut self, dst: XReg, imm: i8)
decode
only.dst = sign_extend(imm8)
.Source§fn xconst16(&mut self, dst: XReg, imm: i16)
fn xconst16(&mut self, dst: XReg, imm: i16)
decode
only.dst = sign_extend(imm16)
.Source§fn xconst32(&mut self, dst: XReg, imm: i32)
fn xconst32(&mut self, dst: XReg, imm: i32)
decode
only.dst = sign_extend(imm32)
.Source§fn xconst64(&mut self, dst: XReg, imm: i64)
fn xconst64(&mut self, dst: XReg, imm: i64)
decode
only.dst = imm64
.Source§fn xadd32(&mut self, operands: BinaryOperands<XReg>)
fn xadd32(&mut self, operands: BinaryOperands<XReg>)
decode
only.low32(dst) = low32(src1) + low32(src2)
. Read moreSource§fn xadd64(&mut self, operands: BinaryOperands<XReg>)
fn xadd64(&mut self, operands: BinaryOperands<XReg>)
decode
only.dst = src1 + src2
.Source§fn xeq64(&mut self, operands: BinaryOperands<XReg>)
fn xeq64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xneq64(&mut self, operands: BinaryOperands<XReg>)
fn xneq64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xslt64(&mut self, operands: BinaryOperands<XReg>)
fn xslt64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xslteq64(&mut self, operands: BinaryOperands<XReg>)
fn xslteq64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xult64(&mut self, operands: BinaryOperands<XReg>)
fn xult64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xulteq64(&mut self, operands: BinaryOperands<XReg>)
fn xulteq64(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xeq32(&mut self, operands: BinaryOperands<XReg>)
fn xeq32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xneq32(&mut self, operands: BinaryOperands<XReg>)
fn xneq32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xslt32(&mut self, operands: BinaryOperands<XReg>)
fn xslt32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xslteq32(&mut self, operands: BinaryOperands<XReg>)
fn xslteq32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xult32(&mut self, operands: BinaryOperands<XReg>)
fn xult32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn xulteq32(&mut self, operands: BinaryOperands<XReg>)
fn xulteq32(&mut self, operands: BinaryOperands<XReg>)
decode
only.Source§fn load32_u(&mut self, dst: XReg, ptr: XReg)
fn load32_u(&mut self, dst: XReg, ptr: XReg)
decode
only.dst = zero_extend(load32(ptr))
Source§fn load32_s(&mut self, dst: XReg, ptr: XReg)
fn load32_s(&mut self, dst: XReg, ptr: XReg)
decode
only.dst = sign_extend(load32(ptr))
Source§fn load64(&mut self, dst: XReg, ptr: XReg)
fn load64(&mut self, dst: XReg, ptr: XReg)
decode
only.dst = load64(ptr)
Source§fn load32_u_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
fn load32_u_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
decode
only.dst = zero_extend(load32(ptr + offset8))
Source§fn load32_s_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
fn load32_s_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
decode
only.dst = sign_extend(load32(ptr + offset8))
Source§fn load64_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
fn load64_offset8(&mut self, dst: XReg, ptr: XReg, offset: i8)
decode
only.dst = load64(ptr + offset8)
Source§fn load32_u_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
fn load32_u_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
decode
only.dst = zero_extend(load32(ptr + offset64))
Source§fn load32_s_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
fn load32_s_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
decode
only.dst = sign_extend(load32(ptr + offset64))
Source§fn load64_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
fn load64_offset64(&mut self, dst: XReg, ptr: XReg, offset: i64)
decode
only.dst = load64(ptr + offset64)
Source§fn store32(&mut self, ptr: XReg, src: XReg)
fn store32(&mut self, ptr: XReg, src: XReg)
decode
only.*ptr = low32(src)
Source§fn store32_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)
fn store32_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)
decode
only.*(ptr + sign_extend(offset8)) = low32(src)
Source§fn store64_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)
fn store64_offset8(&mut self, ptr: XReg, offset: i8, src: XReg)
decode
only.*(ptr + sign_extend(offset8)) = src
Source§fn store32_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)
fn store32_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)
decode
only.*(ptr + sign_extend(offset64)) = low32(src)
Source§fn store64_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)
fn store64_offset64(&mut self, ptr: XReg, offset: i64, src: XReg)
decode
only.*(ptr + sign_extend(offset64)) = src
Source§fn xpush32(&mut self, src: XReg)
fn xpush32(&mut self, src: XReg)
decode
only.*sp = low32(src); sp = sp.checked_add(4)
Source§fn xpush32_many(&mut self, srcs: RegSet<XReg>)
fn xpush32_many(&mut self, srcs: RegSet<XReg>)
decode
only.for src in srcs { xpush32 src }
Source§fn xpush64(&mut self, src: XReg)
fn xpush64(&mut self, src: XReg)
decode
only.*sp = src; sp = sp.checked_add(8)
Source§fn xpush64_many(&mut self, srcs: RegSet<XReg>)
fn xpush64_many(&mut self, srcs: RegSet<XReg>)
decode
only.for src in srcs { xpush64 src }
Source§fn xpop32_many(&mut self, dsts: RegSet<XReg>)
fn xpop32_many(&mut self, dsts: RegSet<XReg>)
decode
only.for dst in dsts.rev() { xpop32 dst }
Source§fn xpop64_many(&mut self, dsts: RegSet<XReg>)
fn xpop64_many(&mut self, dsts: RegSet<XReg>)
decode
only.for dst in dsts.rev() { xpop64 dst }
Source§fn bitcast_int_from_float_32(&mut self, dst: XReg, src: FReg)
fn bitcast_int_from_float_32(&mut self, dst: XReg, src: FReg)
decode
only.low32(dst) = bitcast low32(src) as i32
Source§fn bitcast_int_from_float_64(&mut self, dst: XReg, src: FReg)
fn bitcast_int_from_float_64(&mut self, dst: XReg, src: FReg)
decode
only.dst = bitcast src as i64
Source§fn bitcast_float_from_int_32(&mut self, dst: FReg, src: XReg)
fn bitcast_float_from_int_32(&mut self, dst: FReg, src: XReg)
decode
only.low32(dst) = bitcast low32(src) as f32
Source§fn bitcast_float_from_int_64(&mut self, dst: FReg, src: XReg)
fn bitcast_float_from_int_64(&mut self, dst: FReg, src: XReg)
decode
only.dst = bitcast src as f64
Source§fn stack_alloc32(&mut self, amt: u32)
fn stack_alloc32(&mut self, amt: u32)
decode
only.sp = sp.checked_sub(amt)