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