summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-03-22 22:43:16 -0400
committerRusty Wagner <rusty@vector35.com>2017-03-22 22:43:16 -0400
commitcb244a62fea649d6840b70b8e7fe7953eb3acc5a (patch)
tree6d9a49f2c262cfc2680cbf85124ff08b2e014297
parenta2992eb4a48dc38b60989f34f51812245a6239c4 (diff)
Adding new value object to hold disjoint sets
-rw-r--r--binaryninjaapi.h46
-rw-r--r--binaryninjacore.h60
-rw-r--r--function.cpp27
-rw-r--r--lowlevelil.cpp42
-rw-r--r--mediumlevelil.cpp48
-rw-r--r--python/function.py86
-rw-r--r--python/lowlevelil.py37
-rw-r--r--python/mediumlevelil.py37
8 files changed, 223 insertions, 160 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 131d6a17..af0cf5ce 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -1853,14 +1853,22 @@ namespace BinaryNinja
struct RegisterValue
{
BNRegisterValueType state;
- uint32_t reg; // For EntryValue and OffsetFromEntryValue, the original input register
- int64_t value; // Offset for OffsetFromEntryValue, StackFrameOffset or RangeValue, value of register for ConstantValue
- uint64_t rangeStart, rangeEnd, rangeStep; // Range of register, inclusive
- std::vector<LookupTableEntry> table;
+ int64_t value;
static RegisterValue FromAPIObject(BNRegisterValue& value);
};
+ struct PossibleValueSet
+ {
+ BNRegisterValueType state;
+ int64_t value;
+ std::vector<BNValueRange> ranges;
+ std::set<int64_t> valueSet;
+ std::vector<LookupTableEntry> table;
+
+ static PossibleValueSet FromAPIObject(BNPossibleValueSet& value);
+ };
+
class FunctionGraph;
class MediumLevelILFunction;
@@ -2179,20 +2187,20 @@ namespace BinaryNinja
RegisterValue GetSSAFlagValue(uint32_t flag, size_t idx);
RegisterValue GetExprValue(size_t expr);
- RegisterValue GetPossibleExprValues(size_t expr);
+ PossibleValueSet GetPossibleExprValues(size_t expr);
RegisterValue GetRegisterValueAtInstruction(uint32_t reg, size_t instr);
RegisterValue GetRegisterValueAfterInstruction(uint32_t reg, size_t instr);
- RegisterValue GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr);
- RegisterValue GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr);
+ PossibleValueSet GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr);
+ PossibleValueSet GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr);
RegisterValue GetFlagValueAtInstruction(uint32_t flag, size_t instr);
RegisterValue GetFlagValueAfterInstruction(uint32_t flag, size_t instr);
- RegisterValue GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr);
- RegisterValue GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr);
+ PossibleValueSet GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr);
+ PossibleValueSet GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr);
RegisterValue GetStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
RegisterValue GetStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
- RegisterValue GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
- RegisterValue GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
+ PossibleValueSet GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
+ PossibleValueSet GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
Ref<MediumLevelILFunction> GetMediumLevelIL() const;
Ref<MediumLevelILFunction> GetMappedMediumLevelIL() const;
@@ -2277,8 +2285,8 @@ namespace BinaryNinja
RegisterValue GetSSAVarValue(const BNILVariable& var, size_t idx);
RegisterValue GetExprValue(size_t expr);
- RegisterValue GetPossibleSSAVarValues(const BNILVariable& var, size_t idx, size_t instr);
- RegisterValue GetPossibleExprValues(size_t expr);
+ PossibleValueSet GetPossibleSSAVarValues(const BNILVariable& var, size_t idx, size_t instr);
+ PossibleValueSet GetPossibleExprValues(size_t expr);
size_t GetSSAVarIndexAtInstruction(const BNILVariable& var, size_t instr) const;
size_t GetSSAMemoryIndexAtInstruction(size_t instr) const;
@@ -2288,16 +2296,16 @@ namespace BinaryNinja
RegisterValue GetRegisterValueAtInstruction(uint32_t reg, size_t instr);
RegisterValue GetRegisterValueAfterInstruction(uint32_t reg, size_t instr);
- RegisterValue GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr);
- RegisterValue GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr);
+ PossibleValueSet GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr);
+ PossibleValueSet GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr);
RegisterValue GetFlagValueAtInstruction(uint32_t flag, size_t instr);
RegisterValue GetFlagValueAfterInstruction(uint32_t flag, size_t instr);
- RegisterValue GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr);
- RegisterValue GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr);
+ PossibleValueSet GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr);
+ PossibleValueSet GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr);
RegisterValue GetStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
RegisterValue GetStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
- RegisterValue GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
- RegisterValue GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
+ PossibleValueSet GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr);
+ PossibleValueSet GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr);
BNILBranchDependence GetBranchDependenceAtInstruction(size_t curInstr, size_t branchInstr) const;
std::map<size_t, BNILBranchDependence> GetAllBranchDependenceAtInstruction(size_t instr) const;
diff --git a/binaryninjacore.h b/binaryninjacore.h
index feea147d..c43c9b21 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -600,14 +600,18 @@ extern "C"
enum BNRegisterValueType
{
+ UndeterminedValue,
EntryValue,
ConstantValue,
StackFrameOffset,
- UndeterminedValue,
+ ReturnAddressValue,
+
+ // The following are only valid in BNPossibleValueSet
SignedRangeValue,
UnsignedRangeValue,
LookupTableValue,
- ReturnAddressValue
+ InSetOfValues,
+ NotInSetOfValues
};
struct BNLookupTableEntry
@@ -620,10 +624,22 @@ extern "C"
struct BNRegisterValue
{
BNRegisterValueType state;
- uint32_t reg; // For EntryValue and OffsetFromEntryValue, the original input register
- int64_t value; // Offset for OffsetFromEntryValue, StackFrameOffset or RangeValue, value of register for ConstantValue
- uint64_t rangeStart, rangeEnd, rangeStep; // Range of register, inclusive
- BNLookupTableEntry* table; // Number of entries in rangeEnd
+ int64_t value;
+ };
+
+ struct BNValueRange
+ {
+ uint64_t start, end, step;
+ };
+
+ struct BNPossibleValueSet
+ {
+ BNRegisterValueType state;
+ int64_t value;
+ BNValueRange* ranges;
+ int64_t* valueSet;
+ BNLookupTableEntry* table;
+ size_t count;
};
struct BNRegisterOrConstant
@@ -1852,7 +1868,7 @@ extern "C"
uint64_t addr, BNType* functionType, size_t i);
BINARYNINJACOREAPI BNRegisterValue BNGetParameterValueAtLowLevelILInstruction(BNFunction* func, size_t instr,
BNType* functionType, size_t i);
- BINARYNINJACOREAPI void BNFreeRegisterValue(BNRegisterValue* value);
+ BINARYNINJACOREAPI void BNFreePossibleValueSet(BNPossibleValueSet* value);
BINARYNINJACOREAPI uint32_t* BNGetRegistersReadByInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
size_t* count);
BINARYNINJACOREAPI uint32_t* BNGetRegistersWrittenByInstruction(BNFunction* func, BNArchitecture* arch, uint64_t addr,
@@ -2176,31 +2192,31 @@ extern "C"
uint32_t flag, size_t idx);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILExprValue(BNLowLevelILFunction* func, size_t expr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleExprValues(BNLowLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleExprValues(BNLowLevelILFunction* func, size_t expr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILRegisterValueAtInstruction(BNLowLevelILFunction* func,
uint32_t reg, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILRegisterValueAfterInstruction(BNLowLevelILFunction* func,
uint32_t reg, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleRegisterValuesAtInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleRegisterValuesAtInstruction(BNLowLevelILFunction* func,
uint32_t reg, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleRegisterValuesAfterInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleRegisterValuesAfterInstruction(BNLowLevelILFunction* func,
uint32_t reg, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILFlagValueAtInstruction(BNLowLevelILFunction* func,
uint32_t flag, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILFlagValueAfterInstruction(BNLowLevelILFunction* func,
uint32_t flag, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleFlagValuesAtInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleFlagValuesAtInstruction(BNLowLevelILFunction* func,
uint32_t flag, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleFlagValuesAfterInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleFlagValuesAfterInstruction(BNLowLevelILFunction* func,
uint32_t flag, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILStackContentsAtInstruction(BNLowLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILStackContentsAfterInstruction(BNLowLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleStackContentsAtInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleStackContentsAtInstruction(BNLowLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetLowLevelILPossibleStackContentsAfterInstruction(BNLowLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetLowLevelILPossibleStackContentsAfterInstruction(BNLowLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
BINARYNINJACOREAPI BNMediumLevelILFunction* BNGetMediumLevelILForLowLevelIL(BNLowLevelILFunction* func);
@@ -2266,9 +2282,9 @@ extern "C"
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILSSAVarValue(BNMediumLevelILFunction* func,
const BNILVariable* var, size_t idx);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILExprValue(BNMediumLevelILFunction* func, size_t expr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleSSAVarValues(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleSSAVarValues(BNMediumLevelILFunction* func,
const BNILVariable* var, size_t idx, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleExprValues(BNMediumLevelILFunction* func, size_t expr);
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleExprValues(BNMediumLevelILFunction* func, size_t expr);
BINARYNINJACOREAPI size_t BNGetMediumLevelILSSAVarIndexAtILInstruction(BNMediumLevelILFunction* func,
const BNILVariable* var, size_t instr);
@@ -2285,25 +2301,25 @@ extern "C"
uint32_t reg, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILRegisterValueAfterInstruction(BNMediumLevelILFunction* func,
uint32_t reg, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleRegisterValuesAtInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleRegisterValuesAtInstruction(BNMediumLevelILFunction* func,
uint32_t reg, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(BNMediumLevelILFunction* func,
uint32_t reg, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILFlagValueAtInstruction(BNMediumLevelILFunction* func,
uint32_t flag, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILFlagValueAfterInstruction(BNMediumLevelILFunction* func,
uint32_t flag, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleFlagValuesAtInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleFlagValuesAtInstruction(BNMediumLevelILFunction* func,
uint32_t flag, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleFlagValuesAfterInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleFlagValuesAfterInstruction(BNMediumLevelILFunction* func,
uint32_t flag, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILStackContentsAtInstruction(BNMediumLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILStackContentsAfterInstruction(BNMediumLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleStackContentsAtInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleStackContentsAtInstruction(BNMediumLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
- BINARYNINJACOREAPI BNRegisterValue BNGetMediumLevelILPossibleStackContentsAfterInstruction(BNMediumLevelILFunction* func,
+ BINARYNINJACOREAPI BNPossibleValueSet BNGetMediumLevelILPossibleStackContentsAfterInstruction(BNMediumLevelILFunction* func,
int64_t offset, size_t len, size_t instr);
BINARYNINJACOREAPI BNILBranchDependence BNGetMediumLevelILBranchDependence(BNMediumLevelILFunction* func,
diff --git a/function.cpp b/function.cpp
index aa56f7af..16ad1f1c 100644
--- a/function.cpp
+++ b/function.cpp
@@ -170,14 +170,19 @@ RegisterValue RegisterValue::FromAPIObject(BNRegisterValue& value)
{
RegisterValue result;
result.state = value.state;
- result.reg = value.reg;
result.value = value.value;
- result.rangeStart = value.rangeStart;
- result.rangeEnd = value.rangeEnd;
- result.rangeStep = value.rangeStep;
+ return result;
+}
+
+
+PossibleValueSet PossibleValueSet::FromAPIObject(BNPossibleValueSet& value)
+{
+ PossibleValueSet result;
+ result.state = value.state;
+ result.value = value.value;
if (value.state == LookupTableValue)
{
- for (size_t i = 0; i < (size_t)value.rangeEnd; i++)
+ for (size_t i = 0; i < value.count; i++)
{
LookupTableEntry entry;
entry.fromValues.insert(entry.fromValues.end(), &value.table[i].fromValues[0],
@@ -186,7 +191,17 @@ RegisterValue RegisterValue::FromAPIObject(BNRegisterValue& value)
result.table.push_back(entry);
}
}
- BNFreeRegisterValue(&value);
+ else if ((value.state == SignedRangeValue) || (value.state == UnsignedRangeValue))
+ {
+ for (size_t i = 0; i < value.count; i++)
+ result.ranges.push_back(value.ranges[i]);
+ }
+ else if ((value.state == InSetOfValues) || (value.state == NotInSetOfValues))
+ {
+ for (size_t i = 0; i < value.count; i++)
+ result.valueSet.insert(value.valueSet[i]);
+ }
+ BNFreePossibleValueSet(&value);
return result;
}
diff --git a/lowlevelil.cpp b/lowlevelil.cpp
index 54e26498..9764445e 100644
--- a/lowlevelil.cpp
+++ b/lowlevelil.cpp
@@ -780,10 +780,10 @@ RegisterValue LowLevelILFunction::GetExprValue(size_t expr)
}
-RegisterValue LowLevelILFunction::GetPossibleExprValues(size_t expr)
+PossibleValueSet LowLevelILFunction::GetPossibleExprValues(size_t expr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleExprValues(m_object, expr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleExprValues(m_object, expr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -801,17 +801,17 @@ RegisterValue LowLevelILFunction::GetRegisterValueAfterInstruction(uint32_t reg,
}
-RegisterValue LowLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue LowLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -829,17 +829,17 @@ RegisterValue LowLevelILFunction::GetFlagValueAfterInstruction(uint32_t flag, si
}
-RegisterValue LowLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue LowLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -857,17 +857,17 @@ RegisterValue LowLevelILFunction::GetStackContentsAfterInstruction(int32_t offse
}
-RegisterValue LowLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue LowLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr)
+PossibleValueSet LowLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr)
{
- BNRegisterValue value = BNGetLowLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetLowLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
diff --git a/mediumlevelil.cpp b/mediumlevelil.cpp
index bb629e64..b0eb83a1 100644
--- a/mediumlevelil.cpp
+++ b/mediumlevelil.cpp
@@ -450,17 +450,17 @@ RegisterValue MediumLevelILFunction::GetExprValue(size_t expr)
}
-RegisterValue MediumLevelILFunction::GetPossibleSSAVarValues(const BNILVariable& var, size_t idx, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleSSAVarValues(const BNILVariable& var, size_t idx, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleSSAVarValues(m_object, &var, idx, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleSSAVarValues(m_object, &var, idx, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue MediumLevelILFunction::GetPossibleExprValues(size_t expr)
+PossibleValueSet MediumLevelILFunction::GetPossibleExprValues(size_t expr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleExprValues(m_object, expr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleExprValues(m_object, expr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -508,17 +508,17 @@ RegisterValue MediumLevelILFunction::GetRegisterValueAfterInstruction(uint32_t r
}
-RegisterValue MediumLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAtInstruction(uint32_t reg, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAtInstruction(m_object, reg, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue MediumLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleRegisterValuesAfterInstruction(uint32_t reg, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(m_object, reg, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -536,17 +536,17 @@ RegisterValue MediumLevelILFunction::GetFlagValueAfterInstruction(uint32_t flag,
}
-RegisterValue MediumLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAtInstruction(uint32_t flag, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAtInstruction(m_object, flag, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue MediumLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleFlagValuesAfterInstruction(uint32_t flag, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleFlagValuesAfterInstruction(m_object, flag, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
@@ -564,17 +564,17 @@ RegisterValue MediumLevelILFunction::GetStackContentsAfterInstruction(int32_t of
}
-RegisterValue MediumLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAtInstruction(int32_t offset, size_t len, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAtInstruction(m_object, offset, len, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
-RegisterValue MediumLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr)
+PossibleValueSet MediumLevelILFunction::GetPossibleStackContentsAfterInstruction(int32_t offset, size_t len, size_t instr)
{
- BNRegisterValue value = BNGetMediumLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr);
- return RegisterValue::FromAPIObject(value);
+ BNPossibleValueSet value = BNGetMediumLevelILPossibleStackContentsAfterInstruction(m_object, offset, len, instr);
+ return PossibleValueSet::FromAPIObject(value);
}
diff --git a/python/function.py b/python/function.py
index a507534c..51d61792 100644
--- a/python/function.py
+++ b/python/function.py
@@ -51,34 +51,78 @@ class RegisterValue(object):
def __init__(self, arch, value):
self.type = RegisterValueType(value.state)
if value.state == RegisterValueType.EntryValue:
- self.reg = arch.get_reg_name(value.reg)
+ self.reg = arch.get_reg_name(value.value)
+ elif value.state == RegisterValueType.ConstantValue:
+ self.value = value.value
+ elif value.state == RegisterValueType.StackFrameOffset:
+ self.offset = value.value
+
+ def __repr__(self):
+ if self.type == RegisterValueType.EntryValue:
+ return "<entry %s>" % self.reg
+ if self.type == RegisterValueType.ConstantValue:
+ return "<const %#x>" % self.value
+ if self.type == RegisterValueType.StackFrameOffset:
+ return "<stack frame offset %#x>" % self.offset
+ if self.type == RegisterValueType.ReturnAddressValue:
+ return "<return address>"
+ return "<undetermined>"
+
+
+class ValueRange(object):
+ def __init__(self, start, end, step):
+ self.start = start
+ self.end = end
+ self.step = step
+
+ def __repr__(self):
+ if self.step == 1:
+ return "<range: %#x to %#x>" % (self.start, self.end)
+ return "<range: %#x to %#x, step %#x>" % (self.start, self.end, self.step)
+
+
+class PossibleValueSet(object):
+ def __init__(self, arch, value):
+ self.type = RegisterValueType(value.state)
+ if value.state == RegisterValueType.EntryValue:
+ self.reg = arch.get_reg_name(value.value)
elif value.state == RegisterValueType.ConstantValue:
self.value = value.value
elif value.state == RegisterValueType.StackFrameOffset:
self.offset = value.value
elif value.state == RegisterValueType.SignedRangeValue:
self.offset = value.value
- self.start = value.rangeStart
- self.end = value.rangeEnd
- self.step = value.rangeStep
- if self.start & (1 << 63):
- self.start |= ~((1 << 63) - 1)
- if self.end & (1 << 63):
- self.end |= ~((1 << 63) - 1)
+ self.ranges = []
+ for i in xrange(0, value.count):
+ start = value.ranges[i].start
+ end = value.ranges[i].end
+ step = value.ranges[i].step
+ if start & (1 << 63):
+ start |= ~((1 << 63) - 1)
+ if end & (1 << 63):
+ end |= ~((1 << 63) - 1)
+ self.ranges.append(ValueRange(start, end, step))
elif value.state == RegisterValueType.UnsignedRangeValue:
self.offset = value.value
- self.start = value.rangeStart
- self.end = value.rangeEnd
- self.step = value.rangeStep
+ self.ranges = []
+ for i in xrange(0, value.count):
+ start = value.ranges[i].start
+ end = value.ranges[i].end
+ step = value.ranges[i].step
+ self.ranges.append(ValueRange(start, end, step))
elif value.state == RegisterValueType.LookupTableValue:
self.table = []
self.mapping = {}
- for i in xrange(0, value.rangeEnd):
+ for i in xrange(0, value.count):
from_list = []
for j in xrange(0, value.table[i].fromCount):
from_list.append(value.table[i].fromValues[j])
self.mapping[value.table[i].fromValues[j]] = value.table[i].toValue
self.table.append(LookupTableEntry(from_list, value.table[i].toValue))
+ elif (value.state == RegisterValueType.InSetOfValues) or (value.state == RegisterValueType.NotInSetOfValues):
+ self.values = set()
+ for i in xrange(0, value.count):
+ self.values.add(value.valueSet[i])
def __repr__(self):
if self.type == RegisterValueType.EntryValue:
@@ -87,12 +131,16 @@ class RegisterValue(object):
return "<const %#x>" % self.value
if self.type == RegisterValueType.StackFrameOffset:
return "<stack frame offset %#x>" % self.offset
- if (self.type == RegisterValueType.SignedRangeValue) or (self.type == RegisterValueType.UnsignedRangeValue):
- if self.step == 1:
- return "<range: %#x to %#x>" % (self.start, self.end)
- return "<range: %#x to %#x, step %#x>" % (self.start, self.end, self.step)
+ if self.type == RegisterValueType.SignedRangeValue:
+ return "<signed ranges: %s>" % repr(self.ranges)
+ if self.type == RegisterValueType.UnsignedRangeValue:
+ return "<unsigned ranges: %s>" % repr(self.ranges)
if self.type == RegisterValueType.LookupTableValue:
return "<table: %s>" % ', '.join([repr(i) for i in self.table])
+ if self.type == RegisterValueType.InSetOfValues:
+ return "<in %s>" % repr(self.values)
+ if self.type == RegisterValueType.NotInSetOfValues:
+ return "<not in %s>" % repr(self.values)
if self.type == RegisterValueType.ReturnAddressValue:
return "<return address>"
return "<undetermined>"
@@ -425,7 +473,6 @@ class Function(object):
reg = arch.regs[reg].index
value = core.BNGetRegisterValueAtInstruction(self.handle, arch.handle, addr, reg)
result = RegisterValue(arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_reg_value_after(self, addr, reg, arch=None):
@@ -447,7 +494,6 @@ class Function(object):
reg = arch.regs[reg].index
value = core.BNGetRegisterValueAfterInstruction(self.handle, arch.handle, addr, reg)
result = RegisterValue(arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_stack_contents_at(self, addr, offset, size, arch=None):
@@ -473,7 +519,6 @@ class Function(object):
arch = self.arch
value = core.BNGetStackContentsAtInstruction(self.handle, arch.handle, addr, offset, size)
result = RegisterValue(arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_stack_contents_after(self, addr, offset, size, arch=None):
@@ -481,7 +526,6 @@ class Function(object):
arch = self.arch
value = core.BNGetStackContentsAfterInstruction(self.handle, arch.handle, addr, offset, size)
result = RegisterValue(arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_parameter_at(self, addr, func_type, i, arch=None):
@@ -491,7 +535,6 @@ class Function(object):
func_type = func_type.handle
value = core.BNGetParameterValueAtInstruction(self.handle, arch.handle, addr, func_type, i)
result = RegisterValue(arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_parameter_at_low_level_il_instruction(self, instr, func_type, i):
@@ -499,7 +542,6 @@ class Function(object):
func_type = func_type.handle
value = core.BNGetParameterValueAtLowLevelILInstruction(self.handle, instr, func_type, i)
result = RegisterValue(self.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_regs_read_by(self, addr, arch=None):
diff --git a/python/lowlevelil.py b/python/lowlevelil.py
index 74b030d7..a737d95e 100644
--- a/python/lowlevelil.py
+++ b/python/lowlevelil.py
@@ -263,15 +263,14 @@ class LowLevelILInstruction(object):
"""Value of expression if constant or a known value (read-only)"""
value = core.BNGetLowLevelILExprValue(self.function.handle, self.expr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
@property
def possible_values(self):
"""Possible values of expression using path-sensitive static data flow analysis (read-only)"""
value = core.BNGetLowLevelILPossibleExprValues(self.function.handle, self.expr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_reg_value(self, reg):
@@ -279,7 +278,6 @@ class LowLevelILInstruction(object):
reg = self.function.arch.regs[reg].index
value = core.BNGetLowLevelILRegisterValueAtInstruction(self.function.handle, reg, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_reg_value_after(self, reg):
@@ -287,23 +285,22 @@ class LowLevelILInstruction(object):
reg = self.function.arch.regs[reg].index
value = core.BNGetLowLevelILRegisterValueAfterInstruction(self.function.handle, reg, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_reg_values(self, reg):
if isinstance(reg, str):
reg = self.function.arch.regs[reg].index
value = core.BNGetLowLevelILPossibleRegisterValuesAtInstruction(self.function.handle, reg, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_reg_values_after(self, reg):
if isinstance(reg, str):
reg = self.function.arch.regs[reg].index
value = core.BNGetLowLevelILPossibleRegisterValuesAfterInstruction(self.function.handle, reg, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_flag_value(self, flag):
@@ -311,7 +308,6 @@ class LowLevelILInstruction(object):
flag = self.function.arch.flags[flag].index
value = core.BNGetLowLevelILFlagValueAtInstruction(self.function.handle, flag, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_flag_value_after(self, flag):
@@ -319,47 +315,44 @@ class LowLevelILInstruction(object):
flag = self.function.arch.flags[flag].index
value = core.BNGetLowLevelILFlagValueAfterInstruction(self.function.handle, flag, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_flag_values(self, flag):
if isinstance(flag, str):
flag = self.function.arch.flags[flag].index
value = core.BNGetLowLevelILPossibleFlagValuesAtInstruction(self.function.handle, flag, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_flag_values_after(self, flag):
if isinstance(flag, str):
flag = self.function.arch.flags[flag].index
value = core.BNGetLowLevelILPossibleFlagValuesAfterInstruction(self.function.handle, flag, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_stack_contents(self, offset, size):
value = core.BNGetLowLevelILStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_stack_contents_after(self, offset, size):
value = core.BNGetLowLevelILStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_stack_contents(self, offset, size):
value = core.BNGetLowLevelILPossibleStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_stack_contents_after(self, offset, size):
value = core.BNGetLowLevelILPossibleStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def __setattr__(self, name, value):
@@ -1534,7 +1527,6 @@ class LowLevelILFunction(object):
reg = self.arch.regs[reg].index
value = core.BNGetLowLevelILSSARegisterValue(self.handle, reg, index)
result = function.RegisterValue(self.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_ssa_flag_value(self, flag, index):
@@ -1542,7 +1534,6 @@ class LowLevelILFunction(object):
flag = self.arch.get_flag_by_name(flag)
value = core.BNGetLowLevelILSSAFlagValue(self.handle, flag, index)
result = function.RegisterValue(self.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_mapped_medium_level_il_instruction_index(self, instr):
diff --git a/python/mediumlevelil.py b/python/mediumlevelil.py
index 6f482221..951ad591 100644
--- a/python/mediumlevelil.py
+++ b/python/mediumlevelil.py
@@ -260,15 +260,14 @@ class MediumLevelILInstruction(object):
"""Value of expression if constant or a known value (read-only)"""
value = core.BNGetMediumLevelILExprValue(self.function.handle, self.expr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
@property
def possible_values(self):
"""Possible values of expression using path-sensitive static data flow analysis (read-only)"""
value = core.BNGetMediumLevelILPossibleExprValues(self.function.handle, self.expr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
@property
@@ -302,7 +301,6 @@ class MediumLevelILInstruction(object):
var_data.identifier = var.identifier
value = core.BNGetMediumLevelILPossibleSSAVarValues(self.function.handle, var_data, index, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_ssa_var_index(self, var):
@@ -333,7 +331,6 @@ class MediumLevelILInstruction(object):
reg = self.function.arch.regs[reg].index
value = core.BNGetMediumLevelILRegisterValueAtInstruction(self.function.handle, reg, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_reg_value_after(self, reg):
@@ -341,23 +338,22 @@ class MediumLevelILInstruction(object):
reg = self.function.arch.regs[reg].index
value = core.BNGetMediumLevelILRegisterValueAfterInstruction(self.function.handle, reg, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_reg_values(self, reg):
if isinstance(reg, str):
reg = self.function.arch.regs[reg].index
value = core.BNGetMediumLevelILPossibleRegisterValuesAtInstruction(self.function.handle, reg, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_reg_values_after(self, reg):
if isinstance(reg, str):
reg = self.function.arch.regs[reg].index
value = core.BNGetMediumLevelILPossibleRegisterValuesAfterInstruction(self.function.handle, reg, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_flag_value(self, flag):
@@ -365,7 +361,6 @@ class MediumLevelILInstruction(object):
flag = self.function.arch.flags[flag].index
value = core.BNGetMediumLevelILFlagValueAtInstruction(self.function.handle, flag, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_flag_value_after(self, flag):
@@ -373,47 +368,44 @@ class MediumLevelILInstruction(object):
flag = self.function.arch.flags[flag].index
value = core.BNGetMediumLevelILFlagValueAfterInstruction(self.function.handle, flag, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_flag_values(self, flag):
if isinstance(flag, str):
flag = self.function.arch.flags[flag].index
value = core.BNGetMediumLevelILPossibleFlagValuesAtInstruction(self.function.handle, flag, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_flag_values_after(self, flag):
if isinstance(flag, str):
flag = self.function.arch.flags[flag].index
value = core.BNGetMediumLevelILPossibleFlagValuesAfterInstruction(self.function.handle, flag, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_stack_contents(self, offset, size):
value = core.BNGetMediumLevelILStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_stack_contents_after(self, offset, size):
value = core.BNGetMediumLevelILStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_possible_stack_contents(self, offset, size):
value = core.BNGetMediumLevelILPossibleStackContentsAtInstruction(self.function.handle, offset, size, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_possible_stack_contents_after(self, offset, size):
value = core.BNGetMediumLevelILPossibleStackContentsAfterInstruction(self.function.handle, offset, size, self.instr_index)
- result = function.RegisterValue(self.function.arch, value)
- core.BNFreeRegisterValue(value)
+ result = function.PossibleValueSet(self.function.arch, value)
+ core.BNFreePossibleValueSet(value)
return result
def get_branch_dependence(self, branch_instr):
@@ -706,7 +698,6 @@ class MediumLevelILFunction(object):
var_data.identifier = var.identifier
value = core.BNGetMediumLevelILSSAVarValue(self.handle, var_data, index)
result = function.RegisterValue(self.arch, value)
- core.BNFreeRegisterValue(value)
return result
def get_low_level_il_instruction_index(self, instr):