summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binaryninjaapi.h2
-rw-r--r--binaryninjacore.h2
-rw-r--r--lowlevelil.cpp12
-rw-r--r--python/lowlevelil.py28
4 files changed, 43 insertions, 1 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 83d12d21..d69fec0d 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -2464,6 +2464,8 @@ namespace BinaryNinja
Ref<MediumLevelILFunction> GetMediumLevelIL() const;
Ref<MediumLevelILFunction> GetMappedMediumLevelIL() const;
+ size_t GetMediumLevelILInstructionIndex(size_t instr) const;
+ size_t GetMediumLevelILExprIndex(size_t expr) const;
size_t GetMappedMediumLevelILInstructionIndex(size_t instr) const;
size_t GetMappedMediumLevelILExprIndex(size_t expr) const;
};
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 01c78ff4..bcd5fbbf 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2386,6 +2386,8 @@ extern "C"
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMediumLevelILForLowLevelIL(BNLowLevelILFunction* func);
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMappedMediumLevelIL(BNLowLevelILFunction* func);
+ BINARYNINJACOREAPI size_t BNGetMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
+ BINARYNINJACOREAPI size_t BNGetMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILInstructionIndex(BNLowLevelILFunction* func, size_t instr);
BINARYNINJACOREAPI size_t BNGetMappedMediumLevelILExprIndex(BNLowLevelILFunction* func, size_t expr);
diff --git a/lowlevelil.cpp b/lowlevelil.cpp
index 4ff16a05..0cb733ac 100644
--- a/lowlevelil.cpp
+++ b/lowlevelil.cpp
@@ -955,6 +955,18 @@ Ref<MediumLevelILFunction> LowLevelILFunction::GetMappedMediumLevelIL() const
}
+size_t LowLevelILFunction::GetMediumLevelILInstructionIndex(size_t instr) const
+{
+ return BNGetMediumLevelILInstructionIndex(m_object, instr);
+}
+
+
+size_t LowLevelILFunction::GetMediumLevelILExprIndex(size_t expr) const
+{
+ return BNGetMediumLevelILExprIndex(m_object, expr);
+}
+
+
size_t LowLevelILFunction::GetMappedMediumLevelILInstructionIndex(size_t instr) const
{
return BNGetMappedMediumLevelILInstructionIndex(m_object, instr);
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index 62e33a75..08ca04e6 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -328,8 +328,16 @@ class LowLevelILInstruction(object):
core.BNGetLowLevelILNonSSAExprIndex(self.function.handle, self.expr_index))
@property
+ def medium_level_il(self):
+ """Gets the medium level IL expression corresponding to this expression (may be None for eliminated instructions)"""
+ expr = self.function.get_medium_level_il_expr_index(self.expr_index)
+ if expr is None:
+ return None
+ return mediumlevelil.MediumLevelILInstruction(self.function.medium_level_il, expr)
+
+ @property
def mapped_medium_level_il(self):
- """Gets the medium level IL expression corresponding to this expression"""
+ """Gets the mapped medium level IL expression corresponding to this expression"""
expr = self.function.get_mapped_medium_level_il_expr_index(self.expr_index)
if expr is None:
return None
@@ -1652,6 +1660,24 @@ class LowLevelILFunction(object):
result = function.RegisterValue(self.arch, value)
return result
+ def get_medium_level_il_instruction_index(self, instr):
+ med_il = self.medium_level_il
+ if med_il is None:
+ return None
+ result = core.BNGetMediumLevelILInstructionIndex(self.handle, instr)
+ if result >= core.BNGetMediumLevelILInstructionCount(med_il.handle):
+ return None
+ return result
+
+ def get_medium_level_il_expr_index(self, expr):
+ med_il = self.medium_level_il
+ if med_il is None:
+ return None
+ result = core.BNGetMediumLevelILExprIndex(self.handle, expr)
+ if result >= core.BNGetMediumLevelILExprCount(med_il.handle):
+ return None
+ return result
+
def get_mapped_medium_level_il_instruction_index(self, instr):
med_il = self.mapped_medium_level_il
if med_il is None: