[PATCH] objtool/rust: add one more `noreturn` Rust function

Miguel Ojeda posted 1 patch 2 months ago
tools/objtool/check.c | 1 +
1 file changed, 1 insertion(+)
[PATCH] objtool/rust: add one more `noreturn` Rust function
Posted by Miguel Ojeda 2 months ago
Between Rust 1.79 and 1.86, under `CONFIG_RUST_KERNEL_DOCTESTS=y`,
`objtool` may report:

    rust/doctests_kernel_generated.o: warning: objtool:
    rust_doctest_kernel_alloc_kbox_rs_13() falls through to next
    function rust_doctest_kernel_alloc_kvec_rs_0()

(as well as in rust_doctest_kernel_alloc_kvec_rs_0) due to calls to the
`noreturn` symbol:

    core::option::expect_failed

from code added in commits 779db37373a3 ("rust: alloc: kvec: implement
AsPageIter for VVec") and 671618432f46 ("rust: alloc: kbox: implement
AsPageIter for VBox").

Thus add the mangled one to the list so that `objtool` knows it is
actually `noreturn`.

This can be reproduced as well in other versions by tweaking the code,
such as the latest stable Rust (1.90.0).

Stable does not have code that triggers this, but it could have it in
the future. Downstream forks could too. Thus tag it for backport.

See commit 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions")
for more details.

Cc: stable@vger.kernel.org # Needed in 6.12.y and later.
Cc: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
---
 tools/objtool/check.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index a5770570b106..3c7ab910b189 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -217,6 +217,7 @@ static bool is_rust_noreturn(const struct symbol *func)
 	 * these come from the Rust standard library).
 	 */
 	return str_ends_with(func->name, "_4core5sliceSp15copy_from_slice17len_mismatch_fail")		||
+	       str_ends_with(func->name, "_4core6option13expect_failed")				||
 	       str_ends_with(func->name, "_4core6option13unwrap_failed")				||
 	       str_ends_with(func->name, "_4core6result13unwrap_failed")				||
 	       str_ends_with(func->name, "_4core9panicking5panic")					||

base-commit: 211ddde0823f1442e4ad052a2f30f050145ccada
-- 
2.51.0
Re: [PATCH] objtool/rust: add one more `noreturn` Rust function
Posted by Peter Zijlstra 1 month, 4 weeks ago
On Mon, Oct 20, 2025 at 04:07:14AM +0200, Miguel Ojeda wrote:
> Between Rust 1.79 and 1.86, under `CONFIG_RUST_KERNEL_DOCTESTS=y`,
> `objtool` may report:
> 
>     rust/doctests_kernel_generated.o: warning: objtool:
>     rust_doctest_kernel_alloc_kbox_rs_13() falls through to next
>     function rust_doctest_kernel_alloc_kvec_rs_0()
> 
> (as well as in rust_doctest_kernel_alloc_kvec_rs_0) due to calls to the
> `noreturn` symbol:
> 
>     core::option::expect_failed
> 
> from code added in commits 779db37373a3 ("rust: alloc: kvec: implement
> AsPageIter for VVec") and 671618432f46 ("rust: alloc: kbox: implement
> AsPageIter for VBox").
> 
> Thus add the mangled one to the list so that `objtool` knows it is
> actually `noreturn`.
> 
> This can be reproduced as well in other versions by tweaking the code,
> such as the latest stable Rust (1.90.0).
> 
> Stable does not have code that triggers this, but it could have it in
> the future. Downstream forks could too. Thus tag it for backport.
> 
> See commit 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions")
> for more details.
> 
> Cc: stable@vger.kernel.org # Needed in 6.12.y and later.
> Cc: Josh Poimboeuf <jpoimboe@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
> ---
>  tools/objtool/check.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/tools/objtool/check.c b/tools/objtool/check.c
> index a5770570b106..3c7ab910b189 100644
> --- a/tools/objtool/check.c
> +++ b/tools/objtool/check.c
> @@ -217,6 +217,7 @@ static bool is_rust_noreturn(const struct symbol *func)
>  	 * these come from the Rust standard library).
>  	 */
>  	return str_ends_with(func->name, "_4core5sliceSp15copy_from_slice17len_mismatch_fail")		||
> +	       str_ends_with(func->name, "_4core6option13expect_failed")				||
>  	       str_ends_with(func->name, "_4core6option13unwrap_failed")				||
>  	       str_ends_with(func->name, "_4core6result13unwrap_failed")				||
>  	       str_ends_with(func->name, "_4core9panicking5panic")					||
> 

