Skip to content

Commit d78e94b

Browse files
authored
Merge pull request #1385 from hermit-os/strace
feat: add strace feature
2 parents 2a6f779 + a573adb commit d78e94b

File tree

2 files changed

+71
-20
lines changed

2 files changed

+71
-20
lines changed

Cargo.toml

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -47,31 +47,28 @@ harness = false
4747
[features]
4848
default = ["pci", "pci-ids", "acpi", "fsgsbase", "smp", "tcp", "dhcpv4", "fuse", "vsock"]
4949
acpi = []
50-
dhcpv4 = [
51-
"smoltcp",
52-
"smoltcp/proto-dhcpv4",
53-
"smoltcp/socket-dhcpv4",
54-
]
50+
common-os = []
51+
dhcpv4 = ["smoltcp", "smoltcp/proto-dhcpv4", "smoltcp/socket-dhcpv4"]
52+
dns = ["smoltcp", "smoltcp/socket-dns"]
5553
fs = ["fuse"]
56-
fuse = ["pci", "dep:fuse-abi", "fuse-abi/num_enum"]
57-
vsock = ["pci"]
5854
fsgsbase = []
55+
fuse = ["pci", "dep:fuse-abi", "fuse-abi/num_enum"]
5956
gem-net = ["tcp", "dep:tock-registers"]
57+
idle-poll = []
58+
mmap = []
6059
newlib = []
60+
nostd = []
6161
pci = ["virtio/pci"]
6262
rtl8139 = ["tcp", "pci"]
63+
semihosting = ["dep:semihosting"]
64+
shell = ["simple-shell"]
6365
smp = []
66+
strace = []
6467
tcp = ["smoltcp", "smoltcp/socket-tcp"]
65-
udp = ["smoltcp", "smoltcp/socket-udp"]
66-
dns = ["smoltcp", "smoltcp/socket-dns"]
6768
trace = []
69+
udp = ["smoltcp", "smoltcp/socket-udp"]
6870
vga = []
69-
common-os = []
70-
nostd = []
71-
semihosting = ["dep:semihosting"]
72-
shell = ["simple-shell"]
73-
idle-poll = []
74-
mmap = []
71+
vsock = ["pci"]
7572

7673
[dependencies]
7774
hermit-macro = { path = "hermit-macro" }

hermit-macro/src/system.rs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use proc_macro2::{Ident, Span};
22
use quote::quote;
3-
use syn::{parse_quote, Abi, Attribute, Item, ItemFn, Pat, Result, Signature, Visibility};
3+
use syn::{parse_quote, Abi, Attribute, FnArg, Item, ItemFn, Pat, Result, Signature, Visibility};
44

55
fn validate_vis(vis: &Visibility) -> Result<()> {
66
if !matches!(vis, Visibility::Public(_)) {
@@ -96,6 +96,38 @@ fn emit_func(mut func: ItemFn, sig: &ParsedSig) -> Result<ItemFn> {
9696
func.vis = Visibility::Inherited;
9797
func.attrs.clear();
9898

99+
let input_idents = sig
100+
.inputs
101+
.iter()
102+
.map(|fn_arg| match fn_arg {
103+
FnArg::Typed(pat_type) => match &*pat_type.pat {
104+
Pat::Ident(pat_ident) => &pat_ident.ident,
105+
_ => unreachable!(),
106+
},
107+
_ => unreachable!(),
108+
})
109+
.collect::<Vec<_>>();
110+
let input_format = input_idents
111+
.iter()
112+
.map(|ident| format!("{ident} = {{:?}}"))
113+
.collect::<Vec<_>>()
114+
.join(", ");
115+
let strace_format = format!("{}({input_format}) = ", sig.ident);
116+
117+
let block = func.block;
118+
func.block = parse_quote! {{
119+
#[allow(unreachable_code)]
120+
#[allow(clippy::diverging_sub_expression)]
121+
{
122+
#[cfg(feature = "strace")]
123+
print!(#strace_format, #(#input_idents),*);
124+
let ret = #block;
125+
#[cfg(feature = "strace")]
126+
println!("{ret:?}");
127+
ret
128+
}
129+
}};
130+
99131
let func_call = quote! {
100132
kernel_function!(#ident(#(#args),*))
101133
};
@@ -156,8 +188,19 @@ mod tests {
156188
#[no_mangle]
157189
pub extern "C" fn sys_test(a: i8, b: i16) -> i32 {
158190
extern "C" fn __sys_test(a: i8, b: i16) -> i32 {
159-
let c = i16::from(a) + b;
160-
i32::from(c)
191+
#[allow(unreachable_code)]
192+
#[allow(clippy::diverging_sub_expression)]
193+
{
194+
#[cfg(feature = "strace")]
195+
print!("sys_test(a = {:?}, b = {:?}) = ", a, b);
196+
let ret = {
197+
let c = i16::from(a) + b;
198+
i32::from(c)
199+
};
200+
#[cfg(feature = "strace")]
201+
println!("{ret:?}");
202+
ret
203+
}
161204
}
162205

163206
kernel_function!(__sys_test(a, b))
@@ -193,8 +236,19 @@ mod tests {
193236
#[no_mangle]
194237
pub unsafe extern "C" fn sys_test(a: i8, b: i16) -> i32 {
195238
unsafe extern "C" fn __sys_test(a: i8, b: i16) -> i32 {
196-
let c = i16::from(a) + b;
197-
i32::from(c)
239+
#[allow(unreachable_code)]
240+
#[allow(clippy::diverging_sub_expression)]
241+
{
242+
#[cfg(feature = "strace")]
243+
print!("sys_test(a = {:?}, b = {:?}) = ", a, b);
244+
let ret = {
245+
let c = i16::from(a) + b;
246+
i32::from(c)
247+
};
248+
#[cfg(feature = "strace")]
249+
println!("{ret:?}");
250+
ret
251+
}
198252
}
199253

200254
unsafe { kernel_function!(__sys_test(a, b)) }

0 commit comments

Comments
 (0)