diff options
Diffstat (limited to 'rust/macros/export.rs')
| -rw-r--r-- | rust/macros/export.rs | 29 | 
1 files changed, 29 insertions, 0 deletions
| diff --git a/rust/macros/export.rs b/rust/macros/export.rs new file mode 100644 index 000000000000..a08f6337d5c8 --- /dev/null +++ b/rust/macros/export.rs @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 + +use crate::helpers::function_name; +use proc_macro::TokenStream; + +/// Please see [`crate::export`] for documentation. +pub(crate) fn export(_attr: TokenStream, ts: TokenStream) -> TokenStream { +    let Some(name) = function_name(ts.clone()) else { +        return "::core::compile_error!(\"The #[export] attribute must be used on a function.\");" +            .parse::<TokenStream>() +            .unwrap(); +    }; + +    // This verifies that the function has the same signature as the declaration generated by +    // bindgen. It makes use of the fact that all branches of an if/else must have the same type. +    let signature_check = quote!( +        const _: () = { +            if true { +                ::kernel::bindings::#name +            } else { +                #name +            }; +        }; +    ); + +    let no_mangle = quote!(#[no_mangle]); + +    TokenStream::from_iter([signature_check, no_mangle, ts]) +} | 
