1 //! (LLDB extension) Override the register info specified by `Target::Arch`. 2 3 use crate::arch::lldb::Register; 4 use crate::target::Target; 5 6 /// This type serves as a "proof of callback", ensuring that either 7 /// `reg_info.done()` or `reg_info.write()` have been called from within the 8 /// `register_info` function. The only way to obtain a valid instance of this 9 /// type is by invoking one of those two methods. 10 pub struct CallbackToken<'a>(pub(crate) core::marker::PhantomData<&'a *mut ()>); 11 12 /// `register_info` callbacks 13 pub struct Callback<'a> { 14 pub(crate) cb: &'a mut dyn FnMut(Option<Register<'_>>), 15 pub(crate) token: CallbackToken<'a>, 16 } 17 18 impl<'a> Callback<'a> { 19 /// The `qRegisterInfo` query shall be concluded. 20 #[inline(always)] done(self) -> CallbackToken<'a>21 pub fn done(self) -> CallbackToken<'a> { 22 (self.cb)(None); 23 self.token 24 } 25 26 /// Write the register info of a single register. 27 #[inline(always)] write(self, reg: Register<'_>) -> CallbackToken<'a>28 pub fn write(self, reg: Register<'_>) -> CallbackToken<'a> { 29 (self.cb)(Some(reg)); 30 self.token 31 } 32 } 33 34 /// Target Extension - Override the target register info specified by 35 /// `Target::Arch`. 36 /// 37 /// _Note:_ Unless you're working with a particularly dynamic, 38 /// runtime-configurable target, it's unlikely that you'll need to implement 39 /// this extension. 40 pub trait LldbRegisterInfoOverride: Target { 41 /// Invoke `reg_info.write(reg)` where `reg` is a [`Register`] struct to 42 /// write information of a single register or `reg_info.done()` if you want 43 /// to end the `qRegisterInfo` packet exchange. lldb_register_info<'a>( &mut self, reg_id: usize, reg_info: Callback<'a>, ) -> Result<CallbackToken<'a>, Self::Error>44 fn lldb_register_info<'a>( 45 &mut self, 46 reg_id: usize, 47 reg_info: Callback<'a>, 48 ) -> Result<CallbackToken<'a>, Self::Error>; 49 } 50 51 define_ext!(LldbRegisterInfoOverrideOps, LldbRegisterInfoOverride); 52