summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-07-14 18:49:26 -0400
committerRusty Wagner <rusty@vector35.com>2017-07-14 18:49:26 -0400
commit18083837fe452a91e457f02ed8be2abf5fc66877 (patch)
tree0a87e12569ca3a981906b16c9555e89892c49112
parent35c65d909d1ec36a4a1bad7404c9f986e259f662 (diff)
Add API to get list of all definitions or uses of a variable
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h5
-rw-r--r--mediumlevelil.cpp28
-rw-r--r--python/mediumlevelil.py26
4 files changed, 62 insertions, 0 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index f079e7c0..20752370 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -2520,6 +2520,9 @@ namespace BinaryNinja
std::set<size_t> GetSSAVarUses(const Variable& var, size_t version) const;
std::set<size_t> GetSSAMemoryUses(size_t version) const;
+ std::set<size_t> GetVariableDefinitions(const Variable& var) const;
+ std::set<size_t> GetVariableUses(const Variable& var) const;
+
RegisterValue GetSSAVarValue(const Variable& var, size_t version);
RegisterValue GetExprValue(size_t expr);
PossibleValueSet GetPossibleSSAVarValues(const Variable& var, size_t version, size_t instr);
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 0414b512..e601cd1c 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2435,6 +2435,11 @@ extern "C"
BINARYNINJACOREAPI size_t* BNGetMediumLevelILSSAMemoryUses(BNMediumLevelILFunction* func,
size_t version, size_t* count);
+ BINARYNINJACOREAPI size_t* BNGetMediumLevelILVariableDefinitions(BNMediumLevelILFunction* func,
+ const BNVariable* var, size_t* count);
+ BINARYNINJACOREAPI size_t* BNGetMediumLevelILVariableUses(BNMediumLevelILFunction* func,
+ const BNVariable* var, size_t* count);
+
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILSSAVarValue(BNMediumLevelILFunction* func,
const BNVariable* var, size_t version);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILExprValue(BNMediumLevelILFunction* func, size_t expr);
diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp
index df78de2d..b4abaa72 100644
--- a/mediumlevelil.cpp
+++ b/mediumlevelil.cpp
@@ -313,6 +313,34 @@ set<size_t> MediumLevelILFunction::GetSSAMemoryUses(size_t version) const
}
+set<size_t> MediumLevelILFunction::GetVariableDefinitions(const Variable& var) const
+{
+ size_t count;
+ size_t* instrs = BNGetMediumLevelILVariableDefinitions(m_object, &var, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(instrs[i]);
+
+ BNFreeILInstructionList(instrs);
+ return result;
+}
+
+
+set<size_t> MediumLevelILFunction::GetVariableUses(const Variable& var) const
+{
+ size_t count;
+ size_t* instrs = BNGetMediumLevelILVariableUses(m_object, &var, &count);
+
+ set<size_t> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(instrs[i]);
+
+ BNFreeILInstructionList(instrs);
+ return result;
+}
+
+
RegisterValue MediumLevelILFunction::GetSSAVarValue(const Variable& var, size_t version)
{
BNRegisterValue value = BNGetMediumLevelILSSAVarValue(m_object, &var, version);
diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py
index 76a85a86..8a8d8d0b 100644
--- a/python/mediumlevelil.py
+++ b/python/mediumlevelil.py
@@ -793,6 +793,32 @@ class MediumLevelILFunction(object):
core.BNFreeILInstructionList(instrs)
return result
+ def get_var_definitions(self, var):
+ count = ctypes.c_ulonglong()
+ var_data = core.BNVariable()
+ var_data.type = var.source_type
+ var_data.index = var.index
+ var_data.storage = var.storage
+ instrs = core.BNGetMediumLevelILVariableDefinitions(self.handle, var_data, count)
+ result = []
+ for i in xrange(0, count.value):
+ result.append(instrs[i])
+ core.BNFreeILInstructionList(instrs)
+ return result
+
+ def get_var_uses(self, var):
+ count = ctypes.c_ulonglong()
+ var_data = core.BNVariable()
+ var_data.type = var.source_type
+ var_data.index = var.index
+ var_data.storage = var.storage
+ instrs = core.BNGetMediumLevelILVariableUses(self.handle, var_data, count)
+ result = []
+ for i in xrange(0, count.value):
+ result.append(instrs[i])
+ core.BNFreeILInstructionList(instrs)
+ return result
+
def get_ssa_var_value(self, ssa_var):
var_data = core.BNVariable()
var_data.type = ssa_var.var.source_type