diff options
| author | Michael Krasnitski <michael.krasnitski@gmail.com> | 2024-02-11 15:27:22 -0500 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2024-03-18 17:46:37 -0400 |
| commit | 9939d850f0b8ccaf1ae048bcb5f788a6c3e606bf (patch) | |
| tree | 91b582cd51820d826efcd5312e234e56617ca7f9 /rust/src/hlil/function.rs | |
| parent | 970fe84875e2d6eed918f5bdc9ff689ef37b05ce (diff) | |
Refactor HLIL instructions
Similar to MLIL. Also, reintroduce `LiftedJump` and `LiftedLabel` types.
Diffstat (limited to 'rust/src/hlil/function.rs')
| -rw-r--r-- | rust/src/hlil/function.rs | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/rust/src/hlil/function.rs b/rust/src/hlil/function.rs index 40d01dfe..cef23784 100644 --- a/rust/src/hlil/function.rs +++ b/rust/src/hlil/function.rs @@ -2,17 +2,20 @@ use std::hash::{Hash, Hasher}; use binaryninjacore_sys::BNFreeHighLevelILFunction; use binaryninjacore_sys::BNGetHighLevelILBasicBlockList; +use binaryninjacore_sys::BNGetHighLevelILByIndex; use binaryninjacore_sys::BNGetHighLevelILInstructionCount; use binaryninjacore_sys::BNGetHighLevelILOwnerFunction; use binaryninjacore_sys::BNGetHighLevelILSSAForm; use binaryninjacore_sys::BNHighLevelILFunction; +use binaryninjacore_sys::BNHighLevelILInstruction; +use binaryninjacore_sys::BNHighLevelILOperation; use binaryninjacore_sys::BNNewHighLevelILFunctionReference; use crate::basicblock::BasicBlock; -use crate::function::Function; +use crate::function::{Function, ILFunction}; use crate::rc::{Array, Ref, RefCountable}; -use super::{HighLevelILBlock, HighLevelILInstruction}; +use super::{HighLevelILBlock, HighLevelILInstruction, HighLevelILLiftedInstruction}; pub struct HighLevelILFunction { pub(crate) full_ast: bool, @@ -45,7 +48,11 @@ impl HighLevelILFunction { } pub fn instruction_from_idx(&self, expr_idx: usize) -> HighLevelILInstruction { - HighLevelILInstruction::new(self, expr_idx) + HighLevelILInstruction::new(self.to_owned(), expr_idx) + } + + pub fn lifted_instruction_from_idx(&self, expr_idx: usize) -> HighLevelILLiftedInstruction { + self.instruction_from_idx(expr_idx).lift() } pub fn instruction_count(&self) -> usize { @@ -79,6 +86,21 @@ impl HighLevelILFunction { } } +impl ILFunction for HighLevelILFunction { + type BNInstruction = BNHighLevelILInstruction; + type Instruction = HighLevelILInstruction; + + fn il_instruction_from_idx(&self, expr_idx: usize) -> Self::Instruction { + self.instruction_from_idx(expr_idx) + } + + fn operands_from_idx(&self, expr_idx: usize) -> [u64; 5] { + let node = unsafe { BNGetHighLevelILByIndex(self.handle, expr_idx, self.full_ast) }; + assert_eq!(node.operation, BNHighLevelILOperation::HLIL_UNDEF); + node.operands + } +} + impl ToOwned for HighLevelILFunction { type Owned = Ref<Self>; |
