summaryrefslogtreecommitdiff
path: root/defaultarch
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2026-01-27 11:26:57 -0500
committerBrandon Miller <brandon@vector35.com>2026-01-27 11:26:57 -0500
commit5ccef726c0954116f8f4b5d6347e0acdbb0b6ce3 (patch)
treeef347ed0ae08bbdafb53fd5e82ffdfd104377522 /defaultarch
parente5805fe927f42d3ac56dd283fc02b394a9739d79 (diff)
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.
Diffstat (limited to 'defaultarch')
-rw-r--r--defaultarch/CMakeLists.txt50
-rw-r--r--defaultarch/plugin.cpp16
2 files changed, 66 insertions, 0 deletions
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);
+ }
+}