rustc_target: add known safe s390x target features by liushuyu · Pull Request #127506 · rust-lang/rust (original) (raw)
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 andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Conversation19 Commits4 Checks0 Files changed
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
[ Show hidden characters]({{ revealButtonHref }})
This pull request adds known safe target features for s390x (aka IBM Z systems).
Currently, these features are unstable since stabilizing the target features requires submitting proposals.
The vector feature was added in IBM Z13 (arch11), and this is a SIMD feature for the newer IBM Z systems.
The backchain attribute is the IBM Z way of adding frame pointers like unwinding capabilities (the "frame-pointer" switch on IBM Z and IBM POWER platforms will add emulated frame pointers to the binary, which profilers can't use for unwinding the stack).
Both attributes can be applied at the LLVM module or function levels. However, the backchain attribute has to be enabled for all the functions in the call stack to get a successful unwind process.
r? @davidtwco
rustbot has assigned @davidtwco.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.
Use r? to explicitly pick a reviewer
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.
This comment has been minimized.
This comment has been minimized.
liushuyu marked this pull request as ready for review
Some changes occurred in tests/ui/check-cfg
cc @Urgau
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Apologies for the delay in reviewing, looks good to me, r=me after rebasing.
... this is a special attribute that was made to be a target-feature in LLVM 18+, but in all previous versions, this "feature" is a naked attribute. We will have to handle this situation differently than all other target-features.
📌 Commit 01e6e60 has been approved by davidtwco
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-review
Status: Awaiting review from the assignee but also interested parties.
labels
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#129940 - liushuyu:s390x-target-features, r=RalfJung
s390x: Fix a regression related to backchain feature
In rust-lang#127506, we introduced a new IBM Z-specific target feature, backchain.
This particular target-feature was available as a function-level attribute in LLVM 17 and below, so some hacks were used to avoid blowing up LLVM when querying the supported LLVM features.
This led to an unfortunate regression where cfg!(target-feature = "backchain") will always return true.
This pull request aims to fix this issue, and a test has been introduced to ensure it will never happen again.
Fixes rust-lang#129927.
r? @RalfJung
This was referenced
Sep 20, 2024
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request
Support clobber_abi and vector/access registers (clobber-only) in s390x inline assembly
This supports clobber_abi which is one of the requirements of stabilization mentioned in rust-lang#93335.
This also supports vector registers (as vreg) and access registers (as areg) as clobber-only, which need to support clobbering of them to implement clobber_abi.
Refs:
- "1.2.1.1. Register Preservation Rules" section in ELF Application Binary Interface s390x Supplement, Version 1.6.1 (lzsabi_s390x.pdf in https://github.com/IBM/s390x-abi/releases/tag/v1.6.1)
- Register definition in LLVM:
I have three questions:
ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang#130630 (comment)cc(condition code, bits 18-19 of PSW) is "Volatile". However, we do not have a register class forccand instead markccas clobbered unlesspreserves_flagsis specified (rust-lang#111331). Therefore, in the current implementation, if bothpreserves_flagsandclobber_abiare specified,ccis not marked as clobbered. Is this okay? Or even ifpreserves_flagsis used, shouldccbe marked as clobbered ifclobber_abiis used?ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang#130630 (comment)pm(program mask, bits 20-23 of PSW) is "Cleared". There does not appear to be any registers associated with this in either LLVM or GCC, so at this point I don't see any way other than to just ignore it. Is this okay as-is?- Is "areg" a good name for register class name for access registers? It may be a bit confusing between that and
reg_addr, which uses the “a” constraint (rust-lang#119431)...
Note:
- GCC seems to recognize only
a0anda1, and usinga[2-15]causes errors. Given that cg_gcc has a similar problem with other architecture (rust-lang/rustc_codegen_gcc#485), I don't feel this is a blocker for this PR, but it is worth mentioning here. vregshould be able to accept#[repr(simd)]types as input if thevectortarget feature added in rust-lang#127506 is enabled, but core_arch has no s390x vector type and both#[repr(simd)]andcore::simdare unstable, so I have not implemented it in this PR. EDIT: And supporting it is probably more complex than doing the equivalent on other architectures... rust-lang#88245 (comment)
cc @uweigand
r? @Amanieu
@rustbot label +O-SystemZ
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Rollup merge of rust-lang#130630 - taiki-e:s390x-clobber-abi, r=Amanieu
Support clobber_abi and vector/access registers (clobber-only) in s390x inline assembly
This supports clobber_abi which is one of the requirements of stabilization mentioned in rust-lang#93335.
This also supports vector registers (as vreg) and access registers (as areg) as clobber-only, which need to support clobbering of them to implement clobber_abi.
Refs:
- "1.2.1.1. Register Preservation Rules" section in ELF Application Binary Interface s390x Supplement, Version 1.6.1 (lzsabi_s390x.pdf in https://github.com/IBM/s390x-abi/releases/tag/v1.6.1)
- Register definition in LLVM:
I have three questions:
ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang#130630 (comment)cc(condition code, bits 18-19 of PSW) is "Volatile". However, we do not have a register class forccand instead markccas clobbered unlesspreserves_flagsis specified (rust-lang#111331). Therefore, in the current implementation, if bothpreserves_flagsandclobber_abiare specified,ccis not marked as clobbered. Is this okay? Or even ifpreserves_flagsis used, shouldccbe marked as clobbered ifclobber_abiis used?ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang#130630 (comment)pm(program mask, bits 20-23 of PSW) is "Cleared". There does not appear to be any registers associated with this in either LLVM or GCC, so at this point I don't see any way other than to just ignore it. Is this okay as-is?- Is "areg" a good name for register class name for access registers? It may be a bit confusing between that and
reg_addr, which uses the “a” constraint (rust-lang#119431)...
Note:
- GCC seems to recognize only
a0anda1, and usinga[2-15]causes errors. Given that cg_gcc has a similar problem with other architecture (rust-lang/rustc_codegen_gcc#485), I don't feel this is a blocker for this PR, but it is worth mentioning here. vregshould be able to accept#[repr(simd)]types as input if thevectortarget feature added in rust-lang#127506 is enabled, but core_arch has no s390x vector type and both#[repr(simd)]andcore::simdare unstable, so I have not implemented it in this PR. EDIT: And supporting it is probably more complex than doing the equivalent on other architectures... rust-lang#88245 (comment)
cc @uweigand
r? @Amanieu
@rustbot label +O-SystemZ
antoyo pushed a commit to rust-lang/rustc_codegen_gcc that referenced this pull request
Support clobber_abi and vector/access registers (clobber-only) in s390x inline assembly
This supports clobber_abi which is one of the requirements of stabilization mentioned in #93335.
This also supports vector registers (as vreg) and access registers (as areg) as clobber-only, which need to support clobbering of them to implement clobber_abi.
Refs:
- "1.2.1.1. Register Preservation Rules" section in ELF Application Binary Interface s390x Supplement, Version 1.6.1 (lzsabi_s390x.pdf in https://github.com/IBM/s390x-abi/releases/tag/v1.6.1)
- Register definition in LLVM:
I have three questions:
ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang/rust#130630 (comment)cc(condition code, bits 18-19 of PSW) is "Volatile". However, we do not have a register class forccand instead markccas clobbered unlesspreserves_flagsis specified (rust-lang/rust#111331). Therefore, in the current implementation, if bothpreserves_flagsandclobber_abiare specified,ccis not marked as clobbered. Is this okay? Or even ifpreserves_flagsis used, shouldccbe marked as clobbered ifclobber_abiis used?ELF Application Binary Interface s390x Supplement says thatUPDATE: resolved rust-lang/rust#130630 (comment)pm(program mask, bits 20-23 of PSW) is "Cleared". There does not appear to be any registers associated with this in either LLVM or GCC, so at this point I don't see any way other than to just ignore it. Is this okay as-is?- Is "areg" a good name for register class name for access registers? It may be a bit confusing between that and
reg_addr, which uses the “a” constraint (rust-lang/rust#119431)...
Note:
- GCC seems to recognize only
a0anda1, and usinga[2-15]causes errors. Given that cg_gcc has a similar problem with other architecture (#485), I don't feel this is a blocker for this PR, but it is worth mentioning here. vregshould be able to accept#[repr(simd)]types as input if thevectortarget feature added in rust-lang/rust#127506 is enabled, but core_arch has no s390x vector type and both#[repr(simd)]andcore::simdare unstable, so I have not implemented it in this PR. EDIT: And supporting it is probably more complex than doing the equivalent on other architectures... rust-lang/rust#88245 (comment)
cc @uweigand
r? @Amanieu
@rustbot label +O-SystemZ
fneddy added a commit to fneddy/rust that referenced this pull request
the s390x target_feature(enable = "vector") was merged in rust-lang#127506 but
is still gated by #![feature(s390x_target_feature)].
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
fneddy added a commit to fneddy/rust that referenced this pull request
Fix the test for s390x by enabling s390x vector extension via
target_feature(enable = "vector")(rust-lang#127506). As this is is still
gated by #![feature(s390x_target_feature)] we need that attribute
also.
Zalathar added a commit to Zalathar/rust that referenced this pull request
…ins_dyn, r=wesleywiser
Fix test simd/extract-insert-dyn on s390x
Fix the test for s390x by enabling s390x vector extension via target_feature(enable = "vector")(rust-lang#127506). As this is is still gated by #![feature(s390x_target_feature)] we need that attribute also.
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request
Rollup merge of rust-lang#140456 - fneddy:fix_s390x_codegen_simd_ext_ins_dyn, r=wesleywiser
Fix test simd/extract-insert-dyn on s390x
Fix the test for s390x by enabling s390x vector extension via target_feature(enable = "vector")(rust-lang#127506). As this is is still gated by #![feature(s390x_target_feature)] we need that attribute also.
Zalathar added a commit to Zalathar/rust that referenced this pull request
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request
GuillaumeGomez added a commit to GuillaumeGomez/rust that referenced this pull request
bors added a commit that referenced this pull request
bors added a commit that referenced this pull request
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request
rust-timer added a commit that referenced this pull request
github-actions bot pushed a commit to rust-lang/stdarch that referenced this pull request
github-actions bot pushed a commit to rust-lang/miri that referenced this pull request
github-actions bot pushed a commit to model-checking/verify-rust-std that referenced this pull request
Labels
Target: SystemZ processors (s390x)
Status: Waiting on bors to run and complete tests. Bors will change the label on completion.
Relevant to the compiler team, which will review and decide on the PR/issue.