From c3f344a38ca4b027b4e69b0f82d3184622d6da79 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Tue, 29 Apr 2025 16:05:54 -0400 Subject: [Rust] Pretty print LLIL sub expressions --- arch/msp430/src/architecture.rs | 1 + arch/riscv/disasm/src/lib.rs | 5 +++-- arch/riscv/src/lib.rs | 41 +++++++++++++++++++------------------ rust/src/architecture.rs | 3 ++- rust/src/low_level_il/expression.rs | 10 ++++----- rust/src/low_level_il/function.rs | 6 +++--- 6 files changed, 35 insertions(+), 31 deletions(-) diff --git a/arch/msp430/src/architecture.rs b/arch/msp430/src/architecture.rs index 938e9ec5..ccc5ce80 100644 --- a/arch/msp430/src/architecture.rs +++ b/arch/msp430/src/architecture.rs @@ -25,6 +25,7 @@ use log::error; const MIN_MNEMONIC: usize = 9; +#[derive(Debug)] pub struct Msp430 { handle: CoreArchitecture, custom_handle: CustomArchitectureHandle, diff --git a/arch/riscv/disasm/src/lib.rs b/arch/riscv/disasm/src/lib.rs index a25516a6..959952ee 100644 --- a/arch/riscv/disasm/src/lib.rs +++ b/arch/riscv/disasm/src/lib.rs @@ -291,7 +291,7 @@ impl FloatRegType for () {} impl FloatRegType for f32 {} impl FloatRegType for f64 {} -pub trait RegFile: Debug + Sized + Copy + Clone { +pub trait RegFile: Debug + Sized + Copy + Clone + Send + Sync + 'static { type Int: IntRegType; type Float: FloatRegType; @@ -2331,7 +2331,7 @@ impl StandardExtension for ExtensionSupported { } } -pub trait RiscVDisassembler: Debug + Sized + Copy + Clone { +pub trait RiscVDisassembler: 'static + Debug + Sized + Copy + Clone + Send + Sync { type RegFile: RegFile; type MulDivExtension: StandardExtension; type AtomicExtension: StandardExtension; @@ -3175,6 +3175,7 @@ pub trait RiscVDisassembler: Debug + Sized + Copy + Clone { #[derive(Copy, Clone, Debug)] pub struct RiscVIMACDisassembler(PhantomData); + impl RiscVDisassembler for RiscVIMACDisassembler { type RegFile = RF; type MulDivExtension = ExtensionSupported; diff --git a/arch/riscv/src/lib.rs b/arch/riscv/src/lib.rs index 1abce973..6df34fd7 100644 --- a/arch/riscv/src/lib.rs +++ b/arch/riscv/src/lib.rs @@ -88,18 +88,18 @@ enum Intrinsic { } #[derive(Copy, Clone)] -struct Register { +struct Register { id: RegisterId, _dis: PhantomData, } #[derive(Debug, Copy, Clone)] -struct RiscVIntrinsic { +struct RiscVIntrinsic { id: Intrinsic, _dis: PhantomData, } -impl Register { +impl Register { fn new(id: RegisterId) -> Self { Self { id, @@ -118,7 +118,7 @@ impl Register { } } -impl From> for Register { +impl From> for Register { fn from(reg: riscv_dis::IntReg) -> Self { Self { id: RegisterId(reg.id()), @@ -127,7 +127,7 @@ impl From> for Register } } -impl From> for Register { +impl From> for Register { fn from(reg: FloatReg) -> Self { let int_reg_count = ::int_reg_count(); @@ -138,13 +138,13 @@ impl From> for Register { } } -impl From> for LowLevelILRegister> { +impl From> for LowLevelILRegister> { fn from(reg: Register) -> Self { LowLevelILRegister::ArchReg(reg) } } -impl RegisterInfo for Register { +impl RegisterInfo for Register { type RegType = Self; fn parent(&self) -> Option { @@ -166,7 +166,7 @@ impl RegisterInfo for Register { } } -impl architecture::Register for Register { +impl architecture::Register for Register { type InfoType = Self; fn name(&self) -> Cow { @@ -204,7 +204,7 @@ impl architecture::Register for Register { } } -impl<'a, D: 'static + RiscVDisassembler + Send + Sync> LiftableLowLevelIL<'a, RiscVArch> +impl<'a, D: RiscVDisassembler> LiftableLowLevelIL<'a, RiscVArch> for Register { type Result = ValueExpr; @@ -221,7 +221,7 @@ impl<'a, D: 'static + RiscVDisassembler + Send + Sync> LiftableLowLevelIL<'a, Ri } } -impl<'a, D: 'static + RiscVDisassembler + Send + Sync> LiftableLowLevelILWithSize<'a, RiscVArch> +impl<'a, D: RiscVDisassembler> LiftableLowLevelILWithSize<'a, RiscVArch> for Register { fn lift_with_size( @@ -257,21 +257,21 @@ impl<'a, D: 'static + RiscVDisassembler + Send + Sync> LiftableLowLevelILWithSiz } } -impl Hash for Register { +impl Hash for Register { fn hash(&self, state: &mut H) { self.id.hash(state); } } -impl PartialEq for Register { +impl PartialEq for Register { fn eq(&self, other: &Self) -> bool { self.id == other.id } } -impl Eq for Register {} +impl Eq for Register {} -impl fmt::Debug for Register { +impl fmt::Debug for Register { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str(self.name().as_ref()) } @@ -636,13 +636,14 @@ impl architecture::Intrinsic for RiscVIntrinsic { } } -struct RiscVArch { +#[derive(Debug)] +struct RiscVArch { handle: CoreArchitecture, custom_handle: CustomArchitectureHandle>, _dis: PhantomData, } -impl architecture::Architecture for RiscVArch { +impl Architecture for RiscVArch { type Handle = CustomArchitectureHandle; type RegisterInfo = Register; @@ -2652,7 +2653,7 @@ impl RelocationHandler } } -impl AsRef +impl AsRef for RiscVELFRelocationHandler { fn as_ref(&self) -> &CoreRelocationHandler { @@ -2660,17 +2661,17 @@ impl AsRef } } -struct RiscVCC { +struct RiscVCC { _dis: PhantomData, } -impl RiscVCC { +impl RiscVCC { fn new() -> Self { RiscVCC { _dis: PhantomData } } } -impl CallingConvention for RiscVCC { +impl CallingConvention for RiscVCC { fn caller_saved_registers(&self) -> Vec { let mut regs = Vec::with_capacity(36); let int_reg_count = ::int_reg_count(); diff --git a/rust/src/architecture.rs b/rust/src/architecture.rs index 3573f1fb..7ad10dfb 100644 --- a/rust/src/architecture.rs +++ b/rust/src/architecture.rs @@ -418,7 +418,7 @@ pub trait Intrinsic: Debug + Sized + Clone + Copy { fn outputs(&self) -> Vec>>; } -pub trait Architecture: 'static + Sized + AsRef { +pub trait Architecture: 'static + Sized + AsRef + Debug { type Handle: Borrow + Clone; type RegisterInfo: RegisterInfo; @@ -3234,6 +3234,7 @@ where } } +#[derive(Debug)] pub struct CustomArchitectureHandle where A: 'static + Architecture> + Send + Sync, diff --git a/rust/src/low_level_il/expression.rs b/rust/src/low_level_il/expression.rs index fd403c76..f8fcf9f7 100644 --- a/rust/src/low_level_il/expression.rs +++ b/rust/src/low_level_il/expression.rs @@ -21,7 +21,7 @@ use super::VisitorAction; use super::*; use crate::architecture::Architecture; use std::fmt; -use std::fmt::{Display, Formatter}; +use std::fmt::{Debug, Display, Formatter}; use std::marker::PhantomData; /// Used as a marker for an [`LowLevelILExpression`] that **can** produce a value. @@ -32,7 +32,7 @@ pub struct ValueExpr; #[derive(Copy, Clone, Debug)] pub struct VoidExpr; -pub trait ExpressionResultType: 'static {} +pub trait ExpressionResultType: 'static + Debug {} impl ExpressionResultType for ValueExpr {} impl ExpressionResultType for VoidExpr {} @@ -102,9 +102,9 @@ where R: ExpressionResultType, { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - f.debug_struct("Expression") - .field("index", &self.index) - .finish() + let op = unsafe { BNGetLowLevelILByIndex(self.function.handle, self.index.0) }; + let t = unsafe { LowLevelILExpressionKind::from_raw(self.function, op) }; + t.fmt(f) } } diff --git a/rust/src/low_level_il/function.rs b/rust/src/low_level_il/function.rs index 85037632..301c3f09 100644 --- a/rust/src/low_level_il/function.rs +++ b/rust/src/low_level_il/function.rs @@ -35,7 +35,7 @@ pub struct Mutable; #[derive(Copy, Clone, Debug)] pub struct Finalized; -pub trait FunctionMutability: 'static {} +pub trait FunctionMutability: 'static + Debug {} impl FunctionMutability for Mutable {} impl FunctionMutability for Finalized {} @@ -44,7 +44,7 @@ pub struct LiftedNonSSA; #[derive(Copy, Clone, Debug)] pub struct RegularNonSSA; -pub trait NonSSAVariant: 'static {} +pub trait NonSSAVariant: 'static + Debug {} impl NonSSAVariant for LiftedNonSSA {} impl NonSSAVariant for RegularNonSSA {} @@ -53,7 +53,7 @@ pub struct SSA; #[derive(Copy, Clone, Debug)] pub struct NonSSA(V); -pub trait FunctionForm: 'static {} +pub trait FunctionForm: 'static + Debug {} impl FunctionForm for SSA {} impl FunctionForm for NonSSA {} -- cgit v1.3.1