summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2023-02-04 15:23:52 -0500
committerBrian Potchik <brian@vector35.com>2023-02-04 15:23:52 -0500
commit1a7d06b3b8044ccdee4e3ff0883a33bf8cce487f (patch)
tree6779d6b368acfcad57474e0fd12c1ae4158f5c38 /function.cpp
parent4005984260466439560545040850557922003325 (diff)
Initial support for constant data expressions.
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/function.cpp b/function.cpp
index 4be60124..581121c2 100644
--- a/function.cpp
+++ b/function.cpp
@@ -101,7 +101,7 @@ Variable Variable::FromIdentifier(uint64_t id)
}
-RegisterValue::RegisterValue() : state(UndeterminedValue), value(0), offset(0) {}
+RegisterValue::RegisterValue() : state(UndeterminedValue), value(0), offset(0), size(0) {}
bool RegisterValue::IsConstant() const
@@ -116,6 +116,50 @@ BNRegisterValue RegisterValue::ToAPIObject()
result.state = state;
result.value = value;
result.offset = offset;
+ result.size = size;
+ return result;
+}
+
+
+ConstantData::ConstantData()
+{
+ state = UndeterminedValue;
+ value = 0;
+ size = 0;
+}
+
+ConstantData::ConstantData(BNRegisterValueType _state, uint64_t _value)
+{
+ state = _state;
+ value = _value;
+ size = 0;
+}
+
+
+ConstantData::ConstantData(BNRegisterValueType _state, uint64_t _value, size_t _size, Ref<Function> _func)
+{
+ state = _state;
+ value = _value;
+ size = _size;
+ func = _func;
+}
+
+
+DataBuffer ConstantData::ToDataBuffer() const
+{
+ if (func)
+ return func->GetConstantData(state, value, size);
+
+ return DataBuffer();
+}
+
+
+RegisterValue ConstantData::ToRegisterValue() const
+{
+ RegisterValue result;
+ result.state = state;
+ result.value = value;
+ result.size = size;
return result;
}
@@ -385,6 +429,8 @@ RegisterValue RegisterValue::FromAPIObject(const BNRegisterValue& value)
RegisterValue result;
result.state = value.state;
result.value = value.value;
+ result.offset = value.offset;
+ result.size = value.size;
return result;
}
@@ -395,6 +441,7 @@ PossibleValueSet PossibleValueSet::FromAPIObject(BNPossibleValueSet& value)
result.state = value.state;
result.value = value.value;
result.offset = value.offset;
+ result.size = value.size;
if (value.state == LookupTableValue)
{
for (size_t i = 0; i < value.count; i++)
@@ -429,6 +476,7 @@ BNPossibleValueSet PossibleValueSet::ToAPIObject()
result.state = state;
result.value = value;
result.offset = offset;
+ result.size = size;
result.count = 0;
if ((state == SignedRangeValue) || (state == UnsignedRangeValue))
@@ -477,6 +525,12 @@ BNPossibleValueSet PossibleValueSet::ToAPIObject()
}
+DataBuffer Function::GetConstantData(BNRegisterValueType state, uint64_t value, size_t size)
+{
+ return DataBuffer(BNGetConstantData(m_object, state, value, size));
+}
+
+
RegisterValue Function::GetRegisterValueAtInstruction(Architecture* arch, uint64_t addr, uint32_t reg)
{
BNRegisterValue value = BNGetRegisterValueAtInstruction(m_object, arch->GetObject(), addr, reg);