From 5ccef726c0954116f8f4b5d6347e0acdbb0b6ce3 Mon Sep 17 00:00:00 2001 From: Brandon Miller Date: Tue, 27 Jan 2026 11:26:57 -0500 Subject: Perform function lifting and inlining in arch plugins This change allows architecture plugins to override the LiftFunction callback to iterate a function's basic block list and lift entire functions at once. This is required for architectures such as TMS320 C6x, which have non-traditional "delay slots" in that branches, loads, and other instructions take multiple cycles to complete, and branch instructions can reside within the delay slots of other branches. --- defaultarch/CMakeLists.txt | 50 ++++++++++++++++++++++++++++++++++++++++++++++ defaultarch/plugin.cpp | 16 +++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 defaultarch/CMakeLists.txt create mode 100644 defaultarch/plugin.cpp (limited to 'defaultarch') diff --git a/defaultarch/CMakeLists.txt b/defaultarch/CMakeLists.txt new file mode 100644 index 00000000..d355f317 --- /dev/null +++ b/defaultarch/CMakeLists.txt @@ -0,0 +1,50 @@ +cmake_minimum_required(VERSION 3.13 FATAL_ERROR) + +project(defaultarch) + +if(NOT BN_INTERNAL_BUILD) + add_subdirectory(${PROJECT_SOURCE_DIR}/../.. ${PROJECT_BINARY_DIR}/api) +endif() + +file(GLOB SOURCES CONFIGURE_DEPENDS + *.cpp + *.h) + +if(DEMO) + add_library(defaultarch STATIC ${SOURCES}) +else() + add_library(defaultarch SHARED ${SOURCES}) +endif() + +target_include_directories(defaultarch + PRIVATE ${PROJECT_SOURCE_DIR} +) + +if(WIN32) + target_link_directories(defaultarch + PRIVATE ${BN_INSTALL_DIR}) + target_link_libraries(defaultarch binaryninjaapi) +else() + target_link_libraries(defaultarch binaryninjaapi) +endif() + +if(UNIX AND NOT APPLE) + target_link_options(defaultarch PRIVATE "LINKER:--exclude-libs,ALL") +endif() + +set_target_properties(defaultarch PROPERTIES + CXX_STANDARD 20 + CXX_VISIBILITY_PRESET hidden + CXX_STANDARD_REQUIRED ON + C_STANDARD 99 + C_STANDARD_REQUIRED ON + C_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON) + +if(BN_INTERNAL_BUILD) + plugin_rpath(defaultarch) + set_target_properties(defaultarch PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${BN_CORE_PLUGIN_DIR} + RUNTIME_OUTPUT_DIRECTORY ${BN_CORE_PLUGIN_DIR}) +endif() diff --git a/defaultarch/plugin.cpp b/defaultarch/plugin.cpp new file mode 100644 index 00000000..3e6e66a8 --- /dev/null +++ b/defaultarch/plugin.cpp @@ -0,0 +1,16 @@ +#include "binaryninjaapi.h" +#include "binaryninjacore.h" + +using namespace BinaryNinja; + +extern "C" +{ + BN_DECLARE_CORE_ABI_VERSION + BINARYNINJAPLUGIN bool CorePluginInit() + { + if (!BNArchitectureSetDefaultAnalyzeBasicBlocksCallback((void*)Architecture::DefaultAnalyzeBasicBlocksCallback)) + return false; + + return BNArchitectureSetDefaultLiftFunctionCallback((void*)Architecture::DefaultLiftFunctionCallback); + } +} -- cgit v1.3.1