mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 02:03:53 +00:00
rustc: implement support for riscv32im_risc0_zkvm_elf
This also adds changes in the rust test suite in order to get a few of them to pass. Co-authored-by: Frank Laub <flaub@risc0.com> Co-authored-by: Urgau <3616612+Urgau@users.noreply.github.com>
This commit is contained in:
parent
06fbe07901
commit
966b94e0a2
@ -1597,6 +1597,7 @@ supported_targets! {
|
|||||||
("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
|
("x86_64-unikraft-linux-musl", x86_64_unikraft_linux_musl),
|
||||||
|
|
||||||
("riscv32i-unknown-none-elf", riscv32i_unknown_none_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),
|
("riscv32im-unknown-none-elf", riscv32im_unknown_none_elf),
|
||||||
("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
|
("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf),
|
||||||
("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
|
("riscv32imc-esp-espidf", riscv32imc_esp_espidf),
|
||||||
|
@ -0,0 +1,36 @@
|
|||||||
|
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-S128".into(),
|
||||||
|
llvm_target: "riscv32".into(),
|
||||||
|
pointer_width: 32,
|
||||||
|
arch: "riscv32".into(),
|
||||||
|
|
||||||
|
options: TargetOptions {
|
||||||
|
os: "zkvm".into(),
|
||||||
|
vendor: "risc0".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: "+m".into(),
|
||||||
|
executables: true,
|
||||||
|
panic_strategy: PanicStrategy::Abort,
|
||||||
|
relocation_model: RelocModel::Static,
|
||||||
|
emit_debug_gdb_scripts: false,
|
||||||
|
eh_frame_header: false,
|
||||||
|
singlethread: true,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,9 @@
|
|||||||
#[cfg(target_os = "android")]
|
#[cfg(target_os = "android")]
|
||||||
mod android;
|
mod android;
|
||||||
|
|
||||||
|
#[cfg(target_os = "zkvm")]
|
||||||
|
mod zkvm;
|
||||||
|
|
||||||
use core::any::Any;
|
use core::any::Any;
|
||||||
use core::panic::PanicPayload;
|
use core::panic::PanicPayload;
|
||||||
|
|
||||||
@ -34,6 +37,8 @@ pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 {
|
|||||||
// Android has the ability to attach a message as part of the abort.
|
// Android has the ability to attach a message as part of the abort.
|
||||||
#[cfg(target_os = "android")]
|
#[cfg(target_os = "android")]
|
||||||
android::android_set_abort_message(_payload);
|
android::android_set_abort_message(_payload);
|
||||||
|
#[cfg(target_os = "zkvm")]
|
||||||
|
zkvm::zkvm_set_abort_message(_payload);
|
||||||
|
|
||||||
abort();
|
abort();
|
||||||
|
|
||||||
|
24
library/panic_abort/src/zkvm.rs
Normal file
24
library/panic_abort/src/zkvm.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
use alloc::string::String;
|
||||||
|
use core::panic::PanicPayload;
|
||||||
|
|
||||||
|
// Forward the abort message to zkVM's sys_panic. This is implemented by RISC Zero's
|
||||||
|
// platform crate which exposes system calls specifically for the zkVM.
|
||||||
|
pub(crate) unsafe fn zkvm_set_abort_message(payload: &mut dyn PanicPayload) {
|
||||||
|
let payload = payload.get();
|
||||||
|
let msg = match payload.downcast_ref::<&'static str>() {
|
||||||
|
Some(msg) => msg.as_bytes(),
|
||||||
|
None => match payload.downcast_ref::<String>() {
|
||||||
|
Some(msg) => msg.as_bytes(),
|
||||||
|
None => &[],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if msg.is_empty() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
fn sys_panic(msg_ptr: *const u8, len: usize) -> !;
|
||||||
|
}
|
||||||
|
|
||||||
|
sys_panic(msg.as_ptr(), msg.len());
|
||||||
|
}
|
@ -323,7 +323,8 @@ pub fn run_tests_console(opts: &TestOpts, tests: Vec<TestDescAndFn>) -> io::Resu
|
|||||||
// Prevent the usage of `Instant` in some cases:
|
// Prevent the usage of `Instant` in some cases:
|
||||||
// - It's currently not supported for wasm targets.
|
// - It's currently not supported for wasm targets.
|
||||||
// - We disable it for miri because it's not available when isolation is enabled.
|
// - We disable it for miri because it's not available when isolation is enabled.
|
||||||
let is_instant_supported = !cfg!(target_family = "wasm") && !cfg!(miri);
|
let is_instant_supported =
|
||||||
|
!cfg!(target_family = "wasm") && !cfg!(target_os = "zkvm") && !cfg!(miri);
|
||||||
|
|
||||||
let start_time = is_instant_supported.then(Instant::now);
|
let start_time = is_instant_supported.then(Instant::now);
|
||||||
run_tests(opts, tests, |x| on_test_event(&x, &mut st, &mut *out))?;
|
run_tests(opts, tests, |x| on_test_event(&x, &mut st, &mut *out))?;
|
||||||
|
@ -540,7 +540,7 @@ pub fn run_test(
|
|||||||
|
|
||||||
// Emscripten can catch panics but other wasm targets cannot
|
// Emscripten can catch panics but other wasm targets cannot
|
||||||
let ignore_because_no_process_support = desc.should_panic != ShouldPanic::No
|
let ignore_because_no_process_support = desc.should_panic != ShouldPanic::No
|
||||||
&& cfg!(target_family = "wasm")
|
&& (cfg!(target_family = "wasm") || cfg!(target_os = "zkvm"))
|
||||||
&& !cfg!(target_os = "emscripten");
|
&& !cfg!(target_os = "emscripten");
|
||||||
|
|
||||||
if force_ignore || desc.ignore || ignore_because_no_process_support {
|
if force_ignore || desc.ignore || ignore_because_no_process_support {
|
||||||
|
@ -90,6 +90,10 @@ const EXTRA_CHECK_CFGS: &[(Option<Mode>, &str, Option<&[&'static str]>)] = &[
|
|||||||
/* Extra values not defined in the built-in targets yet, but used in std */
|
/* Extra values not defined in the built-in targets yet, but used in std */
|
||||||
(Some(Mode::Std), "target_env", Some(&["libnx"])),
|
(Some(Mode::Std), "target_env", Some(&["libnx"])),
|
||||||
// (Some(Mode::Std), "target_os", Some(&[])),
|
// (Some(Mode::Std), "target_os", Some(&[])),
|
||||||
|
// #[cfg(bootstrap)] zkvm
|
||||||
|
(Some(Mode::Std), "target_os", Some(&["zkvm"])),
|
||||||
|
// #[cfg(bootstrap)] risc0
|
||||||
|
(Some(Mode::Std), "target_vendor", Some(&["risc0"])),
|
||||||
(Some(Mode::Std), "target_arch", Some(&["spirv", "nvptx", "xtensa"])),
|
(Some(Mode::Std), "target_arch", Some(&["spirv", "nvptx", "xtensa"])),
|
||||||
/* Extra names used by dependencies */
|
/* Extra names used by dependencies */
|
||||||
// FIXME: Used by serde_json, but we should not be triggering on external dependencies.
|
// FIXME: Used by serde_json, but we should not be triggering on external dependencies.
|
||||||
@ -721,6 +725,11 @@ impl Build {
|
|||||||
if self.config.profiler_enabled(target) {
|
if self.config.profiler_enabled(target) {
|
||||||
features.push_str(" profiler");
|
features.push_str(" profiler");
|
||||||
}
|
}
|
||||||
|
// Generate memcpy, etc. FIXME: Remove this once compiler-builtins
|
||||||
|
// automatically detects this target.
|
||||||
|
if target.contains("zkvm") {
|
||||||
|
features.push_str(" compiler-builtins-mem");
|
||||||
|
}
|
||||||
features
|
features
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,6 +121,7 @@ static TARGETS: &[&str] = &[
|
|||||||
"powerpc64-unknown-linux-gnu",
|
"powerpc64-unknown-linux-gnu",
|
||||||
"powerpc64le-unknown-linux-gnu",
|
"powerpc64le-unknown-linux-gnu",
|
||||||
"riscv32i-unknown-none-elf",
|
"riscv32i-unknown-none-elf",
|
||||||
|
"riscv32im-risc0-zkvm-elf",
|
||||||
"riscv32im-unknown-none-elf",
|
"riscv32im-unknown-none-elf",
|
||||||
"riscv32imc-unknown-none-elf",
|
"riscv32imc-unknown-none-elf",
|
||||||
"riscv32imac-unknown-none-elf",
|
"riscv32imac-unknown-none-elf",
|
||||||
|
Loading…
Reference in New Issue
Block a user