summaryrefslogtreecommitdiff
path: root/architecture.cpp
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-04-25 13:30:45 -0400
committerRyan Snyder <ryan@vector35.com>2025-06-23 13:44:12 -0400
commitb079d1a1e19151f5c39de84c2e1e6cc6a91abc74 (patch)
tree8cf27224630b690fcfdfd490ee43ec1cd56fc9b6 /architecture.cpp
parent76215b86ff629da58aa94d4cf4093d2e67017412 (diff)
Perform BB analysis from Architecture C++ API
This commit moves AnalyzeBasicBlocks from the binary ninja core to the API and allows architecture plugins to optionally override AnalyzeBasicBlocks for a custom implementation Supply ABB inputs in BNBasicBlockAnalysisContext Register default analyze basic blocks callback This allows the nanomips and rust core architecture plugins to work again while using the C++ API DefaultAnalyzeBasicBlocks Use default ABB from Python plugins Fix bug in API ArchAndAddr operator overload Python APIs for basic block analysis
Diffstat (limited to 'architecture.cpp')
-rw-r--r--architecture.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/architecture.cpp b/architecture.cpp
index 22bf6fc3..22045ee2 100644
--- a/architecture.cpp
+++ b/architecture.cpp
@@ -24,6 +24,7 @@
#include <inttypes.h>
#include <vector>
#include "binaryninjaapi.h"
+#include "lowlevelilinstruction.h"
#include "ffi.h"
using namespace BinaryNinja;
@@ -327,6 +328,15 @@ bool Architecture::GetInstructionLowLevelILCallback(
}
+void Architecture::AnalyzeBasicBlocksCallback(void *ctxt, BNFunction* function,
+ BNBasicBlockAnalysisContext* context)
+{
+ CallbackRef<Architecture> arch(ctxt);
+ Ref<Function> func(new Function(BNNewFunctionReference(function)));
+ arch->AnalyzeBasicBlocks(*func, *context);
+}
+
+
char* Architecture::GetRegisterNameCallback(void* ctxt, uint32_t reg)
{
CallbackRef<Architecture> arch(ctxt);
@@ -817,6 +827,7 @@ void Architecture::Register(Architecture* arch)
callbacks.getInstructionText = GetInstructionTextCallback;
callbacks.freeInstructionText = FreeInstructionTextCallback;
callbacks.getInstructionLowLevelIL = GetInstructionLowLevelILCallback;
+ callbacks.analyzeBasicBlocks = AnalyzeBasicBlocksCallback;
callbacks.getRegisterName = GetRegisterNameCallback;
callbacks.getFlagName = GetFlagNameCallback;
callbacks.getFlagWriteTypeName = GetFlagWriteTypeNameCallback;
@@ -945,6 +956,12 @@ bool Architecture::GetInstructionLowLevelIL(const uint8_t*, uint64_t, size_t&, L
}
+void Architecture::AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context)
+{
+ DefaultAnalyzeBasicBlocks(function, context);
+}
+
+
string Architecture::GetRegisterName(uint32_t reg)
{
return fmt::format("r{}", reg);
@@ -1505,6 +1522,12 @@ bool CoreArchitecture::GetInstructionLowLevelIL(const uint8_t* data, uint64_t ad
}
+void CoreArchitecture::AnalyzeBasicBlocks(Function& function, BasicBlockAnalysisContext& context)
+{
+ BNArchitectureAnalyzeBasicBlocks(m_object, function.GetObject(), &context);
+}
+
+
string CoreArchitecture::GetRegisterName(uint32_t reg)
{
char* name = BNGetArchitectureRegisterName(m_object, reg);