Re: [PATCH v2 0/3] Inline helpers into Rust without full LTO

From: Miguel Ojeda

Date: Sun Mar 22 2026 - 15:22:33 EST


On Tue, 03 Feb 2026 11:34:07 +0000 Alice Ryhl <aliceryhl@xxxxxxxxxx> wrote:
>
> To get rid of these helper symbols, provide functionality to inline
> helpers into Rust using llvm-link. This option complements full LTO, by
> being much cheaper and avoiding incompatibility with BTF.

I have been testing this. I think we can go ahead with it, with a few
notes.

I will reply to a couple other bindings in separate emails to avoid
spamming people too much.

- I will mark the Kconfig option as "(EXPERIMENTAL)", since that is
what the commit message says and it allows us to be a bit
conservative.


- Clang passes `-Werror=unused-command-line-argument`, which means
under arm (i.e. 32-bit) we get:

clang: error: argument unused during compilation: '-U arm' [-Werror,-Wunused-command-line-argument]

And under UML I see:

clang: error: argument unused during compilation: '-I ./arch/um/include/shared' [-Werror,-Wunused-command-line-argument]
clang: error: argument unused during compilation: '-I ./arch/x86/um/shared' [-Werror,-Wunused-command-line-argument]
clang: error: argument unused during compilation: '-I ./arch/um/include/shared/skas' [-Werror,-Wunused-command-line-argument]

So we would need e.g. `-Wno-unused-command-line-argument` there
close to the `-Wno-override-module` one, unless Kbuild or
ClangBuiltLinux thinks it is important to keep it for this case.

On the other hand, regardless of whether we fix this (and another
issue in a separate email found thanks to the UML build), we could
instead add `depends on` listing explicitly the architectures where
this is going to be actually tested. That way maintainers can decide
whether they want to support it when they are ready. Thoughts?

Cc'ing Nathan, Nicolas, Nick, Bill, Justin, David, UML, ARM.


- If we use the `.bc` extension, we need to add a `.gitignore` for
`.bc` files, and an exception for `kernel/time/timeconst.bc`.

I guess we will not have too many `bc` scripts in the future for
that to be a problem. On the other hand, we have the chance to use
another extension (either for LLVM bitcode or for `bc` scripts).

But please let me know on e.g. the Kbuild side if someone has
concerns...


- Do we want to have the `cmd_ld_single` step even if the new mode is
not enabled? i.e. we are gating the other steps, so we could gate
that one too easily, no?

- $(cmd_ld_single) \
+ $(if $(link_helper),$(cmd_ld_single)) \

- $(cmd_ld_single) \
+ $(if $(CONFIG_RUST_INLINE_HELPERS),$(cmd_ld_single)) \

I mean, it only affects `CONFIG_LTO_CLANG` configs, which are on
their own experimental as far as I can see, so it is probably fine
as it is, but still, while making things unconditional on the caller
is good, it is also a behaviour change for configs outside the thing
introduced here, so I am asking.

(We could use something like a `is-rust-object` to do it on the
definition side, but I would leave that for later.)

Thanks!

Cheers,
Miguel