objtool/rust: add one more `noreturn` Rust function for Rust 1.87.0
authorMiguel Ojeda <ojeda@kernel.org>
Fri, 2 May 2025 14:02:33 +0000 (16:02 +0200)
committerMiguel Ojeda <ojeda@kernel.org>
Tue, 6 May 2025 22:08:51 +0000 (00:08 +0200)
Starting with Rust 1.87.0 (expected 2025-05-15), `objtool` may report:

    rust/core.o: warning: objtool: _R..._4core9panicking9panic_fmt() falls
    through to next function _R..._4core9panicking18panic_nounwind_fmt()

    rust/core.o: warning: objtool: _R..._4core9panicking18panic_nounwind_fmt()
    falls through to next function _R..._4core9panicking5panic()

The reason is that `rust_begin_unwind` is now mangled:

    _R..._7___rustc17rust_begin_unwind

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

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

Alternatively, we could remove the fixed one in `noreturn.h` and relax
this test to cover both, but it seems best to be strict as long as we can.

Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs).
Cc: Josh Poimboeuf <jpoimboe@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250502140237.1659624-2-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
tools/objtool/check.c

index 3a411064fa34b673ba5d44ddce59ec8b057773b6..b21b12ec88d9609ddcc43a3d58ef9f03f7dba494 100644 (file)
@@ -227,6 +227,7 @@ static bool is_rust_noreturn(const struct symbol *func)
               str_ends_with(func->name, "_4core9panicking19assert_failed_inner")                       ||
               str_ends_with(func->name, "_4core9panicking30panic_null_pointer_dereference")            ||
               str_ends_with(func->name, "_4core9panicking36panic_misaligned_pointer_dereference")      ||
+              str_ends_with(func->name, "_7___rustc17rust_begin_unwind")                               ||
               strstr(func->name, "_4core9panicking13assert_failed")                                    ||
               strstr(func->name, "_4core9panicking11panic_const24panic_const_")                        ||
               (strstr(func->name, "_4core5slice5index24slice_") &&