#[doc(hidden)]
#[macro_export]
macro_rules! platform_probe(
($provider:ident, $name:ident, $($arg:expr,)*) => ({
$crate::sdt!([sym 0], $provider, $name, $($arg,)*);
})
);
#[doc(hidden)]
#[macro_export]
macro_rules! platform_probe_lazy(
($provider:ident, $name:ident, $($arg:expr,)*) => ({
#[link_section = ".probes"]
static mut SEMAPHORE: u16 = 0;
let enabled = unsafe { ::core::ptr::read_volatile(&SEMAPHORE) } != 0;
if enabled {
$crate::sdt!([sym "{}" SEMAPHORE], $provider, $name, $($arg,)*);
}
enabled
})
);
#[doc(hidden)]
#[macro_export]
macro_rules! sdt(
([sym $symstr:literal $($sym:ident)?],
$provider:ident, $name:ident, $($arg:expr,)*
) => (
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
$crate::sdt!([sym $symstr $($sym)?, opt att_syntax],
$provider, $name, $($arg,)*);
#[cfg(not(any(target_arch = "x86_64", target_arch = "x86")))]
$crate::sdt!([sym $symstr $($sym)?, opt],
$provider, $name, $($arg,)*);
);
([sym $symstr:literal $($sym:ident)?, opt $($opt:ident)?],
$provider:ident, $name:ident, $($arg1:expr, $($arg:expr,)*)?
) => (
#[cfg(target_pointer_width = "32")]
$crate::sdt!([sym $symstr $($sym)?, opt $($opt)?, size 4],
$provider, $name, $("-4@{}", $arg1, $(" -4@{}", $arg,)*)?);
#[cfg(target_pointer_width = "64")]
$crate::sdt!([sym $symstr $($sym)?, opt $($opt)?, size 8],
$provider, $name, $("-8@{}", $arg1, $(" -8@{}", $arg,)*)?);
);
([sym $symstr:literal $($sym:ident)?, opt $($opt:ident)?, size $size:literal],
$provider:ident, $name:ident, $($argstr:literal, $arg:expr,)*
) => (unsafe {
::core::arch::asm!(concat!(r#"
990: nop
.pushsection .note.stapsdt,"?","note"
.balign 4
.4byte 992f-991f, 994f-993f, 3
991: .asciz "stapsdt"
992: .balign 4
993: ."#, $size, r#"byte 990b
."#, $size, r#"byte _.stapsdt.base
."#, $size, r#"byte "#, $symstr, r#"
.asciz ""#, stringify!($provider), r#""
.asciz ""#, stringify!($name), r#""
.asciz ""#, $($argstr,)* r#""
994: .balign 4
.popsection
.ifndef _.stapsdt.base
.pushsection .stapsdt.base,"aGR","progbits",.stapsdt.base,comdat
.weak _.stapsdt.base
.hidden _.stapsdt.base
_.stapsdt.base: .space 1
.size _.stapsdt.base, 1
.popsection
.endif"#),
$(sym $sym,)?
$(in(reg) ($arg) as isize,)*
options(readonly, nostack, preserves_flags $(, $opt)?),
)
});
);