summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-02-23 22:56:47 -0500
committerRusty Wagner <rusty@vector35.com>2017-02-23 22:56:47 -0500
commitba4bb6dbee0476d5c30d942ae978621af790d518 (patch)
tree854dc124db4895ff69bde99e630667c03ea8baf1 /python
parentdbe5606575f6b59b82eff2f9ab7b41990b57147e (diff)
Add APIs for definitions and uses of SSA variables
Diffstat (limited to 'python')
-rw-r--r--python/lowlevelil.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index 390e4210..564fef34 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -353,6 +353,14 @@ class LowLevelILFunction(object):
return None
return LowLevelILFunction(self.arch, result, self.source_function)
+ @property
+ def non_ssa_form(self):
+ """Low level IL in non-SSA (default) form (read-only)"""
+ result = core.BNGetLowLevelILNonSSAForm(self.handle)
+ if not result:
+ return None
+ return LowLevelILFunction(self.arch, result, self.source_function)
+
def __setattr__(self, name, value):
try:
object.__setattr__(self, name, value)
@@ -1327,6 +1335,57 @@ class LowLevelILFunction(object):
return None
return LowLevelILLabel(label)
+ def get_ssa_instruction_index(self, instr):
+ return core.BNGetLowLevelILSSAInstructionIndex(self.handle, instr)
+
+ def get_non_ssa_instruction_index(self, instr):
+ return core.BNGetLowLevelILNonSSAInstructionIndex(self.handle, instr)
+
+ def get_ssa_reg_definition(self, reg, index):
+ result = core.BNGetLowLevelILSSARegisterDefinition(self.handle, reg, index)
+ if result >= core.BNGetLowLevelILInstructionCount(self.handle):
+ return None
+ return result
+
+ def get_ssa_flag_definition(self, flag, index):
+ result = core.BNGetLowLevelILSSAFlagDefinition(self.handle, flag, index)
+ if result >= core.BNGetLowLevelILInstructionCount(self.handle):
+ return None
+ return result
+
+ def get_ssa_memory_definition(self, index):
+ result = core.BNGetLowLevelILSSAMemoryDefinition(self.handle, index)
+ if result >= core.BNGetLowLevelILInstructionCount(self.handle):
+ return None
+ return result
+
+ def get_ssa_reg_uses(self, reg, index):
+ count = ctypes.c_ulonglong()
+ instrs = core.BNGetLowLevelILSSARegisterUses(self.handle, reg, index, count)
+ result = []
+ for i in xrange(0, count.value):
+ result.append(instrs[i])
+ core.BNFreeLowLevelILInstructionList(instrs)
+ return result
+
+ def get_ssa_flag_uses(self, flag, index):
+ count = ctypes.c_ulonglong()
+ instrs = core.BNGetLowLevelILSSAFlagUses(self.handle, flag, index, count)
+ result = []
+ for i in xrange(0, count.value):
+ result.append(instrs[i])
+ core.BNFreeLowLevelILInstructionList(instrs)
+ return result
+
+ def get_ssa_memory_uses(self, index):
+ count = ctypes.c_ulonglong()
+ instrs = core.BNGetLowLevelILSSAMemoryUses(self.handle, index, count)
+ result = []
+ for i in xrange(0, count.value):
+ result.append(instrs[i])
+ core.BNFreeLowLevelILInstructionList(instrs)
+ return result
+
class LowLevelILBasicBlock(basicblock.BasicBlock):
def __init__(self, view, handle, owner):