summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2026-05-19 20:01:42 -0400
committerRusty Wagner <rusty.wagner@gmail.com>2026-05-22 17:52:21 -0400
commitea82d201e7efb2065d0cea459bea0fcda1985762 (patch)
treefc7494275ddf85e7e68f3c333a79bd3404590dd6 /arch
parentede9c92ba6155be37571743df7172aec76dd3c4b (diff)
Refactor calling convention Rust API to allow default implementations
Also implements the new calling convention APIs in Rust
Diffstat (limited to 'arch')
-rw-r--r--arch/riscv/src/lib.rs34
1 files changed, 21 insertions, 13 deletions
diff --git a/arch/riscv/src/lib.rs b/arch/riscv/src/lib.rs
index 3537a082..8504abe6 100644
--- a/arch/riscv/src/lib.rs
+++ b/arch/riscv/src/lib.rs
@@ -14,7 +14,9 @@ use binaryninja::{
UnusedRegisterStack,
},
binary_view::{BinaryView, BinaryViewType},
- calling_convention::{register_calling_convention, CallingConvention, ConventionBuilder},
+ calling_convention::{
+ register_calling_convention, CallingConvention, ConventionBuilder, CoreCallingConvention,
+ },
disassembly::{InstructionTextToken, InstructionTextTokenKind},
function::Function,
function_recognizer::FunctionRecognizer,
@@ -2755,12 +2757,22 @@ impl<D: RiscVDisassembler> AsRef<CoreRelocationHandler> for RiscVELFRelocationHa
}
struct RiscVCC<D: RiscVDisassembler> {
+ core: CoreCallingConvention,
_dis: PhantomData<D>,
}
impl<D: RiscVDisassembler> RiscVCC<D> {
- fn new() -> Self {
- RiscVCC { _dis: PhantomData }
+ fn new(core: CoreCallingConvention) -> Self {
+ RiscVCC {
+ core,
+ _dis: PhantomData,
+ }
+ }
+}
+
+impl<D: RiscVDisassembler> AsRef<CoreCallingConvention> for RiscVCC<D> {
+ fn as_ref(&self) -> &CoreCallingConvention {
+ &self.core
}
}
@@ -3087,17 +3099,13 @@ pub extern "C" fn CorePluginInit() -> bool {
arch32.register_function_recognizer(RiscVELFPLTRecognizer);
arch64.register_function_recognizer(RiscVELFPLTRecognizer);
- let cc32 = register_calling_convention(
- arch32,
- "default",
- RiscVCC::<RiscVIMACDisassembler<Rv32GRegs>>::new(),
- );
+ let cc32 = register_calling_convention(arch32, "default", |core| {
+ RiscVCC::<RiscVIMACDisassembler<Rv32GRegs>>::new(core)
+ });
arch32.set_default_calling_convention(&cc32);
- let cc64 = register_calling_convention(
- arch64,
- "default",
- RiscVCC::<RiscVIMACDisassembler<Rv64GRegs>>::new(),
- );
+ let cc64 = register_calling_convention(arch64, "default", |core| {
+ RiscVCC::<RiscVIMACDisassembler<Rv64GRegs>>::new(core)
+ });
arch64.set_default_calling_convention(&cc64);
if let Some(bvt) = BinaryViewType::by_name("ELF") {