diff options
| author | Brandon Miller <brandon@vector35.com> | 2025-04-25 13:30:45 -0400 |
|---|---|---|
| committer | Ryan Snyder <ryan@vector35.com> | 2025-06-23 13:44:12 -0400 |
| commit | b079d1a1e19151f5c39de84c2e1e6cc6a91abc74 (patch) | |
| tree | 8cf27224630b690fcfdfd490ee43ec1cd56fc9b6 /architecture.cpp | |
| parent | 76215b86ff629da58aa94d4cf4093d2e67017412 (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.cpp | 23 |
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); |
