From 59b73aa1834d5f558595a888411c70a4fac31a3f Mon Sep 17 00:00:00 2001 From: Mason Reed <35282038+emesare@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:18:28 -0500 Subject: [Rust] Add `LowLevelILSSARegister` type (#7745) --- rust/src/low_level_il/function.rs | 33 ++++++++++----------------------- rust/src/low_level_il/operation.rs | 12 ++++++------ 2 files changed, 16 insertions(+), 29 deletions(-) (limited to 'rust/src/low_level_il') diff --git a/rust/src/low_level_il/function.rs b/rust/src/low_level_il/function.rs index 837b45ef..bd5332ea 100644 --- a/rust/src/low_level_il/function.rs +++ b/rust/src/low_level_il/function.rs @@ -299,19 +299,16 @@ impl LowLevelILFunction { #[must_use] pub fn get_ssa_register_uses( &self, - reg: LowLevelILSSARegisterKind, + reg: impl AsRef>, ) -> Vec> { use binaryninjacore_sys::BNGetLowLevelILSSARegisterUses; - let register_id = match reg { - LowLevelILSSARegisterKind::Full { kind, .. } => kind.id(), - LowLevelILSSARegisterKind::Partial { partial_reg, .. } => partial_reg.id(), - }; + let reg = reg.as_ref(); let mut count = 0; let instrs = unsafe { BNGetLowLevelILSSARegisterUses( self.handle, - register_id.into(), - reg.version() as usize, + reg.id().into(), + reg.version as usize, &mut count, ) }; @@ -327,19 +324,12 @@ impl LowLevelILFunction { #[must_use] pub fn get_ssa_register_definition( &self, - reg: &LowLevelILSSARegisterKind, + reg: impl AsRef>, ) -> Option> { use binaryninjacore_sys::BNGetLowLevelILSSARegisterDefinition; - let register_id = match reg { - LowLevelILSSARegisterKind::Full { kind, .. } => kind.id(), - LowLevelILSSARegisterKind::Partial { partial_reg, .. } => partial_reg.id(), - }; + let reg = reg.as_ref(); let instr_idx = unsafe { - BNGetLowLevelILSSARegisterDefinition( - self.handle, - register_id.into(), - reg.version() as usize, - ) + BNGetLowLevelILSSARegisterDefinition(self.handle, reg.id().into(), reg.version as usize) }; self.instruction_from_index(LowLevelInstructionIndex(instr_idx)) } @@ -348,14 +338,11 @@ impl LowLevelILFunction { #[must_use] pub fn get_ssa_register_value( &self, - reg: &LowLevelILSSARegisterKind, + reg: impl AsRef>, ) -> Option { - let register_id = match reg { - LowLevelILSSARegisterKind::Full { kind, .. } => kind.id(), - LowLevelILSSARegisterKind::Partial { partial_reg, .. } => partial_reg.id(), - }; + let reg = reg.as_ref(); let value = unsafe { - BNGetLowLevelILSSARegisterValue(self.handle, register_id.into(), reg.version() as usize) + BNGetLowLevelILSSARegisterValue(self.handle, reg.id().into(), reg.version as usize) }; if value.state == BNRegisterValueType::UndeterminedValue { return None; diff --git a/rust/src/low_level_il/operation.rs b/rust/src/low_level_il/operation.rs index fa320060..2f081b5e 100644 --- a/rust/src/low_level_il/operation.rs +++ b/rust/src/low_level_il/operation.rs @@ -413,11 +413,11 @@ where let full_raw_id = RegisterId(self.op.operands[0] as u32); let version = self.op.operands[1] as u32; let partial_raw_id = RegisterId(self.op.operands[2] as u32); - let full_reg = - CoreRegister::new(self.function.arch(), full_raw_id).expect("Bad register ID"); + let full_reg_kind = LowLevelILRegisterKind::from_raw(&self.function.arch(), full_raw_id) + .expect("Bad register ID"); let partial_reg = CoreRegister::new(self.function.arch(), partial_raw_id).expect("Bad register ID"); - LowLevelILSSARegisterKind::new_partial(full_reg, partial_reg, version) + LowLevelILSSARegisterKind::new_partial(full_reg_kind, version, partial_reg) } pub fn source_expr(&self) -> LowLevelILExpression<'func, M, F, ValueExpr> { @@ -868,11 +868,11 @@ where let full_raw_id = RegisterId(self.op.operands[0] as u32); let version = self.op.operands[1] as u32; let partial_raw_id = RegisterId(self.op.operands[2] as u32); - let full_reg = - CoreRegister::new(self.function.arch(), full_raw_id).expect("Bad register ID"); + let full_reg_kind = LowLevelILRegisterKind::from_raw(&self.function.arch(), full_raw_id) + .expect("Bad register ID"); let partial_reg = CoreRegister::new(self.function.arch(), partial_raw_id).expect("Bad register ID"); - LowLevelILSSARegisterKind::new_partial(full_reg, partial_reg, version) + LowLevelILSSARegisterKind::new_partial(full_reg_kind, version, partial_reg) } } -- cgit v1.3.1