I'll go stick it in tip/objtool/core; but I gotta ask, where are we with
the toolchain support for noreturn?
Re: [PATCH] objtool/rust: add one more `noreturn` Rust function
Posted by Miguel Ojeda 1 month, 4 weeks ago
On Tue, Oct 21, 2025 at 7:19 PM Peter Zijlstra <peterz@infradead.org> wrote:
>
> I'll go stick it in tip/objtool/core; but I gotta ask, where are we with
> the toolchain support for noreturn?

Thanks Peter!

We discussed it with upstream Rust, and they understood the need, so
we may get something like `--emit=noreturn` or similar, but it is
still open (and not too high in the priority list since we can survive
with this for now and we have other things that we really need them to
get stabilized etc. But if you feel it should be prioritized more,
please let me know).

I have the status under "Export (somehow) a list of all noreturn symbols." at:

    https://github.com/Rust-for-Linux/linux/issues/355

In particular, Gary proposed an alternative during those discussions:

    "Gary proposed reading DWARF instead and wrote a quick Rust script
for it via object and gimli, though DWARF would need to be available
or generated on the fly just for that (and we cannot commit a fixed
list since the kernel config may change and we support several Rust
versions and so on):
https://gist.github.com/nbdd0121/449692570622c2f46a29ad9f47c3379a."

Cheers,
Miguel
Re: [PATCH] objtool/rust: add one more `noreturn` Rust function
Posted by Peter Zijlstra 1 month, 4 weeks ago
On Tue, Oct 21, 2025 at 07:25:11PM +0200, Miguel Ojeda wrote:
> On Tue, Oct 21, 2025 at 7:19 PM Peter Zijlstra <peterz@infradead.org> wrote:
> >
> > I'll go stick it in tip/objtool/core; but I gotta ask, where are we with
> > the toolchain support for noreturn?
> 
> Thanks Peter!
> 
> We discussed it with upstream Rust, and they understood the need, so
> we may get something like `--emit=noreturn` or similar, but it is
> still open (and not too high in the priority list since we can survive
> with this for now and we have other things that we really need them to
> get stabilized etc. But if you feel it should be prioritized more,
> please let me know).

Nah, as long as its not forgotten I suppose it'll show up at some point.

I would place including C headers in Rust at a *MUCH* higher priority
than this. This bindgen nonsense is a giant pain in the arse.

> I have the status under "Export (somehow) a list of all noreturn symbols." at:
> 
>     https://github.com/Rust-for-Linux/linux/issues/355
> 
> In particular, Gary proposed an alternative during those discussions:
> 
>     "Gary proposed reading DWARF instead and wrote a quick Rust script
> for it via object and gimli, though DWARF would need to be available
> or generated on the fly just for that (and we cannot commit a fixed
> list since the kernel config may change and we support several Rust
> versions and so on):
> https://gist.github.com/nbdd0121/449692570622c2f46a29ad9f47c3379a."

