summaryrefslogtreecommitdiff
path: root/rust/src/variable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/src/variable.rs')
-rw-r--r--rust/src/variable.rs51
1 files changed, 50 insertions, 1 deletions
diff --git a/rust/src/variable.rs b/rust/src/variable.rs
index f9384b5d..1eefc9a8 100644
--- a/rust/src/variable.rs
+++ b/rust/src/variable.rs
@@ -1,6 +1,6 @@
#![allow(unused)]
-use crate::architecture::{Architecture, CoreArchitecture, CoreRegister, RegisterId};
+use crate::architecture::{Architecture, CoreArchitecture, CoreRegister, Register, RegisterId};
use crate::confidence::Conf;
use crate::function::{Function, Location};
use crate::rc::{CoreArrayProvider, CoreArrayProviderInner, Ref};
@@ -405,6 +405,30 @@ impl Variable {
unsafe { BNFromVariableIdentifier(ident) }.into()
}
+ pub fn from_register(reg: impl Register) -> Self {
+ Self {
+ ty: VariableSourceType::RegisterVariableSourceType,
+ index: 0,
+ storage: reg.id().0 as i64,
+ }
+ }
+
+ pub fn from_register_id(reg: RegisterId) -> Self {
+ Self {
+ ty: VariableSourceType::RegisterVariableSourceType,
+ index: 0,
+ storage: reg.0 as i64,
+ }
+ }
+
+ pub fn from_stack_offset(offset: i64) -> Self {
+ Self {
+ ty: VariableSourceType::StackVariableSourceType,
+ index: 0,
+ storage: offset,
+ }
+ }
+
pub fn to_identifier(&self) -> u64 {
let raw = BNVariable::from(*self);
unsafe { BNToVariableIdentifier(&raw) }
@@ -417,6 +441,8 @@ impl Variable {
}
VariableSourceType::StackVariableSourceType => None,
VariableSourceType::FlagVariableSourceType => None,
+ VariableSourceType::CompositeReturnValueSourceType => None,
+ VariableSourceType::CompositeParameterSourceType => None,
}
}
}
@@ -674,6 +700,13 @@ pub enum PossibleValueSet {
StackFrameOffset {
value: i64,
},
+ ResultPointer {
+ offset: i64,
+ },
+ ParameterPointer {
+ index: u64,
+ offset: i64,
+ },
ReturnAddressValue,
ImportedAddressValue {
value: i64,
@@ -730,6 +763,13 @@ impl PossibleValueSet {
offset: value.offset,
},
RegisterValueType::StackFrameOffset => Self::StackFrameOffset { value: value.value },
+ RegisterValueType::ResultPointerValue => Self::ResultPointer {
+ offset: value.value,
+ },
+ RegisterValueType::ParameterPointerValue => Self::ParameterPointer {
+ index: value.value as u64,
+ offset: value.offset,
+ },
RegisterValueType::ReturnAddressValue => Self::ReturnAddressValue,
RegisterValueType::ImportedAddressValue => {
Self::ImportedAddressValue { value: value.value }
@@ -815,6 +855,13 @@ impl PossibleValueSet {
PossibleValueSet::StackFrameOffset { value } => {
raw.value = value;
}
+ PossibleValueSet::ResultPointer { offset } => {
+ raw.value = offset;
+ }
+ PossibleValueSet::ParameterPointer { index, offset } => {
+ raw.value = index as i64;
+ raw.offset = offset;
+ }
PossibleValueSet::ReturnAddressValue => {}
PossibleValueSet::ImportedAddressValue { value } => {
raw.value = value;
@@ -910,6 +957,8 @@ impl PossibleValueSet {
RegisterValueType::ExternalPointerValue
}
PossibleValueSet::StackFrameOffset { .. } => RegisterValueType::StackFrameOffset,
+ PossibleValueSet::ResultPointer { .. } => RegisterValueType::ResultPointerValue,
+ PossibleValueSet::ParameterPointer { .. } => RegisterValueType::ParameterPointerValue,
PossibleValueSet::ReturnAddressValue => RegisterValueType::ReturnAddressValue,
PossibleValueSet::ImportedAddressValue { .. } => {
RegisterValueType::ImportedAddressValue