Skip to content

Commit 040cf52

Browse files
committed
rustc_target: RISC-V "Zfinx" is incompatible with {ILP32,LP64}[FD] ABIs
Because RISC-V Calling Conventions note that: > This means code targeting the Zfinx extension always uses the ILP32, > ILP32E or LP64 integer calling-convention only ABIs as there is no > dedicated hardware floating-point register file. {ILP32,LP64}[FD] ABIs with hardware floating-point calling conventions are incompatible with the "Zfinx" extension. This commit adds "zfinx" to the incompatible feature list to those ABIs and tests whether trying to add "zdinx" (that is analogous to "zfinx" but in double-precision) on a LP64D ABI configuration results in an error (it also tests extension implication; "Zdinx" requires "Zfinx" extension). Link: RISC-V psABI specification version 1.0 <https://github.com/riscv-non-isa/riscv-elf-psabi-doc/releases/tag/v1.0>
1 parent 7290b04 commit 040cf52

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

compiler/rustc_target/src/target_features.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -894,12 +894,12 @@ impl Target {
894894
// about what the intended ABI is.
895895
match &*self.llvm_abiname {
896896
"ilp32d" | "lp64d" => {
897-
// Requires d (which implies f), incompatible with e.
898-
FeatureConstraints { required: &["d"], incompatible: &["e"] }
897+
// Requires d (which implies f), incompatible with e and zfinx.
898+
FeatureConstraints { required: &["d"], incompatible: &["e", "zfinx"] }
899899
}
900900
"ilp32f" | "lp64f" => {
901-
// Requires f, incompatible with e.
902-
FeatureConstraints { required: &["f"], incompatible: &["e"] }
901+
// Requires f, incompatible with e and zfinx.
902+
FeatureConstraints { required: &["f"], incompatible: &["e", "zfinx"] }
903903
}
904904
"ilp32" | "lp64" => {
905905
// Requires nothing, incompatible with e.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//! Ensure ABI-incompatible features cannot be enabled via `#[target_feature]`.
2+
//@ compile-flags: --target=riscv64gc-unknown-linux-gnu --crate-type=lib
3+
//@ needs-llvm-components: riscv
4+
#![feature(no_core, lang_items, riscv_target_feature)]
5+
#![no_core]
6+
7+
#[lang = "sized"]
8+
pub trait Sized {}
9+
10+
#[target_feature(enable = "zdinx")]
11+
//~^ERROR: cannot be enabled with
12+
pub unsafe fn my_fun() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
error: target feature `zfinx` cannot be enabled with `#[target_feature]`: this feature is incompatible with the target ABI
2+
--> $DIR/forbidden-hardfloat-target-feature-attribute-2.rs:10:18
3+
|
4+
LL | #[target_feature(enable = "zdinx")]
5+
| ^^^^^^^^^^^^^^^^
6+
7+
error: aborting due to 1 previous error
8+

0 commit comments

Comments
 (0)