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 CF39F39E6F6; Wed, 7 Jan 2026 16:30:52 +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=1767803452; cv=none; b=aZztb71Y0xzKTAzdCWyfU9mvT43OMUx0noze7wDxl956qiopqQ/1Al2hSFVXMAPr2B/HCiwgTKvzm4jvLGxquEEFoM+FAgid615wYGtj/Rq59hNkj+kF0C8L8zbSgjabZhxj8fABNgH6f0GsLkz7sQbBYsYYXKRIIaqkNJNCGzY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767803452; 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=VCX5bgD0shAQYaybUx1rLnolB5cr8k9RhTDdDB1xez4vlww9/12AsTbc5hGAWTDyfEIBaGkXqT/+RtpW2z4FRAvVwo/odEkGmUQuaTELH1f6lWxUv2cks6SG3V24mJktnI6SqC0PntonGOG6oNG/3bCJWSk4JUbpdDd+Ojr+bTk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G1aNaGP1; 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="G1aNaGP1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8AB08C4CEF1; Wed, 7 Jan 2026 16:30:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1767803451; bh=9+WqlpbFfi+4Am5/RJ/pw+Tm4NT8QhEaJtpFEmsL2to=; h=From:To:Cc:Subject:Date:In-Reply-To:References:Reply-To:From; b=G1aNaGP1zodQz9XI40H5vsrTBojLzavQim1pOt4EogDejvmJbOF9jsv4+7BspxMBF 1zc7Nf1Saw5+Lcd1e5XDrDDSwCIpp1+yw3aWCdR4ke6zcw1vHmK40BnLnecUA3bdS1 e952yd8290Tp054x1ZctSwajfx9xRYU5xXPOxH4EKy5ibseeRxpu5OZQl4Za3IW5ZQ LxuBhKWRtJ47XJzM9P+vUey7RTJN67Yq9J5W88kz5S79qgEPKXgG6ywOi8urRyp6u/ IgEotEBwblZjN5/rCg/6X7sdeQUeHn1tk1xPOJ25P1lkp81j+GWqE6ucezUHSql3tQ J4IGKp2+NF3VA== 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 , 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 v2 06/11] rust: macros: convert `#[export]` to use `syn` Date: Wed, 7 Jan 2026 16:15:45 +0000 Message-ID: <20260107161729.3855851-7-gary@kernel.org> X-Mailer: git-send-email 2.51.2 In-Reply-To: <20260107161729.3855851-1-gary@kernel.org> References: <20260107161729.3855851-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