about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChen Zhongyao <chen.zhongyao@zte.com.cn>2025-07-14 13:35:53 +0000
committerZhongyao Chen <chen.zhongyao@zte.com.cn>2025-08-11 21:08:35 +0000
commita4cf5e9eca00527082fd58356e4adc8775aeee03 (patch)
tree958d2315f796f9f1e2ca805544bd2113807e8b65
parent577166503aee7290e09374da21f4045c455acfd5 (diff)
downloadrust-a4cf5e9eca00527082fd58356e4adc8775aeee03.tar.gz
rust-a4cf5e9eca00527082fd58356e4adc8775aeee03.zip
Add new Tier-3 target: riscv64a23-unknown-linux-gnu
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm_util.rs6
-rw-r--r--compiler/rustc_target/src/spec/mod.rs1
-rw-r--r--compiler/rustc_target/src/spec/targets/riscv64a23_unknown_linux_gnu.rs27
-rw-r--r--compiler/rustc_target/src/target_features.rs113
-rw-r--r--src/bootstrap/src/core/sanity.rs1
-rw-r--r--tests/assembly-llvm/targets/targets-elf.rs3
-rw-r--r--tests/ui/check-cfg/target_feature.stderr16
7 files changed, 166 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs
index 28d2100f478..a85a894e42c 100644
--- a/compiler/rustc_codegen_llvm/src/llvm_util.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs
@@ -278,7 +278,11 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
             None
         }
         // Filter out features that are not supported by the current LLVM version
-        ("riscv32" | "riscv64", "zacas") if get_version().0 < 20 => None,
+        ("riscv32" | "riscv64", "zacas" | "rva23s64" | "rva23u64" | "sha" | "ssnpm" | "supm")
+            if get_version().0 < 20 =>
+        {
+            None
+        }
         (
             "s390x",
             "message-security-assist-extension12"
diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
index b9fbff8db05..d72d8bd2d08 100644
--- a/compiler/rustc_target/src/spec/mod.rs
+++ b/compiler/rustc_target/src/spec/mod.rs
@@ -2137,6 +2137,7 @@ supported_targets! {
     ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf),
     ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu),
     ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl),
+    ("riscv64a23-unknown-linux-gnu", riscv64a23_unknown_linux_gnu),
 
     ("sparc-unknown-none-elf", sparc_unknown_none_elf),
 
diff --git a/compiler/rustc_target/src/spec/targets/riscv64a23_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/targets/riscv64a23_unknown_linux_gnu.rs
new file mode 100644
index 00000000000..27a0e27c969
--- /dev/null
+++ b/compiler/rustc_target/src/spec/targets/riscv64a23_unknown_linux_gnu.rs
@@ -0,0 +1,27 @@
+use std::borrow::Cow;
+
+use crate::spec::{CodeModel, SplitDebuginfo, Target, TargetMetadata, TargetOptions, base};
+
+pub(crate) fn target() -> Target {
+    Target {
+        llvm_target: "riscv64-unknown-linux-gnu".into(),
+        metadata: TargetMetadata {
+            description: Some("RISC-V Linux (kernel 4.20, glibc 2.29)".into()),
+            tier: Some(3),
+            host_tools: Some(true),
+            std: Some(true),
+        },
+        pointer_width: 64,
+        data_layout: "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128".into(),
+        arch: "riscv64".into(),
+        options: TargetOptions {
+            code_model: Some(CodeModel::Medium),
+            cpu: "generic-rv64".into(),
+            features: "+rva23u64,+rva23s64".into(),
+            llvm_abiname: "lp64d".into(),
+            max_atomic_width: Some(64),
+            supported_split_debuginfo: Cow::Borrowed(&[SplitDebuginfo::Off]),
+            ..base::linux_gnu::opts()
+        },
+    }
+}
diff --git a/compiler/rustc_target/src/target_features.rs b/compiler/rustc_target/src/target_features.rs
index 297d9ed84c5..434f6a840b6 100644
--- a/compiler/rustc_target/src/target_features.rs
+++ b/compiler/rustc_target/src/target_features.rs
@@ -597,6 +597,119 @@ static RISCV_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
     ),
     ("m", Stable, &[]),
     ("relax", Unstable(sym::riscv_target_feature), &[]),
