From b6ce48c4f5be4cd43482e1ff762e088fd11b7227 Mon Sep 17 00:00:00 2001 From: Dan Killinger Date: Fri, 4 Aug 2023 21:21:41 -0700 Subject: Add API to get all SSA versions of a variable for MLIL and HLIL --- binaryninjaapi.h | 2 ++ highlevelil.cpp | 14 ++++++++++++++ mediumlevelil.cpp | 14 ++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 36490778..4bd32e83 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -11850,6 +11850,7 @@ namespace BinaryNinja { std::set GetSSAMemoryUses(size_t version) const; bool IsSSAVarLive(const SSAVariable& var) const; + std::set GetVariableSSAVersions(const Variable& var) const; std::set GetVariableDefinitions(const Variable& var) const; std::set GetVariableUses(const Variable& var) const; @@ -12162,6 +12163,7 @@ namespace BinaryNinja { bool IsSSAVarLiveAt(const SSAVariable& var, const size_t instr) const; bool IsVarLiveAt(const Variable& var, const size_t instr) const; + std::set GetVariableSSAVersions(const Variable& var) const; std::set GetVariableDefinitions(const Variable& var) const; std::set GetVariableUses(const Variable& var) const; size_t GetSSAVarVersionAtInstruction(const Variable& var, size_t instr) const; diff --git a/highlevelil.cpp b/highlevelil.cpp index 449dcfb9..7ac30f98 100644 --- a/highlevelil.cpp +++ b/highlevelil.cpp @@ -341,6 +341,20 @@ bool HighLevelILFunction::IsVarLiveAt(const Variable& var, const size_t instr) c } +set HighLevelILFunction::GetVariableSSAVersions(const Variable& var) const +{ + size_t count; + size_t* versions = BNGetHighLevelILVariableSSAVersions(m_object, &var, &count); + + set result; + for (size_t i = 0; i < count; i++) + result.insert(versions[i]); + + BNFreeILInstructionList(versions); + return result; +} + + set HighLevelILFunction::GetVariableDefinitions(const Variable& var) const { size_t count; diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp index 318d30f9..e4770eb0 100644 --- a/mediumlevelil.cpp +++ b/mediumlevelil.cpp @@ -504,6 +504,20 @@ bool MediumLevelILFunction::IsSSAVarLive(const SSAVariable& var) const } +set MediumLevelILFunction::GetVariableSSAVersions(const Variable& var) const +{ + size_t count; + size_t* versions = BNGetMediumLevelILVariableSSAVersions(m_object, &var, &count); + + set result; + for (size_t i = 0; i < count; i++) + result.insert(versions[i]); + + BNFreeILInstructionList(versions); + return result; +} + + set MediumLevelILFunction::GetVariableDefinitions(const Variable& var) const { size_t count; -- cgit v1.3.1