1 // SPDX-License-Identifier: GPL-2.0 2 3 use crate::helpers::function_name; 4 use proc_macro::TokenStream; 5 6 /// Please see [`crate::export`] for documentation. export(_attr: TokenStream, ts: TokenStream) -> TokenStream7pub(crate) fn export(_attr: TokenStream, ts: TokenStream) -> TokenStream { 8 let Some(name) = function_name(ts.clone()) else { 9 return "::core::compile_error!(\"The #[export] attribute must be used on a function.\");" 10 .parse::<TokenStream>() 11 .unwrap(); 12 }; 13 14 // This verifies that the function has the same signature as the declaration generated by 15 // bindgen. It makes use of the fact that all branches of an if/else must have the same type. 16 let signature_check = quote!( 17 const _: () = { 18 if true { 19 ::kernel::bindings::#name 20 } else { 21 #name 22 }; 23 }; 24 ); 25 26 let no_mangle = quote!(#[no_mangle]); 27 28 TokenStream::from_iter([signature_check, no_mangle, ts]) 29 } 30