-
Notifications
You must be signed in to change notification settings - Fork 13.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rustc_target: Add more RISC-V atomic-related features #137417
Conversation
@bors r+ |
Do any of these have ABI concerns? In particular, if I mix code built with and without those features, and those two parts of the program share some memory and use atomics to work on that, will everything still behave correctly? Or do some of these features change the way LLVM lowers atomic operations in such a way that it is no longer compatible with code built without the extension? |
As far as I know, there are none at this time. As of the past:
As for others:
|
Thanks for the detailed list! Please reference that from the tracking issue so it can be found when we consider stabilization.
<llvm/llvm-project#101023> sounds like LLVM did change the ABI at some point, so mixing Rust (or C) code built with different versions of LLVM can cause UB. Amazing. But that seems to not depend on target features so it has no bearing on this PR.
|
AFAICT this shouldn't be an issue, as by default LLVM currently uses the |
@bors rollup |
…mpiler-errors Rollup of 11 pull requests Successful merges: - rust-lang#136522 (Remove `feature(dyn_compatible_for_dispatch)` from the compiler) - rust-lang#137289 (Consolidate and improve error messaging for `CoerceUnsized` and `DispatchFromDyn`) - rust-lang#137321 (Correct doc about `temp_dir()` behavior on Android) - rust-lang#137417 (rustc_target: Add more RISC-V atomic-related features) - rust-lang#137489 (remove `#[rustc_intrinsic_must_be_overridde]`) - rust-lang#137530 (DWARF mixed versions with LTO on MIPS) - rust-lang#137543 (std: Fix another new symlink test on Windows) - rust-lang#137548 (Pass correct `TypingEnv` to `InlineAsmCtxt`) - rust-lang#137550 (Don't immediately panic if dropck fails without returning errors) - rust-lang#137552 (Update books) - rust-lang#137556 (rename simd_shuffle_generic → simd_shuffle_const_generic) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#137417 - taiki-e:riscv-atomic, r=Amanieu rustc_target: Add more RISC-V atomic-related features This is a continuation of rust-lang#130877 and adds a few target features, including `zacas`, which was experimental in LLVM 19 and marked non-experimental in LLVM 20. This adds the following target features to unstable riscv_target_feature: - `za64rs` (Za64rs Extension 1.0): Reservation Set Size of at Most 64 Bytes ([definition in LLVM](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0-rc2/llvm/lib/Target/RISCV/RISCVFeatures.td#L227-L228), [available since LLVM 18](llvm/llvm-project@8649328)) - `za128rs` (Za128rs Extension 1.0): Reservation Set Size of at Most 128 Bytes ([definition in LLVM](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0-rc2/llvm/lib/Target/RISCV/RISCVFeatures.td#L230-L231), [available since LLVM 18](llvm/llvm-project@8649328)) - IIUC, `za*rs` can be referenced when implementing helpers to reduce contention in synchronization primitives, like [`crossbeam_utils::CachePadded`](https://docs.rs/crossbeam-utils/latest/crossbeam_utils/struct.CachePadded.html). (relevant discussion: riscv/riscv-profiles#79) - `zacas` (Zacas Extension 1.0): Atomic Compare-And-Swap Instructions (`amocas.{w,d,q}{,.aq,.rl,.aqrl}` and `amocas.{b,h}{,.aq,.rl,.aqrl}` when `zabha` is also enabled) ([definition in LLVM](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0-rc2/llvm/lib/Target/RISCV/RISCVFeatures.td#L240-L243), [available as non-experimental since LLVM 20](llvm/llvm-project@614aeda)) - This implies `zaamo`. - This is used to optimize CAS in existing atomics and/or implement 64-bit/128-bit atomics on riscv32/riscv64 (e.g., taiki-e/portable-atomic#173). - Note that [LLVM does not automatically use this instruction for 64-bit/128-bit atomics on riscv32/riscv64 even if this feature is enabled, because doing it changes the ABI](https://github.com/llvm/llvm-project/blob/876174ffd7533dc220f94721173bb767b659fa7f/llvm/docs/RISCVUsage.rst#riscv-zacas-note). (If the ability to do that is provided by LLVM in the future, it should probably be controlled by another ABI feature similar to `forced-atomics`.) - `zama16b` (Zama16b Extension 1.0): Atomic 16-byte misaligned loads, stores and AMOs ([definition in LLVM](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0-rc2/llvm/lib/Target/RISCV/RISCVFeatures.td#L255-L256), [available since LLVM 19](llvm/llvm-project@b090569)) - IIUC, unlike AArch64 FEAT_LSE2 which also makes 16-byte aligned ldp ({i,u}128 load) atomic, this extension only affects instructions that already considered atomic if they were naturally aligned. i.e., fld (f64 load) on riscv32 would not be atomic with or without this extension ([relevant QEMU code](https://github.com/qemu/qemu/blob/b69801dd6b1eb4d107f7c2f643adf0a4e3ec9124/target/riscv/insn_trans/trans_rvd.c.inc#L50-L62)). - `zawrs` (Zawrs Extension 1.0): Wait on Reservation Set (`wrs.nto` and `wrs.sto`) ([definition in LLVM](https://github.com/llvm/llvm-project/blob/llvmorg-20.1.0-rc2/llvm/lib/Target/RISCV/RISCVFeatures.td#L258), [available as non-experimental since LLVM 17](llvm/llvm-project@d41a73a)) - This is used to optimize synchronization primitives (e.g., Linux uses this for spinlocks (torvalds/linux@b8ddb0d)). Btw, the question of whether `zaamo` is implied by `zabha` or not, which was discussed in rust-lang#130877, has been resolved in LLVM 20, since LLVM now treats `zaamo` as implied by `zabha`/`zacas` (llvm/llvm-project#115694), just like GCC and rustc. r? `@Amanieu` `@rustbot` label +O-riscv +A-target-feature
This is a continuation of #130877 and adds a few target features, including
zacas
, which was experimental in LLVM 19 and marked non-experimental in LLVM 20.This adds the following target features to unstable riscv_target_feature:
za64rs
(Za64rs Extension 1.0): Reservation Set Size of at Most 64 Bytes(definition in LLVM, available since LLVM 18)
za128rs
(Za128rs Extension 1.0): Reservation Set Size of at Most 128 Bytes(definition in LLVM, available since LLVM 18)
za*rs
can be referenced when implementing helpers to reduce contention in synchronization primitives, likecrossbeam_utils::CachePadded
. (relevant discussion: What, exactly, does the reservation set size (Za64rs/Za128rs) constrain? riscv/riscv-profiles#79)zacas
(Zacas Extension 1.0): Atomic Compare-And-Swap Instructions (amocas.{w,d,q}{,.aq,.rl,.aqrl}
andamocas.{b,h}{,.aq,.rl,.aqrl}
whenzabha
is also enabled)(definition in LLVM, available as non-experimental since LLVM 20)
zaamo
.forced-atomics
.)zama16b
(Zama16b Extension 1.0): Atomic 16-byte misaligned loads, stores and AMOs(definition in LLVM, available since LLVM 19)
zawrs
(Zawrs Extension 1.0): Wait on Reservation Set (wrs.nto
andwrs.sto
)(definition in LLVM, available as non-experimental since LLVM 17)
Btw, the question of whether
zaamo
is implied byzabha
or not, which was discussed in #130877, has been resolved in LLVM 20, since LLVM now treatszaamo
as implied byzabha
/zacas
(llvm/llvm-project#115694), just like GCC and rustc.r? @Amanieu
@rustbot label +O-riscv +A-target-feature