summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2021-08-23 10:43:07 -0400
committerKyleMiles <krm504@nyu.edu>2021-10-21 18:49:41 -0400
commit35b56762efa96a490ef9a5066cbe1eb3e704a68b (patch)
treeba8a4ec86bd1ddff857b8f25d04248c7f2ae81f2
parent5bb20da936a412f69c9e32ebed5c7ad9f7e4abaa (diff)
Add HighLevelILFunction::IsVarLiveAt and HighLevelILFunction::IsSSAVarLiveAt
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h4
-rw-r--r--highlevelil.cpp12
-rw-r--r--python/highlevelil.py20
4 files changed, 38 insertions, 0 deletions
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<size_t> GetSSAVarUses(const SSAVariable& var) const;
std::set<size_t> 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<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 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<size_t> 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()