From f682ca69b356755fe6c06bcdd8f4fab73f7d2c78 Mon Sep 17 00:00:00 2001 From: Rubens Brandao Date: Wed, 22 Nov 2023 18:57:28 -0300 Subject: Rust API : Add HLIL Bindings --- rust/src/hlil/block.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 rust/src/hlil/block.rs (limited to 'rust/src/hlil/block.rs') diff --git a/rust/src/hlil/block.rs b/rust/src/hlil/block.rs new file mode 100644 index 00000000..a90429a4 --- /dev/null +++ b/rust/src/hlil/block.rs @@ -0,0 +1,63 @@ +use std::ops::Range; + +use binaryninjacore_sys::BNGetHighLevelILIndexForInstruction; + +use crate::basicblock::{BasicBlock, BlockContext}; +use crate::rc::Ref; + +use super::{HighLevelILFunction, HighLevelILInstruction}; + +pub struct HighLevelILBlockIter { + function: Ref, + range: Range, +} + +impl Iterator for HighLevelILBlockIter { + type Item = HighLevelILInstruction; + + fn next(&mut self) -> Option { + self.range + .next() + .map(|i| unsafe { + BNGetHighLevelILIndexForInstruction(self.function.handle, i as usize) + }) + .map(|i| HighLevelILInstruction::new(&self.function, i)) + } +} + +pub struct HighLevelILBlock { + pub(crate) function: Ref, +} + +impl core::fmt::Debug for HighLevelILBlock { + fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + write!(f, "mlil_bb {:?}", self.function) + } +} + +impl BlockContext for HighLevelILBlock { + type Iter = HighLevelILBlockIter; + type Instruction = HighLevelILInstruction; + + fn start(&self, block: &BasicBlock) -> HighLevelILInstruction { + let expr_idx = unsafe { + BNGetHighLevelILIndexForInstruction(self.function.handle, block.raw_start() as usize) + }; + HighLevelILInstruction::new(&self.function, expr_idx) + } + + fn iter(&self, block: &BasicBlock) -> HighLevelILBlockIter { + HighLevelILBlockIter { + function: self.function.to_owned(), + range: block.raw_start()..block.raw_end(), + } + } +} + +impl Clone for HighLevelILBlock { + fn clone(&self) -> Self { + HighLevelILBlock { + function: self.function.to_owned(), + } + } +} -- cgit v1.3.1