lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAJ-ks9k-ksFmW-nrxH7XaQDut8YO0RepFyeQPEhgrKNAqEHsGA@mail.gmail.com>
Date: Sun, 4 Jan 2026 17:56:05 -0500
From: Tamir Duberstein <tamird@...il.com>
To: Gary Guo <gary@...yguo.net>
Cc: Miguel Ojeda <ojeda@...nel.org>, Boqun Feng <boqun.feng@...il.com>, 
	Björn Roy Baron <bjorn3_gh@...tonmail.com>, 
	Benno Lossin <lossin@...nel.org>, Andreas Hindborg <a.hindborg@...nel.org>, 
	Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>, 
	Danilo Krummrich <dakr@...nel.org>, Greg Kroah-Hartman <gregkh@...uxfoundation.org>, 
	Fiona Behrens <me@...enk.dev>, José Expósito <jose.exposito89@...il.com>, 
	Igor Korotin <igor.korotin.linux@...il.com>, rust-for-linux@...r.kernel.org, 
	David Gow <davidgow@...gle.com>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH 06/11] rust: macros: convert `#[export]` to use `syn`

On Thu, Dec 11, 2025 at 2:29 PM Gary Guo <gary@...nel.org> wrote:
>
> From: Gary Guo <gary@...yguo.net>
>
> This eliminates the custom `function_name` helper.
>
> Signed-off-by: Gary Guo <gary@...yguo.net>

Reviewed-by: Tamir Duberstein <tamird@...il.com>

> ---
>  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::<TokenStream>()
> -            .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 f6bbdb02d9d7d..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<Ident> {
> -    let mut input = input.into_iter();
> -    while let Some(token) = input.next() {
> -        match token {
> -            TokenTree::Ident(i) if i.to_string() == "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 4e440deaed853..870a42d41ac91 100644
> --- a/rust/macros/lib.rs
> +++ b/rust/macros/lib.rs
> @@ -206,8 +206,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
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