summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp45
1 files changed, 37 insertions, 8 deletions
diff --git a/function.cpp b/function.cpp
index b8429998..7cc30351 100644
--- a/function.cpp
+++ b/function.cpp
@@ -143,27 +143,56 @@ vector<size_t> Function::GetLowLevelILExitsForInstruction(Architecture* arch, ui
}
-BNRegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg)
+static RegisterValue GetRegisterValueFromAPIObject(BNRegisterValue& value)
{
- return BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg);
+ 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;
+ if (value.state == LookupTableValue)
+ {
+ for (size_t i = 0; i < (size_t)value.rangeEnd; i++)
+ {
+ LookupTableEntry entry;
+ entry.fromValues.insert(entry.fromValues.end(), &value.table[i].fromValues[0],
+ &value.table[i].fromValues[value.table[i].fromCount]);
+ entry.toValue = value.table[i].toValue;
+ result.table.push_back(entry);
+ }
+ }
+ BNFreeRegisterValue(&value);
+ return result;
+}
+
+
+RegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg)
+{
+ BNRegisterValue value = BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg);
+ return GetRegisterValueFromAPIObject(value);
}
-BNRegisterValue Function::GetRegisterValueAfterInstruction(Architecture* arch, uint64_t addr, uint32_t reg)
+RegisterValue Function::GetRegisterValueAfterInstruction(Architecture* arch, uint64_t addr, uint32_t reg)
{
- return BNGetRegisterValueAfterInstruction(m_object, arch->GetObject(), addr, reg);
+ BNRegisterValue value = BNGetRegisterValueAfterInstruction(m_object, arch->GetObject(), addr, reg);
+ return GetRegisterValueFromAPIObject(value);
}
-BNRegisterValue Function::GetRegisterValueAtLowLevelILInstruction(size_t i, uint32_t reg)
+RegisterValue Function::GetRegisterValueAtLowLevelILInstruction(size_t i, uint32_t reg)
{
- return BNGetRegisterValueAtLowLevelILInstruction(m_object, i, reg);
+ BNRegisterValue value = BNGetRegisterValueAtLowLevelILInstruction(m_object, i, reg);
+ return GetRegisterValueFromAPIObject(value);
}
-BNRegisterValue Function::GetRegisterValueAfterLowLevelILInstruction(size_t i, uint32_t reg)
+RegisterValue Function::GetRegisterValueAfterLowLevelILInstruction(size_t i, uint32_t reg)
{
- return BNGetRegisterValueAfterLowLevelILInstruction(m_object, i, reg);
+ BNRegisterValue value = BNGetRegisterValueAfterLowLevelILInstruction(m_object, i, reg);
+ return GetRegisterValueFromAPIObject(value);
}