From 9723520f9c1b734a101b86eb736f5807e546c6fa Mon Sep 17 00:00:00 2001 From: endeavor Date: Thu, 10 Jun 2021 13:35:55 -0400 Subject: support are_argument_registers_user_for_var_args added in 0732c4d3e9b24382271139c6f796d1639efb1c5d --- rust/src/callingconvention.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'rust/src') diff --git a/rust/src/callingconvention.rs b/rust/src/callingconvention.rs index 8cc1b71c..a4bd599b 100644 --- a/rust/src/callingconvention.rs +++ b/rust/src/callingconvention.rs @@ -50,6 +50,7 @@ pub trait CallingConventionBase: Sync { fn global_pointer_reg(&self) -> Option<::Register>; fn implicitly_defined_registers(&self) -> Vec<::Register>; + fn are_argument_registers_used_for_var_args(&self) -> bool; } pub fn register_calling_convention(arch: &A, name: N, cc: C) -> Ref> @@ -348,6 +349,17 @@ where }) } + extern "C" fn cb_are_argument_registers_used_for_var_args(ctxt: *mut c_void) -> bool + where + C: CallingConventionBase, + { + ffi_wrap!("CallingConvention::are_argument_registers_used_for_var_args", unsafe { + let ctxt = &*(ctxt as *mut CustomCallingConventionContext); + + ctxt.cc.are_argument_registers_used_for_var_args() + }) + } + let name = name.as_bytes_with_nul(); let raw = Box::into_raw(Box::new(CustomCallingConventionContext { raw_handle: ptr::null_mut(), @@ -379,6 +391,8 @@ where getIncomingFlagValue: Some(cb_incoming_flag_value::), getIncomingVariableForParameterVariable: Some(cb_incoming_var_for_param::), getParameterVariableForIncomingVariable: Some(cb_incoming_param_for_var::), + + areArgumentRegistersUsedForVarArgs: Some(cb_are_argument_registers_used_for_var_args::), }; unsafe { @@ -533,6 +547,10 @@ impl CallingConventionBase for CallingConvention { fn implicitly_defined_registers(&self) -> Vec { Vec::new() } + + fn are_argument_registers_used_for_var_args(&self) -> bool { + unsafe { BNAreArgumentRegistersUsedForVarArgs(self.handle) } + } } impl ToOwned for CallingConvention { @@ -576,6 +594,8 @@ pub struct ConventionBuilder { implicitly_defined_registers: Vec, + are_argument_registers_used_for_var_args: bool, + arch_handle: A::Handle, _arch: PhantomData<*const A>, } @@ -643,6 +663,8 @@ impl ConventionBuilder { implicitly_defined_registers: Vec::new(), + are_argument_registers_used_for_var_args: false, + arch_handle: arch.handle(), _arch: PhantomData, } @@ -665,6 +687,8 @@ impl ConventionBuilder { reg!(global_pointer_reg); reg_list!(implicitly_defined_registers); + + bool_arg!(are_argument_registers_used_for_var_args); pub fn register(self, name: &str) -> Ref> { let arch = self.arch_handle.clone(); @@ -727,4 +751,8 @@ impl CallingConventionBase for ConventionBuilder { fn implicitly_defined_registers(&self) -> Vec { self.implicitly_defined_registers.clone() } + + fn are_argument_registers_used_for_var_args(&self) -> bool { + self.are_argument_registers_used_for_var_args + } } -- cgit v1.3.1