+    (
+        "rva23s64",
+        Unstable(sym::riscv_target_feature),
+        &[
+            "m",
+            "a",
+            "f",
+            "d",
+            "c",
+            "b",
+            "v",
+            "zicsr",
+            "zicntr",
+            "zihpm",
+            "ziccif",
+            "ziccrse",
+            "ziccamoa",
+            "zicclsm",
+            "zic64b",
+            "za64rs",
+            "zihintpause",
+            "zba",
+            "zbb",
+            "zbs",
+            "zicbom",
+            "zicbop",
+            "zicboz",
+            "zfhmin",
+            "zkt",
+            "zvfhmin",
+            "zvbb",
+            "zvkt",
+            "zihintntl",
+            "zicond",
+            "zimop",
+            "zcmop",
+            "zcb",
+            "zfa",
+            "zawrs",
+            "svbare",
+            "svade",
+            "ssccptr",
+            "sstvecd",
+            "sstvala",
+            "sscounterenw",
+            "svpbmt",
+            "svinval",
+            "svnapot",
+            "sstc",
+            "sscofpmf",
+            "ssnpm",
+            "ssu64xl",
+            "sha",
+            "supm",
+        ],
+    ),
+    (
+        "rva23u64",
+        Unstable(sym::riscv_target_feature),
+        &[
+            "m",
+            "a",
+            "f",
+            "d",
+            "c",
+            "b",
+            "v",
+            "zicsr",
+            "zicntr",
+            "zihpm",
+            "ziccif",
+            "ziccrse",
+            "ziccamoa",
+            "zicclsm",
+            "zic64b",
+            "za64rs",
+            "zihintpause",
+            "zba",
+            "zbb",
+            "zbs",
+            "zicbom",
+            "zicbop",
+            "zicboz",
+            "zfhmin",
+            "zkt",
+            "zvfhmin",
+            "zvbb",
+            "zvkt",
+            "zihintntl",
+            "zicond",
+            "zimop",
+            "zcmop",
+            "zcb",
+            "zfa",
+            "zawrs",
+            "supm",
+        ],
+    ),
+    ("sha", Unstable(sym::riscv_target_feature), &[]),
+    ("ssccptr", Unstable(sym::riscv_target_feature), &[]),
+    ("sscofpmf", Unstable(sym::riscv_target_feature), &[]),
+    ("sscounterenw", Unstable(sym::riscv_target_feature), &[]),
+    ("ssnpm", Unstable(sym::riscv_target_feature), &[]),
+    ("sstc", Unstable(sym::riscv_target_feature), &[]),
+    ("sstvala", Unstable(sym::riscv_target_feature), &[]),
+    ("sstvecd", Unstable(sym::riscv_target_feature), &[]),
+    ("ssu64xl", Unstable(sym::riscv_target_feature), &[]),
+    ("supm", Unstable(sym::riscv_target_feature), &[]),
+    ("svade", Unstable(sym::riscv_target_feature), &[]),
+    ("svbare", Unstable(sym::riscv_target_feature), &[]),
+    ("svinval", Unstable(sym::riscv_target_feature), &[]),
+    ("svnapot", Unstable(sym::riscv_target_feature), &[]),
+    ("svpbmt", Unstable(sym::riscv_target_feature), &[]),
     ("unaligned-scalar-mem", Unstable(sym::riscv_target_feature), &[]),
     ("unaligned-vector-mem", Unstable(sym::riscv_target_feature), &[]),
     ("v", Unstable(sym::riscv_target_feature), &["zvl128b", "zve64d"]),
diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs
index 3080e641b5b..a2d5d3f0e37 100644
--- a/src/bootstrap/src/core/sanity.rs
+++ b/src/bootstrap/src/core/sanity.rs
@@ -34,6 +34,7 @@ pub struct Finder {
 // Targets can be removed from this list once they are present in the stage0 compiler (usually by updating the beta compiler of the bootstrap).
 const STAGE0_MISSING_TARGETS: &[&str] = &[
     "armv7a-vex-v5",
+    "riscv64a23-unknown-linux-gnu",
     // just a dummy comment so the list doesn't get onelined
 ];
 
diff --git a/tests/assembly-llvm/targets/targets-elf.rs b/tests/assembly-llvm/targets/targets-elf.rs
index ee63dffe9ea..44f536b6856 100644
--- a/tests/assembly-llvm/targets/targets-elf.rs
+++ b/tests/assembly-llvm/targets/targets-elf.rs
@@ -475,6 +475,9 @@
 //@ revisions: riscv64gc_unknown_linux_gnu
 //@ [riscv64gc_unknown_linux_gnu] compile-flags: --target riscv64gc-unknown-linux-gnu
 //@ [riscv64gc_unknown_linux_gnu] needs-llvm-components: riscv
+//@ revisions: riscv64a23_unknown_linux_gnu
+//@ [riscv64a23_unknown_linux_gnu] compile-flags: --target riscv64a23-unknown-linux-gnu
+//@ [riscv64a23_unknown_linux_gnu] needs-llvm-components: riscv
 //@ revisions: riscv64gc_unknown_linux_musl
 //@ [riscv64gc_unknown_linux_musl] compile-flags: --target riscv64gc-unknown-linux-musl
 //@ [riscv64gc_unknown_linux_musl] needs-llvm-components: riscv
diff --git a/tests/ui/check-cfg/target_feature.stderr b/tests/ui/check-cfg/target_feature.stderr
index 44fc23b6390..a484fb0e5f0 100644
--- a/tests/ui/check-cfg/target_feature.stderr
+++ b/tests/ui/check-cfg/target_feature.stderr
@@ -241,6 +241,8 @@ LL |     cfg!(target_feature = "_UNEXPECTED_VALUE");
 `relax`
 `relaxed-simd`
 `rtm`
+`rva23s64`
+`rva23u64`
 `sb`
 `scq`
 `sha`
@@ -292,16 +294,27 @@ LL |     cfg!(target_feature = "_UNEXPECTED_VALUE");
 `soft-float`
 `spe`
 `ssbs`
+`ssccptr`
+`sscofpmf`
+`sscounterenw`
 `sse`
 `sse2`
 `sse3`
 `sse4.1`
 `sse4.2`
 `sse4a`
+`ssnpm`
 `ssse3`
+`sstc`
+`sstvala`
+`sstvecd`
+`ssu64xl`
 `ssve-fp8dot2`
 `ssve-fp8dot4`
 `ssve-fp8fma`
+`supm`
+`svade`
+`svbare`
 `sve`
 `sve-b16b16`
 `sve2`
@@ -310,6 +323,9 @@ LL |     cfg!(target_feature = "_UNEXPECTED_VALUE");
 `sve2-sha3`
 `sve2-sm4`
 `sve2p1`
+`svinval`
+`svnapot`
+`svpbmt`
 `tail-call`
 `tbm`
 `thumb-mode`