Right, the problem with DWARF is that you need to have DWARF and debug
builds are *SLOW* :/ But perhaps rust compile times are such that that
isn't noticable?
Re: [PATCH] objtool/rust: add one more `noreturn` Rust function
Posted by Alice Ryhl 2 months ago
On Mon, Oct 20, 2025 at 04:07:14AM +0200, Miguel Ojeda wrote:
> Between Rust 1.79 and 1.86, under `CONFIG_RUST_KERNEL_DOCTESTS=y`,
> `objtool` may report:
> 
>     rust/doctests_kernel_generated.o: warning: objtool:
>     rust_doctest_kernel_alloc_kbox_rs_13() falls through to next
>     function rust_doctest_kernel_alloc_kvec_rs_0()
> 
> (as well as in rust_doctest_kernel_alloc_kvec_rs_0) due to calls to the
> `noreturn` symbol:
> 
>     core::option::expect_failed
> 
> from code added in commits 779db37373a3 ("rust: alloc: kvec: implement
> AsPageIter for VVec") and 671618432f46 ("rust: alloc: kbox: implement
> AsPageIter for VBox").
> 
> Thus add the mangled one to the list so that `objtool` knows it is
> actually `noreturn`.
> 
> This can be reproduced as well in other versions by tweaking the code,
> such as the latest stable Rust (1.90.0).
> 
> Stable does not have code that triggers this, but it could have it in
> the future. Downstream forks could too. Thus tag it for backport.
> 
> See commit 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions")
> for more details.
> 
> Cc: stable@vger.kernel.org # Needed in 6.12.y and later.
> Cc: Josh Poimboeuf <jpoimboe@kernel.org>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>

Reviewed-by: Alice Ryhl <aliceryhl@google.com>
[tip: objtool/urgent] objtool/rust: add one more `noreturn` Rust function
Posted by tip-bot2 for Miguel Ojeda 1 month, 3 weeks ago
The following commit has been merged into the objtool/urgent branch of tip:

Commit-ID:     dbdf2a7feb422f9bacfd12774e624cf26f503eb0
Gitweb:        https://git.kernel.org/tip/dbdf2a7feb422f9bacfd12774e624cf26f503eb0
Author:        Miguel Ojeda <ojeda@kernel.org>
AuthorDate:    Mon, 20 Oct 2025 04:07:14 +02:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Wed, 22 Oct 2025 15:21:54 +02:00

objtool/rust: add one more `noreturn` Rust function

Between Rust 1.79 and 1.86, under `CONFIG_RUST_KERNEL_DOCTESTS=y`,
`objtool` may report:

    rust/doctests_kernel_generated.o: warning: objtool:
    rust_doctest_kernel_alloc_kbox_rs_13() falls through to next
    function rust_doctest_kernel_alloc_kvec_rs_0()

(as well as in rust_doctest_kernel_alloc_kvec_rs_0) due to calls to the
`noreturn` symbol:

    core::option::expect_failed

from code added in commits 779db37373a3 ("rust: alloc: kvec: implement
AsPageIter for VVec") and 671618432f46 ("rust: alloc: kbox: implement
AsPageIter for VBox").

Thus add the mangled one to the list so that `objtool` knows it is
actually `noreturn`.

This can be reproduced as well in other versions by tweaking the code,
such as the latest stable Rust (1.90.0).

Stable does not have code that triggers this, but it could have it in
the future. Downstream forks could too. Thus tag it for backport.

See commit 56d680dd23c3 ("objtool/rust: list `noreturn` Rust functions")
for more details.

Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Cc: stable@vger.kernel.org # Needed in 6.12.y and later.
Link: https://patch.msgid.link/20251020020714.2511718-1-ojeda@kernel.org
---
 tools/objtool/check.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/objtool/check.c b/tools/objtool/check.c
index a577057..3c7ab91 100644
--- a/tools/objtool/check.c
+++ b/tools/objtool/check.c
@@ -217,6 +217,7 @@ static bool is_rust_noreturn(const struct symbol *func)
 	 * these come from the Rust standard library).
 	 */
 	return str_ends_with(func->name, "_4core5sliceSp15copy_from_slice17len_mismatch_fail")		||
+	       str_ends_with(func->name, "_4core6option13expect_failed")				||
 	       str_ends_with(func->name, "_4core6option13unwrap_failed")				||
 	       str_ends_with(func->name, "_4core6result13unwrap_failed")				||
 	       str_ends_with(func->name, "_4core9panicking5panic")					||