summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_target/src/spec/abi.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_target/src/spec/abi.rs')
-rw-r--r--compiler/rustc_target/src/spec/abi.rs41
1 files changed, 30 insertions, 11 deletions
diff --git a/compiler/rustc_target/src/spec/abi.rs b/compiler/rustc_target/src/spec/abi.rs
index eb3f66ac3..550cdf6bd 100644
--- a/compiler/rustc_target/src/spec/abi.rs
+++ b/compiler/rustc_target/src/spec/abi.rs
@@ -38,6 +38,8 @@ pub enum Abi {
PlatformIntrinsic,
Unadjusted,
RustCold,
+ RiscvInterruptM,
+ RiscvInterruptS,
}
impl Abi {
@@ -107,11 +109,29 @@ const AbiDatas: &[AbiData] = &[
AbiData { abi: Abi::PlatformIntrinsic, name: "platform-intrinsic" },
AbiData { abi: Abi::Unadjusted, name: "unadjusted" },
AbiData { abi: Abi::RustCold, name: "rust-cold" },
+ AbiData { abi: Abi::RiscvInterruptM, name: "riscv-interrupt-m" },
+ AbiData { abi: Abi::RiscvInterruptS, name: "riscv-interrupt-s" },
];
+#[derive(Copy, Clone, Debug)]
+pub enum AbiUnsupported {
+ Unrecognized,
+ Reason { explain: &'static str },
+}
+
/// Returns the ABI with the given name (if any).
-pub fn lookup(name: &str) -> Option<Abi> {
- AbiDatas.iter().find(|abi_data| name == abi_data.name).map(|&x| x.abi)
+pub fn lookup(name: &str) -> Result<Abi, AbiUnsupported> {
+ AbiDatas.iter().find(|abi_data| name == abi_data.name).map(|&x| x.abi).ok_or_else(|| match name {
+ "riscv-interrupt" => AbiUnsupported::Reason {
+ explain: "please use one of riscv-interrupt-m or riscv-interrupt-s for machine- or supervisor-level interrupts, respectively",
+ },
+ "riscv-interrupt-u" => AbiUnsupported::Reason {
+ explain: "user-mode interrupt handlers have been removed from LLVM pending standardization, see: https://reviews.llvm.org/D149314",
+ },
+
+ _ => AbiUnsupported::Unrecognized,
+
+ })
}
pub fn all_names() -> Vec<&'static str> {
@@ -150,7 +170,8 @@ pub fn is_stable(name: &str) -> Result<(), AbiDisabled> {
// Stable
"Rust" | "C" | "C-unwind" | "cdecl" | "cdecl-unwind" | "stdcall" | "stdcall-unwind"
| "fastcall" | "fastcall-unwind" | "aapcs" | "aapcs-unwind" | "win64" | "win64-unwind"
- | "sysv64" | "sysv64-unwind" | "system" | "system-unwind" | "efiapi" => Ok(()),
+ | "sysv64" | "sysv64-unwind" | "system" | "system-unwind" | "efiapi" | "thiscall"
+ | "thiscall-unwind" => Ok(()),
"rust-intrinsic" => Err(AbiDisabled::Unstable {
feature: sym::intrinsics,
explain: "intrinsics are subject to change",
@@ -167,14 +188,6 @@ pub fn is_stable(name: &str) -> Result<(), AbiDisabled> {
feature: sym::abi_vectorcall,
explain: "vectorcall-unwind ABI is experimental and subject to change",
}),
- "thiscall" => Err(AbiDisabled::Unstable {
- feature: sym::abi_thiscall,
- explain: "thiscall is experimental and subject to change",
- }),
- "thiscall-unwind" => Err(AbiDisabled::Unstable {
- feature: sym::abi_thiscall,
- explain: "thiscall-unwind ABI is experimental and subject to change",
- }),
"rust-call" => Err(AbiDisabled::Unstable {
feature: sym::unboxed_closures,
explain: "rust-call ABI is subject to change",
@@ -207,6 +220,10 @@ pub fn is_stable(name: &str) -> Result<(), AbiDisabled> {
feature: sym::abi_avr_interrupt,
explain: "avr-interrupt and avr-non-blocking-interrupt ABIs are experimental and subject to change",
}),
+ "riscv-interrupt-m" | "riscv-interrupt-s" => Err(AbiDisabled::Unstable {
+ feature: sym::abi_riscv_interrupt,
+ explain: "riscv-interrupt ABIs are experimental and subject to change",
+ }),
"C-cmse-nonsecure-call" => Err(AbiDisabled::Unstable {
feature: sym::abi_c_cmse_nonsecure_call,
explain: "C-cmse-nonsecure-call ABI is experimental and subject to change",
@@ -267,6 +284,8 @@ impl Abi {
PlatformIntrinsic => 32,
Unadjusted => 33,
RustCold => 34,
+ RiscvInterruptM => 35,
+ RiscvInterruptS => 36,
};
debug_assert!(
AbiDatas