From 47ed0c28ecac495b2ed4e30ba0264eebce8a10f6 Mon Sep 17 00:00:00 2001 From: Rubens Brandao Date: Tue, 21 May 2024 17:03:34 -0300 Subject: [PATCH] add `MediumLevelILFunction::generate_ssa_form` --- rust/src/mlil/function.rs | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/rust/src/mlil/function.rs b/rust/src/mlil/function.rs index 28705ad03..a2492f5d5 100644 --- a/rust/src/mlil/function.rs +++ b/rust/src/mlil/function.rs @@ -404,6 +404,51 @@ impl MediumLevelILFunction { pub fn finalize(&self) { unsafe { BNFinalizeMediumLevelILFunction(self.handle) } } + + /// Generate SSA form given the current MLIL + /// + /// * `analyze_conditionals` - whether or not to analyze conditionals + /// * `handle_aliases` - whether or not to handle aliases + /// * `known_not_aliases` - optional list of variables known to be not aliased + /// * `known_aliases` - optional list of variables known to be aliased + pub fn generate_ssa_form( + &self, + analyze_conditionals: bool, + handle_aliases: bool, + known_not_aliases: Option, + known_aliases: Option, + ) where + V1: IntoIterator, + V2: IntoIterator, + { + let mut known_not_aliases: Box<[_]> = known_not_aliases + .map(|x| x.into_iter().map(|x| x.raw()).collect()) + .unwrap_or_default(); + let mut known_aliases: Box<[_]> = known_aliases + .map(|x| x.into_iter().map(|x| x.raw()).collect()) + .unwrap_or_default(); + let (known_not_aliases_ptr, known_not_aliases_len) = if known_not_aliases.is_empty() { + (core::ptr::null_mut(), 0) + } else { + (known_not_aliases.as_mut_ptr(), known_not_aliases.len()) + }; + let (known_aliases_ptr, known_aliases_len) = if known_not_aliases.is_empty() { + (core::ptr::null_mut(), 0) + } else { + (known_aliases.as_mut_ptr(), known_aliases.len()) + }; + unsafe { + BNGenerateMediumLevelILSSAForm( + self.handle, + analyze_conditionals, + handle_aliases, + known_not_aliases_ptr, + known_not_aliases_len, + known_aliases_ptr, + known_aliases_len, + ) + } + } } impl ToOwned for MediumLevelILFunction {