diff options
| author | Brian Potchik <brian@vector35.com> | 2023-02-04 15:23:52 -0500 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2023-02-04 15:23:52 -0500 |
| commit | 1a7d06b3b8044ccdee4e3ff0883a33bf8cce487f (patch) | |
| tree | 6779d6b368acfcad57474e0fd12c1ae4158f5c38 /function.cpp | |
| parent | 4005984260466439560545040850557922003325 (diff) | |
Initial support for constant data expressions.
Diffstat (limited to 'function.cpp')
| -rw-r--r-- | function.cpp | 56 |
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); |
