forked from paritytech/rustc-rv32e-toolchain
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrust.patch
89 lines (87 loc) · 3.54 KB
/
rust.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs
index fe07d1167..07e786b6c 100644
--- a/compiler/rustc_target/src/spec/mod.rs
+++ b/compiler/rustc_target/src/spec/mod.rs
@@ -1731,6 +1731,7 @@ fn $module() {
("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
+ ("riscv32em-athena-zkvm-elf", riscv32em_athena_zkvm_elf),
("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf),
("riscv32im-risc0-zkvm-elf", riscv32im_risc0_zkvm_elf),
("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
diff --git a/src/bootstrap/src/lib.rs b/src/bootstrap/src/lib.rs
index cde090637..07c9c5758 100644
--- a/src/bootstrap/src/lib.rs
+++ b/src/bootstrap/src/lib.rs
@@ -95,6 +95,10 @@
/* Extra values not defined in the built-in targets yet, but used in std */
(Some(Mode::Std), "target_env", Some(&["libnx", "p2"])),
(Some(Mode::Std), "target_os", Some(&["visionos"])),
+ // #[cfg(bootstrap)] zkvm
+ (Some(Mode::Std), "target_os", Some(&["zkvm"])),
+ // #[cfg(bootstrap)] athena
+ (Some(Mode::Std), "target_vendor", Some(&["athena", "succinct"])),
(Some(Mode::Std), "target_arch", Some(&["arm64ec", "spirv", "nvptx", "xtensa"])),
(Some(Mode::ToolStd), "target_os", Some(&["visionos"])),
/* Extra names used by dependencies */
diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs
index bed76263b..121843a30 100644
--- a/src/tools/build-manifest/src/main.rs
+++ b/src/tools/build-manifest/src/main.rs
@@ -125,6 +125,7 @@
"powerpc-unknown-linux-gnu",
"powerpc64-unknown-linux-gnu",
"powerpc64le-unknown-linux-gnu",
+ "riscv32em-athena-zkvm-elf",
"riscv32i-unknown-none-elf",
"riscv32im-risc0-zkvm-elf",
"riscv32im-unknown-none-elf",
diff --git a/compiler/rustc_target/src/spec/targets/riscv32em_athena_zkvm_elf.rs b/compiler/rustc_target/src/spec/targets/riscv32em_athena_zkvm_elf.rs
new file mode 100644
index 00000000..a84f76c2
--- /dev/null
+++ b/compiler/rustc_target/src/spec/targets/riscv32em_athena_zkvm_elf.rs
@@ -0,0 +1,44 @@
+use crate::spec::{Cc, LinkerFlavor, Lld, PanicStrategy, RelocModel};
+use crate::spec::{Target, TargetOptions};
+
+pub fn target() -> Target {
+ Target {
+ data_layout: "e-m:e-p:32:32-i64:64-n32-S32".into(),
+ llvm_target: "riscv32".into(),
+ metadata: crate::spec::TargetMetadata {
+ description: None,
+ tier: None,
+ host_tools: None,
+ std: None,
+ },
+ pointer_width: 32,
+ arch: "riscv32".into(),
+
+ options: TargetOptions {
+ os: "zkvm".into(),
+ vendor: "athena".into(),
+ linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
+ linker: Some("rust-lld".into()),
+ cpu: "generic-rv32".into(),
+
+ // Some crates (*cough* crossbeam) assume you have 64 bit
+ // atomics if the target name is not in a hardcoded list.
+ // Since zkvm is singlethreaded and all operations are
+ // atomic, I guess we can just say we support 64-bit
+ // atomics.
+ max_atomic_width: Some(64),
+ atomic_cas: true,
+
+ features: "+e,+m".into(),
+ llvm_abiname: "ilp32e".into(),
+ executables: true,
+ panic_strategy: PanicStrategy::Abort,
+ relocation_model: RelocModel::Static,
+ emit_debug_gdb_scripts: false,
+ eh_frame_header: false,
+ singlethread: true,
+ ..Default::default()
+ },
+ }
+}
+