lib.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. mod expand;
  2. use expand::{Args, Map, Probe, ProbeKind};
  3. use proc_macro::TokenStream;
  4. use syn::{parse_macro_input, ItemFn, ItemStatic};
  5. #[proc_macro_attribute]
  6. pub fn map(attrs: TokenStream, item: TokenStream) -> TokenStream {
  7. let args = parse_macro_input!(attrs as Args);
  8. let item = parse_macro_input!(item as ItemStatic);
  9. Map::from_syn(args, item)
  10. .and_then(|u| u.expand())
  11. .unwrap_or_else(|err| err.to_compile_error())
  12. .into()
  13. }
  14. #[proc_macro_attribute]
  15. pub fn kprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
  16. probe(ProbeKind::KProbe, attrs, item)
  17. }
  18. #[proc_macro_attribute]
  19. pub fn kretprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
  20. probe(ProbeKind::KRetProbe, attrs, item)
  21. }
  22. #[proc_macro_attribute]
  23. pub fn uprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
  24. probe(ProbeKind::UProbe, attrs, item)
  25. }
  26. #[proc_macro_attribute]
  27. pub fn uretprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
  28. probe(ProbeKind::URetProbe, attrs, item)
  29. }
  30. fn probe(kind: ProbeKind, attrs: TokenStream, item: TokenStream) -> TokenStream {
  31. let args = parse_macro_input!(attrs as Args);
  32. let item = parse_macro_input!(item as ItemFn);
  33. Probe::from_syn(kind, args, item)
  34. .and_then(|u| u.expand())
  35. .unwrap_or_else(|err| err.to_compile_error())
  36. .into()
  37. }