diff options
author | Noa <33094578+coolreader18@users.noreply.github.com> | 2021-12-14 12:59:50 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2022-01-02 19:19:35 -0800 |
commit | 60957e6b7c059c26b42ee8f56180e417040dd3e4 (patch) | |
tree | dfc5f3d59d8a622431dcb4d18b2c5edc4570f63e /src | |
parent | 7f1d77d0c32c6570b426f52cb71acad1fc7c581a (diff) |
Update remaining yaxpeax impls to 0.2
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 94 |
1 files changed, 32 insertions, 62 deletions
diff --git a/src/main.rs b/src/main.rs index fe531dd..02e0974 100644 --- a/src/main.rs +++ b/src/main.rs @@ -85,27 +85,27 @@ fn main() { match arch_str { "x86_64" | - "x86:64" => crate::current_arch::decode_input::<yaxpeax_x86::long_mode::Arch>(&buf, &printer), + "x86:64" => arch_02::decode_input::<yaxpeax_x86::long_mode::Arch>(&buf, &printer), "x86_32" | - "x86:32" => crate::current_arch::decode_input::<yaxpeax_x86::protected_mode::Arch>(&buf, &printer), + "x86:32" => arch_02::decode_input::<yaxpeax_x86::protected_mode::Arch>(&buf, &printer), "x86_16" | - "x86:16" => crate::current_arch::decode_input::<yaxpeax_x86::real_mode::Arch>(&buf, &printer), - "ia64" => crate::current_arch::decode_input::<yaxpeax_ia64::IA64>(&buf, &printer), - "avr" => crate::current_arch::decode_input::<yaxpeax_avr::AVR>(&buf, &printer), - "armv7" => crate::current_arch::decode_input::<yaxpeax_arm::armv7::ARMv7>(&buf, &printer), - "armv8" => crate::current_arch::decode_input::<yaxpeax_arm::armv8::a64::ARMv8>(&buf, &printer), - "mips" => crate::current_arch::decode_input::<yaxpeax_mips::MIPS>(&buf, &printer), - "msp430" => crate::current_arch::decode_input::<yaxpeax_msp430::MSP430>(&buf, &printer), - "pic17" => crate::current_arch::decode_input::<yaxpeax_pic17::PIC17>(&buf, &printer), - "pic18" => crate::current_arch::decode_input::<yaxpeax_pic18::PIC18>(&buf, &printer), - "m16c" => crate::current_arch::decode_input::<yaxpeax_m16c::M16C>(&buf, &printer), - "6502" => crate::legacy_arch::decode_input::<yaxpeax_6502::N6502>(&buf, &printer), - "lc87" => crate::current_arch::decode_input::<yaxpeax_lc87::LC87>(&buf, &printer), + "x86:16" => arch_02::decode_input::<yaxpeax_x86::real_mode::Arch>(&buf, &printer), + "ia64" => arch_02::decode_input::<yaxpeax_ia64::IA64>(&buf, &printer), + "avr" => arch_02::decode_input::<yaxpeax_avr::AVR>(&buf, &printer), + "armv7" => arch_02::decode_input::<yaxpeax_arm::armv7::ARMv7>(&buf, &printer), + "armv8" => arch_02::decode_input::<yaxpeax_arm::armv8::a64::ARMv8>(&buf, &printer), + "mips" => arch_02::decode_input::<yaxpeax_mips::MIPS>(&buf, &printer), + "msp430" => arch_02::decode_input::<yaxpeax_msp430::MSP430>(&buf, &printer), + "pic17" => arch_02::decode_input::<yaxpeax_pic17::PIC17>(&buf, &printer), + "pic18" => arch_02::decode_input::<yaxpeax_pic18::PIC18>(&buf, &printer), + "m16c" => arch_02::decode_input::<yaxpeax_m16c::M16C>(&buf, &printer), + "6502" => arch_02::decode_input::<yaxpeax_6502::N6502>(&buf, &printer), + "lc87" => arch_02::decode_input::<yaxpeax_lc87::LC87>(&buf, &printer), // "pic24" => decode_input::<yaxpeax_pic24::PIC24>(buf), other => { let seg_idx = arch_str.find(|c| c == '+' || c == '-').unwrap_or(arch_str.len()); let wps = |base| with_parsed_superh(base, &arch_str[seg_idx..], - |decoder| crate::legacy_arch::decode_input_with_decoder::<yaxpeax_superh::SuperH>(decoder, &buf, &printer)); + |decoder| arch_02::decode_input_with_decoder::<yaxpeax_superh::SuperH>(decoder, &buf, &printer)); match &arch_str[0..seg_idx] { "sh" => wps(yaxpeax_superh::SuperHDecoder::SH1), "sh2" => wps(yaxpeax_superh::SuperHDecoder::SH2), @@ -188,67 +188,37 @@ impl Printer { } } -// yaxpeax-arch, implemented by all decoders here, is required at incompatible versions by -// different decoders. implement the actual decode-and-print behavior on both versions of -// yaxpeax-arch while older decoders are still being updated. -mod current_arch { - use yaxpeax_arch_02::{AddressBase, Arch, Decoder, Instruction, LengthedInstruction, Reader, U8Reader}; - use std::fmt; - use num_traits::identities::Zero; +// yaxpeax-arch, implemented by all decoders here, may be required at incompatible versions by +// different decoders if/when a new version releases. implement the actual decode-and-print +// behavior independent of yaxpeax-arch so decoders using different version can exist in parallel. +mod arch_02 { use super::Printer; - - pub(crate) fn decode_input<A: Arch>(buf: &[u8], printer: &Printer) - where - A::Instruction: fmt::Display, for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, - { - decode_input_with_decoder::<A>(A::Decoder::default(), buf, printer); - } - - pub(crate) fn decode_input_with_decoder<A: Arch>(decoder: A::Decoder, buf: &[u8], printer: &Printer) - where - A::Instruction: fmt::Display, for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, - { - let mut addr = A::Address::zero(); - while let Some(rest) = buf.get(addr.to_linear()..).filter(|v| !v.is_empty()) { - let mut reader = U8Reader::new(rest); - let res = decoder.decode(&mut reader); - let advance_addr = match &res { - Ok(inst) => inst.len(), - Err(_) => A::Instruction::min_size(), - }; - let generic_res = res.map(|inst| { - ( - A::Address::zero().wrapping_offset(inst.len()).to_linear(), - inst.well_defined(), - inst, - ) - }); - printer.print_instr(rest, addr.to_linear(), generic_res); - addr += advance_addr; - } - } -} - -mod legacy_arch { - use yaxpeax_arch_01::{AddressBase, Arch, Decoder, Instruction, LengthedInstruction}; - use std::fmt; use num_traits::identities::Zero; - use super::Printer; + use std::fmt; + use yaxpeax_arch_02::{ + AddressBase, Arch, Decoder, Instruction, LengthedInstruction, Reader, U8Reader, + }; pub(crate) fn decode_input<A: Arch>(buf: &[u8], printer: &Printer) where A::Instruction: fmt::Display, + for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, { decode_input_with_decoder::<A>(A::Decoder::default(), buf, printer); } - pub(crate) fn decode_input_with_decoder<A: Arch>(decoder: A::Decoder, buf: &[u8], printer: &Printer) - where + pub(crate) fn decode_input_with_decoder<A: Arch>( + decoder: A::Decoder, + buf: &[u8], + printer: &Printer, + ) where A::Instruction: fmt::Display, + for<'data> U8Reader<'data>: Reader<A::Address, A::Word>, { let mut addr = A::Address::zero(); while let Some(rest) = buf.get(addr.to_linear()..).filter(|v| !v.is_empty()) { - let res = decoder.decode(rest.iter().copied()); + let mut reader = U8Reader::new(rest); + let res = decoder.decode(&mut reader); let advance_addr = match &res { Ok(inst) => inst.len(), Err(_) => A::Instruction::min_size(), |