Re: [PATCH 3/3] rust: upgrade to Rust 1.78.0

From: Alice Ryhl
Date: Thu Apr 04 2024 - 08:42:32 EST


On Mon, Apr 1, 2024 at 11:23 PM Miguel Ojeda <ojeda@xxxxxxxxxx> wrote:
>
> This is the next upgrade to the Rust toolchain, from 1.77.1 to 1.78.0
> (i.e. the latest) [1].
>
> See the upgrade policy [2] and the comments on the first upgrade in
> commit 3ed03f4da06e ("rust: upgrade to Rust 1.68.2").
>
> # Unstable features
>
> There have been no changes to the set of unstable features used in
> our own code. Therefore, the only unstable features allowed to be used
> outside the `kernel` crate is still `new_uninit`.
>
> However, since we are finally dropping our `alloc` fork [3], all the
> unstable features used by `alloc` (~30 language ones, ~60 library ones)
> are not a concern anymore. This reduces the maintenance burden, increases
> the chances of new compiler versions working without changes and gets
> us closer to the goal of supporting several compiler versions.
>
> It also means that, ignoring non-language/library features, we are
> currently left with just the few language features needed to implement the
> kernel `Arc`, the `new_uninit` library feature, the `compiler_builtins`
> marker and the few `no_*` `cfg`s we pass when compiling `core`/`alloc`.
>
> Please see [4] for details.
>
> # Required changes
>
> ## LLVM's data layout
>
> Rust 1.77.0 (i.e. the previous upgrade) introduced a check for matching
> LLVM data layouts [5]. Then, Rust 1.78.0 upgraded LLVM's bundled major
> version from 17 to 18 [6], which changed the data layout in x86 [7]. Thus
> update the data layout in our custom target specification for x86 so
> that the compiler does not complain about the mismatch:
>
> error: data-layout for target `target-5559158138856098584`,
> `e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128`,
> differs from LLVM target's `x86_64-linux-gnu` default layout,
> `e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128`
>
> In the future, the goal is to drop the custom target specifications.
> Meanwhile, if we want to support other LLVM versions used in `rustc`
> (e.g. for LTO), we will need to add some extra logic (e.g. conditional on
> LLVM's version, or extracting the data layout from an existing built-in
> target specification).
>
> ## `unused_imports`
>
> Rust's `unused_imports` lint covers both unused and redundant imports.
> Now, in 1.78.0, the lint detects more cases of redundant imports [8].
> Thus one of the previous patches cleaned them up.
>
> ## Clippy's `new_without_default`
>
> Clippy now suggests to implement `Default` even when `new()` is `const`,
> since `Default::default()` may call `const` functions even if it is not
> `const` itself [9]. Thus one of the previous patches implemented it.
>
> # Other changes in Rust
>
> Rust 1.78.0 introduced `feature(asm_goto)` [10] [11]. This feature was
> discussed in the past [12].
>
> Rust 1.78.0 introduced support for mutable pointers to Rust statics,
> including a test case for the Linux kernel's `VTABLE` use case [13].
>
> Rust 1.78.0 with debug assertions enabled (i.e. `-Cdebug-assertions=y`,
> kernel's `CONFIG_RUST_DEBUG_ASSERTIONS=y`) now always checks all unsafe
> preconditions, without a way to opt-out for particular cases [14].
>
> Rust 1.78.0 also improved a couple issues we reported when giving feedback
> for the new `--check-cfg` feature [15] [16].
>
> # `alloc` upgrade and reviewing
>
> As mentioned above, compiler upgrades will not update `alloc` anymore,
> since we are dropping our `alloc` fork [3].
>
> Link: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1780-2024-05-02 [1]
> Link: https://rust-for-linux.com/rust-version-policy [2]
> Link: https://lore.kernel.org/rust-for-linux/20240328013603.206764-1-wedsonaf@xxxxxxxxx/ [3]
> Link: https://github.com/Rust-for-Linux/linux/issues/2 [4]
> Link: https://github.com/rust-lang/rust/pull/120062 [5]
> Link: https://github.com/rust-lang/rust/pull/120055 [6]
> Link: https://reviews.llvm.org/D86310 [7]
> Link: https://github.com/rust-lang/rust/pull/117772 [8]
> Link: https://github.com/rust-lang/rust-clippy/pull/10903 [9]
> Link: https://github.com/rust-lang/rust/pull/119365 [10]
> Link: https://github.com/rust-lang/rust/issues/119364 [11]
> Link: https://lore.kernel.org/rust-for-linux/ZWipTZysC2YL7qsq@xxxxxxxxxxxxxxxxxxxx/ [12]
> Link: https://github.com/rust-lang/rust/pull/120932 [13]
> Link: https://github.com/rust-lang/rust/issues/120969 [14]
> Link: https://github.com/rust-lang/rust/pull/121202 [15]
> Link: https://github.com/rust-lang/rust/pull/121237 [16]
> Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>

Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>