Commit a4e3b76e authored by Anisse Astier's avatar Anisse Astier Committed by Viresh Kumar
Browse files

rust: macros: enable use of hyphens in module names



Some modules might need naming that contains hyphens "-" to match the
auto-probing by name in the platform devices that comes from the device
tree.

But Rust identifier cannot contain hyphens, so replace them with
underscores.

Signed-off-by: default avatarAnisse Astier <anisse@astier.eu>
Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
[ Viresh: Replace "-" with '-', minor commit log fix, rename variable and
  fix line length checkpatch warnings ]
Reviewed-by: default avatarBenno Lossin <lossin@kernel.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent d01d7020
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -185,7 +185,9 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream {

    let info = ModuleInfo::parse(&mut it);

    let mut modinfo = ModInfoBuilder::new(info.name.as_ref());
    // Rust does not allow hyphens in identifiers, use underscore instead.
    let ident = info.name.replace('-', "_");
    let mut modinfo = ModInfoBuilder::new(ident.as_ref());
    if let Some(author) = info.author {
        modinfo.emit("author", &author);
    }
@@ -310,14 +312,15 @@ mod __module_init {{
                    #[doc(hidden)]
                    #[link_section = \"{initcall_section}\"]
                    #[used]
                    pub static __{name}_initcall: extern \"C\" fn() -> kernel::ffi::c_int = __{name}_init;
                    pub static __{ident}_initcall: extern \"C\" fn() ->
                        kernel::ffi::c_int = __{ident}_init;

                    #[cfg(not(MODULE))]
                    #[cfg(CONFIG_HAVE_ARCH_PREL32_RELOCATIONS)]
                    core::arch::global_asm!(
                        r#\".section \"{initcall_section}\", \"a\"
                        __{name}_initcall:
                            .long   __{name}_init - .
                        __{ident}_initcall:
                            .long   __{ident}_init - .
                            .previous
                        \"#
                    );
@@ -325,7 +328,7 @@ mod __module_init {{
                    #[cfg(not(MODULE))]
                    #[doc(hidden)]
                    #[no_mangle]
                    pub extern \"C\" fn __{name}_init() -> kernel::ffi::c_int {{
                    pub extern \"C\" fn __{ident}_init() -> kernel::ffi::c_int {{
                        // SAFETY: This function is inaccessible to the outside due to the double
                        // module wrapping it. It is called exactly once by the C side via its
                        // placement above in the initcall section.
@@ -335,13 +338,13 @@ mod __module_init {{
                    #[cfg(not(MODULE))]
                    #[doc(hidden)]
                    #[no_mangle]
                    pub extern \"C\" fn __{name}_exit() {{
                    pub extern \"C\" fn __{ident}_exit() {{
                        // SAFETY:
                        // - This function is inaccessible to the outside due to the double
                        //   module wrapping it. It is called exactly once by the C side via its
                        //   unique name,
                        // - furthermore it is only called after `__{name}_init` has returned `0`
                        //   (which delegates to `__init`).
                        // - furthermore it is only called after `__{ident}_init` has
                        //   returned `0` (which delegates to `__init`).
                        unsafe {{ __exit() }}
                    }}

@@ -381,6 +384,7 @@ unsafe fn __exit() {{
        ",
        type_ = info.type_,
        name = info.name,
        ident = ident,
        modinfo = modinfo.buffer,
        initcall_section = ".initcall6.init"
    )