summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2025-02-24 15:14:19 -0500
committerRyan Snyder <ryan@vector35.com>2025-03-17 10:07:02 -0400
commit1652efdc43aa3acbd570c1f042a35da458538bb4 (patch)
tree72c5ec04401432691a78acdd0d29b1fc7ecc07de /function.cpp
parent996ad28c29cd242b672041ae3b08e97a0e160a85 (diff)
core: initial union support with C++ API
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/function.cpp b/function.cpp
index c07d8ecb..e4cdeacc 100644
--- a/function.cpp
+++ b/function.cpp
@@ -2699,6 +2699,73 @@ void Function::ClearForcedVariableVersion(const Variable& var, const ArchAndAddr
}
+void Function::SetFieldResolutionForVariableAt(const Variable& var, const ArchAndAddr& location, FieldResolutionInfo* info)
+{
+ auto defSite = BNArchitectureAndAddress();
+ defSite.arch = location.arch->m_object;
+ defSite.address = location.address;
+
+ auto var_data = BNVariable();
+ var_data.type = var.type;
+ var_data.index = var.index;
+ var_data.storage = var.storage;
+
+ BNSetFieldResolutionForVariableAt(m_object, &var_data, &defSite, info->m_object);
+}
+
+
+void Function::ClearFieldResolutionForVariableAt(const Variable& var, const ArchAndAddr& location)
+{
+ auto defSite = BNArchitectureAndAddress();
+ defSite.arch = location.arch->m_object;
+ defSite.address = location.address;
+
+ auto var_data = BNVariable();
+ var_data.type = var.type;
+ var_data.index = var.index;
+ var_data.storage = var.storage;
+
+ BNClearFieldResolutionForVariableAt(m_object, &var_data, &defSite);
+}
+
+
+Ref<FieldResolutionInfo> Function::GetFieldResolutionForVariableAt(const Variable& var, const ArchAndAddr& location)
+{
+ auto defSite = BNArchitectureAndAddress();
+ defSite.arch = location.arch->m_object;
+ defSite.address = location.address;
+
+ auto var_data = BNVariable();
+ var_data.type = var.type;
+ var_data.index = var.index;
+ var_data.storage = var.storage;
+
+ BNFieldResolutionInfo* result = BNGetFieldResolutionForVariableAt(m_object, &var_data, &defSite);
+ return result ? new FieldResolutionInfo(result) : nullptr;
+}
+
+
+std::map<Variable, std::map<ArchAndAddr, Ref<FieldResolutionInfo>>> Function::GetAllFieldResolutions()
+{
+ map<Variable, map<ArchAndAddr, Ref<FieldResolutionInfo>>> result;
+
+ size_t count;
+ BNVariableFieldResolutionInfo* info = BNGetAllVariableFieldResolutions(m_object, &count);
+
+ for (size_t i = 0; i < count; i++)
+ {
+ Variable var(info[i].var.type, info[i].var.index, info[i].var.storage);
+ ArchAndAddr location(new CoreArchitecture(info[i].location.arch), info[i].location.address);
+ Ref<FieldResolutionInfo> fieldInfo(new FieldResolutionInfo(BNNewFieldResolutionInfoReference(info[i].info)));
+
+ result[var][location] = fieldInfo;
+ }
+
+ BNFreeVariableFieldResolutions(info, count);
+ return result;
+}
+
+
void Function::RequestDebugReport(const string& name)
{
BNRequestFunctionDebugReport(m_object, name.c_str());