summaryrefslogtreecommitdiff
path: root/rust/src/hlil/function.rs
diff options
context:
space:
mode:
authorMichael Krasnitski <michael.krasnitski@gmail.com>2024-02-11 15:27:22 -0500
committerKyle Martin <krm504@nyu.edu>2024-03-18 17:46:37 -0400
commit9939d850f0b8ccaf1ae048bcb5f788a6c3e606bf (patch)
tree91b582cd51820d826efcd5312e234e56617ca7f9 /rust/src/hlil/function.rs
parent970fe84875e2d6eed918f5bdc9ff689ef37b05ce (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.rs28
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>;