// 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::() .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]) }