From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A0CA17B505; Mon, 12 Jan 2026 17:11:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768237898; cv=none; b=LEeH1XKOKwqzWFw4cqr//B7ZkbewQtxik4wu3XeZy48Uxe5ZZ3wn8gvWAsH55JGuz27RjJNycshUp36cgtqCrI7cF+iD6LtGarspITwAjA9x03fzRv8dCJZGlRLYD2DaqZtcWUTfQXbbTQ5fVHZ01ddaCmmQ0J9IKPkqd50O7CA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768237898; c=relaxed/simple; bh=9+WqlpbFfi+4Am5/RJ/pw+Tm4NT8QhEaJtpFEmsL2to=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YFbQEa77x6oTNJi8IPZGTgVfCMRepmU5sZrukWhmHm1/KfyM4UNOQlUPTKdihwMmZMw27mAaHS1WUOasiyJCnlrTO9ZSBjKTd2UAhsOPt8uyUkEbJsBe0oQJj1LYhKcObJEbsbYN1BGQKwZyQO5KeANPrXVTYRCWtJH5scv9OA0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ax7iOgxo; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ax7iOgxo" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 370BEC16AAE; Mon, 12 Jan 2026 17:11:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768237898; bh=9+WqlpbFfi+4Am5/RJ/pw+Tm4NT8QhEaJtpFEmsL2to=; h=From:To:Cc:Subject:Date:In-Reply-To:References:Reply-To:From; b=Ax7iOgxok4vxAGu6A/uKes61Aeb+usUKVMpXjuEB6RPP4HiSKNXUWMOLwaW0WV68y zn4fSJgJ2iY1PflLANVgfykJx9sAV8KVoabRZgX93nZs+ogpR8125z+H7I7EESSGdq Acl7Srg1e/G+4rKYTEEezdtUaLIYlJtI0g/D+IOU9hsofpxGPdmxHlx0sWTr03hKZ0 VYOahtS3YTvnEDZoL4DaxzdCWQ4T9Ro3ms5GjVnep8509/nrieXNPzkaBYxGC+6/FZ a9KciS/G3ATqCnOAei3N3Gafh8j+BPS2ijox9I/d3SGa+a3L7JHtefvlq28Iu/kPxT DH5TilZqgSV3Q== From: Gary Guo To: Miguel Ojeda , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Tamir Duberstein , Greg Kroah-Hartman , Guilherme Giacomo Simoes , =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v3 06/12] rust: macros: convert `#[export]` to use `syn` Date: Mon, 12 Jan 2026 17:07:17 +0000 Message-ID: <20260112170919.1888584-7-gary@kernel.org> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260112170919.1888584-1-gary@kernel.org> References: <20260112170919.1888584-1-gary@kernel.org> Reply-To: Gary Guo Precedence: bulk X-Mailing-List: rust-for-linux@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Gary Guo This eliminates the custom `function_name` helper. Reviewed-by: Tamir Duberstein Reviewed-by: Benno Lossin Signed-off-by: Gary Guo --- rust/macros/export.rs | 24 +++++++++--------------- rust/macros/helpers.rs | 18 ------------------ rust/macros/lib.rs | 5 +++-- 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/rust/macros/export.rs b/rust/macros/export.rs index 92d9b30971929..6d53521f62fc7 100644 --- a/rust/macros/export.rs +++ b/rust/macros/export.rs @@ -3,19 +3,14 @@ use proc_macro2::TokenStream; use quote::quote; -use crate::helpers::function_name; - /// 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(); - }; +pub(crate) fn export(f: syn::ItemFn) -> TokenStream { + let name = &f.sig.ident; - // 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!( + quote! { + // 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. const _: () = { if true { ::kernel::bindings::#name @@ -23,9 +18,8 @@ pub(crate) fn export(_attr: TokenStream, ts: TokenStream) -> TokenStream { #name }; }; - ); - - let no_mangle = quote!(#[no_mangle]); - TokenStream::from_iter([signature_check, no_mangle, ts]) + #[no_mangle] + #f + } } diff --git a/rust/macros/helpers.rs b/rust/macros/helpers.rs index fa66ef6eb0f3d..754c827cc21e1 100644 --- a/rust/macros/helpers.rs +++ b/rust/macros/helpers.rs @@ -2,7 +2,6 @@ use proc_macro2::{ token_stream, - Ident, TokenStream, TokenTree, // }; @@ -50,23 +49,6 @@ pub(crate) fn value(&self) -> String { } } -/// Given a function declaration, finds the name of the function. -pub(crate) fn function_name(input: TokenStream) -> Option { - let mut input = input.into_iter(); - while let Some(token) = input.next() { - match token { - TokenTree::Ident(i) if i == "fn" => { - if let Some(TokenTree::Ident(i)) = input.next() { - return Some(i); - } - return None; - } - _ => continue, - } - } - None -} - pub(crate) fn file() -> String { #[cfg(not(CONFIG_RUSTC_HAS_SPAN_FILE))] { diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs index c5347127a3a51..da8239d2474b6 100644 --- a/rust/macros/lib.rs +++ b/rust/macros/lib.rs @@ -234,8 +234,9 @@ pub fn vtable(attr: TokenStream, input: TokenStream) -> TokenStream { /// This macro is *not* the same as the C macros `EXPORT_SYMBOL_*`. All Rust symbols are currently /// automatically exported with `EXPORT_SYMBOL_GPL`. #[proc_macro_attribute] -pub fn export(attr: TokenStream, ts: TokenStream) -> TokenStream { - export::export(attr.into(), ts.into()).into() +pub fn export(attr: TokenStream, input: TokenStream) -> TokenStream { + parse_macro_input!(attr as syn::parse::Nothing); + export::export(parse_macro_input!(input)).into() } /// Like [`core::format_args!`], but automatically wraps arguments in [`kernel::fmt::Adapter`]. -- 2.51.2