From 35b56762efa96a490ef9a5066cbe1eb3e704a68b Mon Sep 17 00:00:00 2001 From: KyleMiles Date: Mon, 23 Aug 2021 10:43:07 -0400 Subject: Add HighLevelILFunction::IsVarLiveAt and HighLevelILFunction::IsSSAVarLiveAt --- binaryninjaapi.h | 2 ++ binaryninjacore.h | 4 ++++ highlevelil.cpp | 12 ++++++++++++ python/highlevelil.py | 20 ++++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 6549c290..d08fea8a 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -4821,6 +4821,8 @@ __attribute__ ((format (printf, 1, 2))) std::set GetSSAVarUses(const SSAVariable& var) const; std::set GetSSAMemoryUses(size_t version) const; bool IsSSAVarLive(const SSAVariable& var) const; + bool IsSSAVarLiveAt(const SSAVariable& var, const size_t instr) const; + bool IsVarLiveAt(const Variable& var, const size_t instr) const; std::set GetVariableDefinitions(const Variable& var) const; std::set GetVariableUses(const Variable& var) const; diff --git a/binaryninjacore.h b/binaryninjacore.h index c3edce6c..8bbb4e0a 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -4586,6 +4586,10 @@ __attribute__ ((format (printf, 1, 2))) size_t version, size_t* count); BINARYNINJACOREAPI bool BNIsHighLevelILSSAVarLive(BNHighLevelILFunction* func, const BNVariable* var, size_t version); + BINARYNINJACOREAPI bool BNIsHighLevelILSSAVarLiveAt(BNHighLevelILFunction* func, + const BNVariable* var, const size_t version, const size_t instr); + BINARYNINJACOREAPI bool BNIsHighLevelILVarLiveAt(BNHighLevelILFunction* func, + const BNVariable* var, const size_t instr); BINARYNINJACOREAPI BNVariable* BNGetHighLevelILVariables(BNHighLevelILFunction* func, size_t* count); BINARYNINJACOREAPI size_t* BNGetHighLevelILVariableSSAVersions(BNHighLevelILFunction* func, const BNVariable* var, size_t * count); diff --git a/highlevelil.cpp b/highlevelil.cpp index f5b7fba2..8856b551 100644 --- a/highlevelil.cpp +++ b/highlevelil.cpp @@ -329,6 +329,18 @@ bool HighLevelILFunction::IsSSAVarLive(const SSAVariable& var) const } +bool HighLevelILFunction::IsSSAVarLiveAt(const SSAVariable& var, const size_t instr) const +{ + return BNIsHighLevelILSSAVarLiveAt(m_object, &var.var, var.version, instr); +} + + +bool HighLevelILFunction::IsVarLiveAt(const Variable& var, const size_t instr) const +{ + return BNIsHighLevelILVarLiveAt(m_object, &var, instr); +} + + set HighLevelILFunction::GetVariableDefinitions(const Variable& var) const { size_t count; diff --git a/python/highlevelil.py b/python/highlevelil.py index 881b3477..a71dc69c 100644 --- a/python/highlevelil.py +++ b/python/highlevelil.py @@ -2504,6 +2504,26 @@ class HighLevelILFunction: var_data = ssa_var.var.to_BNVariable() return core.BNIsHighLevelILSSAVarLive(self.handle, var_data, ssa_var.version) + def is_var_live_at(self, var: 'variable.Variable', instr: int) -> bool: + """ + ``is_var_live_at`` determines if ``var`` is live at a given point in the function + """ + var_data = core.BNVariable() + var_data.type = var.source_type + var_data.index = var.index + var_data.storage = var.storage + return core.BNIsHighLevelILVarLiveAt(self.handle, var_data, instr) + + def is_ssa_var_live_at(self, ssa_var: 'mediumlevelil.SSAVariable', instr: int) -> bool: + """ + ``is_ssa_var_live_at`` determines if ``ssa_var`` is live at a given point in the function; counts phi's as uses + """ + 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.BNIsHighLevelILSSAVarLiveAt(self.handle, var_data, ssa_var.version, instr) + def get_var_definitions(self, var:'variable.Variable') -> List[HighLevelILInstruction]: count = ctypes.c_ulonglong() var_data = var.to_BNVariable() -- cgit v1.3.1