• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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