summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2018-04-05 17:34:55 -0400
committerRusty Wagner <rusty@vector35.com>2018-04-05 17:37:58 -0400
commitb15ea74b0b5e0afab9c935894eb39610408b6678 (patch)
treec5a2ade13917be17f31f121ea746350f759295a6
parentfa716fe2da53a4f136380b1f60197bd197b2793a (diff)
Add SSA variable liveness API for MLIL
-rw-r--r--binaryninjaapi.h1
-rw-r--r--binaryninjacore.h2
-rw-r--r--mediumlevelil.cpp6
-rw-r--r--python/mediumlevelil.py14
4 files changed, 23 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 81b5105d..05c8c4e3 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3230,6 +3230,7 @@ namespace BinaryNinja
size_t GetSSAMemoryDefinition(size_t version) const;
std::set<size_t> GetSSAVarUses(const SSAVariable& var) const;
std::set<size_t> GetSSAMemoryUses(size_t version) const;
+ bool IsSSAVarLive(const SSAVariable& var) const;
std::set<size_t> GetVariableDefinitions(const Variable& var) const;
std::set<size_t> GetVariableUses(const Variable& var) const;
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 69c5e61b..216301c0 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2830,6 +2830,8 @@ extern "C"
size_t version, size_t* count);
BINARYNINJACOREAPI size_t* BNGetMediumLevelILSSAMemoryUses(BNMediumLevelILFunction* func,
size_t version, size_t* count);
+ BINARYNINJACOREAPI bool BNIsMediumLevelILSSAVarLive(BNMediumLevelILFunction* func,
+ const BNVariable* var, size_t version);
BINARYNINJACOREAPI size_t* BNGetMediumLevelILVariableDefinitions(BNMediumLevelILFunction* func,
const BNVariable* var, size_t* count);
diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp
index 0a28bd49..1795a54d 100644
--- a/mediumlevelil.cpp
+++ b/mediumlevelil.cpp
@@ -486,6 +486,12 @@ set<size_t> MediumLevelILFunction::GetSSAMemoryUses(size_t version) const
}
+bool MediumLevelILFunction::IsSSAVarLive(const SSAVariable& var) const
+{
+ return BNIsMediumLevelILSSAVarLive(m_object, &var.var, var.version);
+}
+
+
set<size_t> MediumLevelILFunction::GetVariableDefinitions(const Variable& var) const
{
size_t count;
diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py
index caf19e8e..d87b5bf7 100644
--- a/python/mediumlevelil.py
+++ b/python/mediumlevelil.py
@@ -851,6 +851,20 @@ class MediumLevelILFunction(object):
core.BNFreeILInstructionList(instrs)
return result
+ def is_ssa_var_live(self, ssa_var):
+ """
+ ``is_ssa_var_live`` determines if ``ssa_var`` is live at any point in the function
+
+ :param SSAVariable ssa_var: the SSA variable to query
+ :return: whether the variable is live at any point in the function
+ :rtype: bool
+ """
+ var_data = core.BNVariable()
+ var_data.type = ssa_var.var.source_type
+ var_data.index = ssa_var.var.index
+ var_data.storage = ssa_var.var.storage
+ return core.BNIsMediumLevelILSSAVarLive(self.handle, var_data, ssa_var.version)
+
def get_var_definitions(self, var):
count = ctypes.c_ulonglong()
var_data = core.BNVariable()