summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Killinger <git@dank.anonaddy.com>2023-08-04 21:21:41 -0700
committerXusheng <xusheng@vector35.com>2023-08-10 11:57:16 +0800
commitb6ce48c4f5be4cd43482e1ff762e088fd11b7227 (patch)
treeeb417d7d1f9eefccc409c8335edc973d83886d6d
parent9772037768221179318765893565951370277480 (diff)
Add API to get all SSA versions of a variable for MLIL and HLIL
-rw-r--r--binaryninjaapi.h2
-rw-r--r--highlevelil.cpp14
-rw-r--r--mediumlevelil.cpp14
3 files changed, 30 insertions, 0 deletions
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<size_t> GetSSAMemoryUses(size_t version) const;
bool IsSSAVarLive(const SSAVariable& var) const;
+ std::set<size_t> GetVariableSSAVersions(const Variable& var) const;
std::set<size_t> GetVariableDefinitions(const Variable& var) const;
std::set<size_t> 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<size_t> GetVariableSSAVersions(const Variable& var) const;
std::set<size_t> GetVariableDefinitions(const Variable& var) const;
std::set<size_t> 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<size_t> HighLevelILFunction::GetVariableSSAVersions(const Variable& var) const
+{
+ size_t count;
+ size_t* versions = BNGetHighLevelILVariableSSAVersions(m_object, &var, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(versions[i]);
+
+ BNFreeILInstructionList(versions);
+ return result;
+}
+
+
set<size_t> 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<size_t> MediumLevelILFunction::GetVariableSSAVersions(const Variable& var) const
+{
+ size_t count;
+ size_t* versions = BNGetMediumLevelILVariableSSAVersions(m_object, &var, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(versions[i]);
+
+ BNFreeILInstructionList(versions);
+ return result;
+}
+
+
set<size_t> MediumLevelILFunction::GetVariableDefinitions(const Variable& var) const
{
size_t count;