diff options
| author | Rusty Wagner <rusty@vector35.com> | 2018-04-05 17:34:55 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2018-04-05 17:37:58 -0400 |
| commit | b15ea74b0b5e0afab9c935894eb39610408b6678 (patch) | |
| tree | c5a2ade13917be17f31f121ea746350f759295a6 | |
| parent | fa716fe2da53a4f136380b1f60197bd197b2793a (diff) | |
Add SSA variable liveness API for MLIL
| -rw-r--r-- | binaryninjaapi.h | 1 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | mediumlevelil.cpp | 6 | ||||
| -rw-r--r-- | python/mediumlevelil.py | 14 |
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() |
