| From abbf9a44944171ca99c150adad9361a2f517d3b6 Mon Sep 17 00:00:00 2001 |
| From: Miguel Ojeda <ojeda@kernel.org> |
| Date: Sun, 27 Jul 2025 11:23:17 +0200 |
| Subject: rust: workaround `rustdoc` target modifiers bug |
| |
| From: Miguel Ojeda <ojeda@kernel.org> |
| |
| commit abbf9a44944171ca99c150adad9361a2f517d3b6 upstream. |
| |
| Starting with Rust 1.88.0 (released 2025-06-26), `rustdoc` complains |
| about a target modifier mismatch in configurations where `-Zfixed-x18` |
| is passed: |
| |
| error: mixing `-Zfixed-x18` will cause an ABI mismatch in crate `rust_out` |
| | |
| = help: the `-Zfixed-x18` flag modifies the ABI so Rust crates compiled with different values of this flag cannot be used together safely |
| = note: unset `-Zfixed-x18` in this crate is incompatible with `-Zfixed-x18=` in dependency `core` |
| = help: set `-Zfixed-x18=` in this crate or unset `-Zfixed-x18` in `core` |
| = help: if you are sure this will not cause problems, you may use `-Cunsafe-allow-abi-mismatch=fixed-x18` to silence this error |
| |
| The reason is that `rustdoc` was not passing the target modifiers when |
| configuring the session options, and thus it would report a mismatch |
| that did not exist as soon as a target modifier is used in a dependency. |
| |
| We did not notice it in the kernel until now because `-Zfixed-x18` has |
| been a target modifier only since 1.88.0 (and it is the only one we use |
| so far). |
| |
| The issue has been reported upstream [1] and a fix has been submitted |
| [2], including a test similar to the kernel case. |
| |
| [ This is now fixed upstream (thanks Guillaume for the quick review), |
| so it will be fixed in Rust 1.90.0 (expected 2025-09-18). |
| |
| - Miguel ] |
| |
| Meanwhile, conditionally pass `-Cunsafe-allow-abi-mismatch=fixed-x18` |
| to workaround the issue on our side. |
| |
| Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs). |
| Reported-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> |
| Closes: https://lore.kernel.org/rust-for-linux/36cdc798-524f-4910-8b77-d7b9fac08d77@oss.qualcomm.com/ |
| Link: https://github.com/rust-lang/rust/issues/144521 [1] |
| Link: https://github.com/rust-lang/rust/pull/144523 [2] |
| Reviewed-by: Alice Ryhl <aliceryhl@google.com> |
| Link: https://lore.kernel.org/r/20250727092317.2930617-1-ojeda@kernel.org |
| Signed-off-by: Miguel Ojeda <ojeda@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| rust/Makefile | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/rust/Makefile |
| +++ b/rust/Makefile |
| @@ -62,6 +62,10 @@ core-cfgs = \ |
| |
| core-edition := $(if $(call rustc-min-version,108700),2024,2021) |
| |
| +# `rustdoc` did not save the target modifiers, thus workaround for |
| +# the time being (https://github.com/rust-lang/rust/issues/144521). |
| +rustdoc_modifiers_workaround := $(if $(call rustc-min-version,108800),-Cunsafe-allow-abi-mismatch=fixed-x18) |
| + |
| # `rustc` recognizes `--remap-path-prefix` since 1.26.0, but `rustdoc` only |
| # since Rust 1.81.0. Moreover, `rustdoc` ICEs on out-of-tree builds since Rust |
| # 1.82.0 (https://github.com/rust-lang/rust/issues/138520). Thus workaround both |
| @@ -74,6 +78,7 @@ quiet_cmd_rustdoc = RUSTDOC $(if $(rustd |
| -Zunstable-options --generate-link-to-definition \ |
| --output $(rustdoc_output) \ |
| --crate-name $(subst rustdoc-,,$@) \ |
| + $(rustdoc_modifiers_workaround) \ |
| $(if $(rustdoc_host),,--sysroot=/dev/null) \ |
| @$(objtree)/include/generated/rustc_cfg $< |
| |
| @@ -216,6 +221,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC |
| --extern bindings --extern uapi \ |
| --no-run --crate-name kernel -Zunstable-options \ |
| --sysroot=/dev/null \ |
| + $(rustdoc_modifiers_workaround) \ |
| --test-builder $(objtree)/scripts/rustdoc_test_builder \ |
| $< $(rustdoc_test_kernel_quiet); \ |
| $(objtree)/scripts/rustdoc_test_gen |