diff options
| author | Ryan Snyder <ryan@vector35.com> | 2025-02-24 15:14:19 -0500 |
|---|---|---|
| committer | Ryan Snyder <ryan@vector35.com> | 2025-03-17 10:07:02 -0400 |
| commit | 1652efdc43aa3acbd570c1f042a35da458538bb4 (patch) | |
| tree | 72c5ec04401432691a78acdd0d29b1fc7ecc07de /function.cpp | |
| parent | 996ad28c29cd242b672041ae3b08e97a0e160a85 (diff) | |
core: initial union support with C++ API
Diffstat (limited to 'function.cpp')
| -rw-r--r-- | function.cpp | 67 |
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()); |
