Add asm goto support to asm!
by nbdd0121 · Pull Request #119365 · rust-lang/rust (original) (raw)
Tracking issue: #119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
rustbot added S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
Relevant to the compiler team, which will review and decide on the PR/issue.
labels
This comment has been minimized.
This comment has been minimized.
Some changes occurred in compiler/rustc_codegen_cranelift
cc @bjorn3
This comment has been minimized.
Some changes occurred in src/tools/clippy
cc @rust-lang/clippy
Some changes occurred in compiler/rustc_codegen_gcc
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This needs a page in the unstable book. It should contain everything that needs to be added to the inline asm page in the reference when this is eventually stabilized.
ojeda mentioned this pull request
41 tasks
This comment has been minimized.
} |
---|
``` |
The block must have unit type. |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should be updated to clarify the behavior of diverging blocks, and how this interacts with noreturn
.
// asm goto with outputs cause miscompilation in LLVM. UB can be triggered |
// when outputs are used inside the label block when optimisation is enabled. |
// See: https://github.com/llvm/llvm-project/issues/74483 |
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a blocker for stabilizing this feature.
Dylan-DPC added S-waiting-on-author
Status: This is awaiting some action (such as code changes or more information) from the author.
and removed S-waiting-on-review
Status: Awaiting review from the assignee but also interested parties.
labels
This makes more sense because most cases then second one is unwind target.
@bors r- (PR requeued by sync)
📌 Commit 05a549b has been approved by Amanieu
It is now in the queue for this repository.
bors added S-waiting-on-bors
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
and removed S-waiting-on-author
Status: This is awaiting some action (such as code changes or more information) from the author.
labels
Sorry, mistakenly committed library/stdarch..
📌 Commit 0ee0f29 has been approved by Amanieu
It is now in the queue for this repository.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
Add asm goto support to asm!
Tracking issue: rust-lang#119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
r? @Amanieu
cc @ojeda
bors added a commit to rust-lang-ci/rust that referenced this pull request
bors added a commit to rust-lang-ci/rust that referenced this pull request
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Rollup merge of rust-lang#119365 - nbdd0121:asm-goto, r=Amanieu
Add asm goto support to asm!
Tracking issue: rust-lang#119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
r? @Amanieu
cc @ojeda
ojeda mentioned this pull request
95 tasks
bjorn3 pushed a commit to bjorn3/rust that referenced this pull request
Add asm goto support to asm!
Tracking issue: rust-lang#119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
r? @Amanieu
cc @ojeda
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
Add asm goto support to asm!
Tracking issue: rust-lang#119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
r? @Amanieu
cc @ojeda
ojeda added a commit to ojeda/linux that referenced this pull request
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 3ed03f4 ("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 maintanance 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 specification
files. 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 redudant imports.
Now, in 1.78.0, the lint detects more cases of redundant imports [8].
Thus the previous commit 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 the previous commit added the implementation.
Other changes in Rust
Rust 1.78.0 introduces 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
) will now always check 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].
As a bonus, even if that series is not applied, the new compiler release
happens to build cleanly the existing alloc
too (i.e. the previous
version's).
Link: https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1770-2024-03-21 [1] Link: https://rust-for-linux.com/rust-version-policy [2] Link: https://lore.kernel.org/rust-for-linux/20240328013603.206764-1-wedsonaf@gmail.com/ [3] Link: Rust-for-Linux#2 [4] Link: rust-lang/rust#120062 [5] Link: rust-lang/rust#120055 [6] Link: https://reviews.llvm.org/D86310 [7] Link: rust-lang/rust#117772 [8] Link: rust-lang/rust-clippy#10903 [9] Link: rust-lang/rust#119365 [10] Link: rust-lang/rust#119364 [11] Link: https://lore.kernel.org/rust-for-linux/ZWipTZysC2YL7qsq@Boquns-Mac-mini.home/ [12] Link: rust-lang/rust#120932 [13] Link: rust-lang/rust#120969 [14] Link: rust-lang/rust#121202 [15] Link: rust-lang/rust#121237 [16] Signed-off-by: Miguel Ojeda ojeda@kernel.org
ojeda added a commit to ojeda/linux that referenced this pull request
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 3ed03f4 ("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 specification
files. 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@gmail.com/ [3] Link: Rust-for-Linux#2 [4] Link: rust-lang/rust#120062 [5] Link: rust-lang/rust#120055 [6] Link: https://reviews.llvm.org/D86310 [7] Link: rust-lang/rust#117772 [8] Link: rust-lang/rust-clippy#10903 [9] Link: rust-lang/rust#119365 [10] Link: rust-lang/rust#119364 [11] Link: https://lore.kernel.org/rust-for-linux/ZWipTZysC2YL7qsq@Boquns-Mac-mini.home/ [12] Link: rust-lang/rust#120932 [13] Link: rust-lang/rust#120969 [14] Link: rust-lang/rust#121202 [15] Link: rust-lang/rust#121237 [16] Signed-off-by: Miguel Ojeda ojeda@kernel.org
ojeda added a commit to ojeda/linux that referenced this pull request
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 3ed03f4 ("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@gmail.com/ [3] Link: Rust-for-Linux#2 [4] Link: rust-lang/rust#120062 [5] Link: rust-lang/rust#120055 [6] Link: https://reviews.llvm.org/D86310 [7] Link: rust-lang/rust#117772 [8] Link: rust-lang/rust-clippy#10903 [9] Link: rust-lang/rust#119365 [10] Link: rust-lang/rust#119364 [11] Link: https://lore.kernel.org/rust-for-linux/ZWipTZysC2YL7qsq@Boquns-Mac-mini.home/ [12] Link: rust-lang/rust#120932 [13] Link: rust-lang/rust#120969 [14] Link: rust-lang/rust#121202 [15] Link: rust-lang/rust#121237 [16] Signed-off-by: Miguel Ojeda ojeda@kernel.org
ojeda added a commit to ojeda/linux that referenced this pull request
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 3ed03f4 ("rust: upgrade to Rust 1.68.2").
It is much smaller than previous upgrades, since the alloc
fork was
dropped in commit 9d0441b ("rust: alloc: remove our fork of the
alloc
crate") [3].
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 finally dropped 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 feature(const_refs_to_static)
[13] to allow
referencing statics in constants and extended feature(const_mut_refs)
to allow raw mutable pointers in constants. Together, this should cover
the kernel's VTABLE
use case. In fact, the implementation [14] in
upstream Rust added a test case for it [15].
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, though without a way to opt-out for particular cases [16].
It would be ideal to have a way to selectively disable certain checks
per-call site for this one (i.e. not just per check but for particular
instances of a check), even if the vast majority of the checks remain
in place [17].
Rust 1.78.0 also improved a couple issues we reported when giving feedback
for the new --check-cfg
feature [18] [19].
alloc
upgrade and reviewing
As mentioned above, compiler upgrades will not update alloc
anymore,
since we dropped 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@gmail.com/ [3] Link: Rust-for-Linux#2 [4] Link: rust-lang/rust#120062 [5] Link: rust-lang/rust#120055 [6] Link: https://reviews.llvm.org/D86310 [7] Link: rust-lang/rust#117772 [8] Link: rust-lang/rust-clippy#10903 [9] Link: rust-lang/rust#119365 [10] Link: rust-lang/rust#119364 [11] Link: https://lore.kernel.org/rust-for-linux/ZWipTZysC2YL7qsq@Boquns-Mac-mini.home/ [12] Link: rust-lang/rust#119618 [13] Link: rust-lang/rust#120932 [14] Link: https://github.com/rust-lang/rust/pull/120932/files#diff-e6fc1622c46054cd46b1d225c5386c5554564b3b0fa8a03c2dc2d8627a1079d9 [15] Link: rust-lang/rust#120969 [16] Link: Rust-for-Linux#354 [17] Link: rust-lang/rust#121202 [18] Link: rust-lang/rust#121237 [19] Reviewed-by: Alice Ryhl aliceryhl@google.com Link: https://lore.kernel.org/r/20240401212303.537355-4-ojeda@kernel.org [ Added a few more details and links I mentioned in the list. - Miguel ] Signed-off-by: Miguel Ojeda ojeda@kernel.org
GuillaumeGomez pushed a commit to GuillaumeGomez/rust that referenced this pull request
Add asm goto support to asm!
Tracking issue: rust-lang#119364
This PR implements asm-goto support, using the syntax described in "future possibilities" section of RFC2873.
Currently I have only implemented the label
part, not the fallthrough
part (i.e. fallthrough is implicit). This doesn't reduce the expressive though, since you can use label-break to get arbitrary control flow or simply set a value and rely on jump threading optimisation to get the desired control flow. I can add that later if deemed necessary.
r? @Amanieu
cc @ojeda