Skip to content

Commit e8c9f47

Browse files
committed
rex-macros: add macro support for uprobe
Signed-off-by: MinhPhan8803 <[email protected]>
1 parent 182a811 commit e8c9f47

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

rex-macros/src/kprobe.rs

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,30 @@
1+
use std::fmt;
2+
13
use proc_macro2::TokenStream;
24
use quote::{format_ident, quote};
35
use syn::{parse2, ItemFn, Result};
46

57
use crate::args::parse_string_args;
68

9+
#[allow(dead_code)]
10+
pub enum KprobeFlavor {
11+
Kprobe,
12+
Kretprobe,
13+
Uprobe,
14+
Uretprobe,
15+
}
16+
17+
impl fmt::Display for KprobeFlavor {
18+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19+
match self {
20+
KprobeFlavor::Kprobe => write!(f, "kprobe"),
21+
KprobeFlavor::Kretprobe => write!(f, "kretprobe"),
22+
KprobeFlavor::Uprobe => write!(f, "uprobe"),
23+
KprobeFlavor::Uretprobe => write!(f, "uretprobe"),
24+
}
25+
}
26+
}
27+
728
pub(crate) struct KProbe {
829
function: Option<String>,
930
item: ItemFn,
@@ -23,17 +44,17 @@ impl KProbe {
2344
Ok(KProbe { function, item })
2445
}
2546

26-
pub(crate) fn expand(&self) -> Result<TokenStream> {
47+
pub(crate) fn expand(&self, flavor: KprobeFlavor) -> Result<TokenStream> {
2748
let fn_name = self.item.sig.ident.clone();
2849
let item = &self.item;
2950
let function_name = format!("{}", fn_name);
3051
let prog_ident =
3152
format_ident!("PROG_{}", fn_name.to_string().to_uppercase());
3253

3354
let attached_function = if self.function.is_some() {
34-
format!("rex/kprobe/{}", self.function.as_ref().unwrap())
55+
format!("rex/{}/{}", flavor, self.function.as_ref().unwrap())
3556
} else {
36-
"rex/kprobe".to_string()
57+
format!("rex/{}", flavor)
3758
};
3859

3960
let function_body_tokens = quote! {

rex-macros/src/lib.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ mod xdp;
88

99
use std::borrow::Cow;
1010

11-
use kprobe::KProbe;
11+
use kprobe::{KProbe, KprobeFlavor};
1212
use perf_event::PerfEvent;
1313
use proc_macro::TokenStream;
1414
use proc_macro_error::{abort, proc_macro_error};
@@ -47,7 +47,19 @@ pub fn rex_tc(attrs: TokenStream, item: TokenStream) -> TokenStream {
4747
pub fn rex_kprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
4848
match KProbe::parse(attrs.into(), item.into()) {
4949
Ok(prog) => prog
50-
.expand()
50+
.expand(KprobeFlavor::Kprobe)
51+
.unwrap_or_else(|err| abort!(err.span(), "{}", err))
52+
.into(),
53+
Err(err) => abort!(err.span(), "{}", err),
54+
}
55+
}
56+
57+
#[proc_macro_error]
58+
#[proc_macro_attribute]
59+
pub fn rex_uprobe(attrs: TokenStream, item: TokenStream) -> TokenStream {
60+
match KProbe::parse(attrs.into(), item.into()) {
61+
Ok(prog) => prog
62+
.expand(KprobeFlavor::Uprobe)
5163
.unwrap_or_else(|err| abort!(err.span(), "{}", err))
5264
.into(),
5365
Err(err) => abort!(err.span(), "{}", err),

0 commit comments

Comments
 (0)