From 1652efdc43aa3acbd570c1f042a35da458538bb4 Mon Sep 17 00:00:00 2001 From: Ryan Snyder Date: Mon, 24 Feb 2025 15:14:19 -0500 Subject: core: initial union support with C++ API --- function.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'function.cpp') 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 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>> Function::GetAllFieldResolutions() +{ + map>> 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 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()); -- cgit v1.3.1