|
1 | 1 | use std::fmt; |
2 | 2 |
|
3 | 3 | use rustc_macros::{Decodable, Encodable, HashStable_Generic}; |
4 | | -use rustc_span::{Span, Symbol, sym}; |
5 | 4 |
|
6 | 5 | #[cfg(test)] |
7 | 6 | mod tests; |
@@ -95,14 +94,14 @@ impl Abi { |
95 | 94 |
|
96 | 95 | #[derive(Copy, Clone)] |
97 | 96 | pub struct AbiData { |
98 | | - abi: Abi, |
| 97 | + pub abi: Abi, |
99 | 98 |
|
100 | 99 | /// Name of this ABI as we like it called. |
101 | | - name: &'static str, |
| 100 | + pub name: &'static str, |
102 | 101 | } |
103 | 102 |
|
104 | 103 | #[allow(non_upper_case_globals)] |
105 | | -const AbiDatas: &[AbiData] = &[ |
| 104 | +pub const AbiDatas: &[AbiData] = &[ |
106 | 105 | AbiData { abi: Abi::Rust, name: "Rust" }, |
107 | 106 | AbiData { abi: Abi::C { unwind: false }, name: "C" }, |
108 | 107 | AbiData { abi: Abi::C { unwind: true }, name: "C-unwind" }, |
@@ -169,104 +168,6 @@ pub fn all_names() -> Vec<&'static str> { |
169 | 168 | AbiDatas.iter().map(|d| d.name).collect() |
170 | 169 | } |
171 | 170 |
|
172 | | -pub fn enabled_names(features: &rustc_feature::Features, span: Span) -> Vec<&'static str> { |
173 | | - AbiDatas |
174 | | - .iter() |
175 | | - .map(|d| d.name) |
176 | | - .filter(|name| is_enabled(features, span, name).is_ok()) |
177 | | - .collect() |
178 | | -} |
179 | | - |
180 | | -pub enum AbiDisabled { |
181 | | - Unstable { feature: Symbol, explain: &'static str }, |
182 | | - Unrecognized, |
183 | | -} |
184 | | - |
185 | | -pub fn is_enabled( |
186 | | - features: &rustc_feature::Features, |
187 | | - span: Span, |
188 | | - name: &str, |
189 | | -) -> Result<(), AbiDisabled> { |
190 | | - let s = is_stable(name); |
191 | | - if let Err(AbiDisabled::Unstable { feature, .. }) = s { |
192 | | - if features.enabled(feature) || span.allows_unstable(feature) { |
193 | | - return Ok(()); |
194 | | - } |
195 | | - } |
196 | | - s |
197 | | -} |
198 | | - |
199 | | -/// Returns whether the ABI is stable to use. |
200 | | -/// |
201 | | -/// Note that there is a separate check determining whether the ABI is even supported |
202 | | -/// on the current target; see `fn is_abi_supported` in `rustc_target::spec`. |
203 | | -pub fn is_stable(name: &str) -> Result<(), AbiDisabled> { |
204 | | - match name { |
205 | | - // Stable |
206 | | - "Rust" | "C" | "C-unwind" | "cdecl" | "cdecl-unwind" | "stdcall" | "stdcall-unwind" |
207 | | - | "fastcall" | "fastcall-unwind" | "aapcs" | "aapcs-unwind" | "win64" | "win64-unwind" |
208 | | - | "sysv64" | "sysv64-unwind" | "system" | "system-unwind" | "efiapi" | "thiscall" |
209 | | - | "thiscall-unwind" => Ok(()), |
210 | | - "rust-intrinsic" => Err(AbiDisabled::Unstable { |
211 | | - feature: sym::intrinsics, |
212 | | - explain: "intrinsics are subject to change", |
213 | | - }), |
214 | | - "vectorcall" => Err(AbiDisabled::Unstable { |
215 | | - feature: sym::abi_vectorcall, |
216 | | - explain: "vectorcall is experimental and subject to change", |
217 | | - }), |
218 | | - "vectorcall-unwind" => Err(AbiDisabled::Unstable { |
219 | | - feature: sym::abi_vectorcall, |
220 | | - explain: "vectorcall-unwind ABI is experimental and subject to change", |
221 | | - }), |
222 | | - "rust-call" => Err(AbiDisabled::Unstable { |
223 | | - feature: sym::unboxed_closures, |
224 | | - explain: "rust-call ABI is subject to change", |
225 | | - }), |
226 | | - "rust-cold" => Err(AbiDisabled::Unstable { |
227 | | - feature: sym::rust_cold_cc, |
228 | | - explain: "rust-cold is experimental and subject to change", |
229 | | - }), |
230 | | - "ptx-kernel" => Err(AbiDisabled::Unstable { |
231 | | - feature: sym::abi_ptx, |
232 | | - explain: "PTX ABIs are experimental and subject to change", |
233 | | - }), |
234 | | - "unadjusted" => Err(AbiDisabled::Unstable { |
235 | | - feature: sym::abi_unadjusted, |
236 | | - explain: "unadjusted ABI is an implementation detail and perma-unstable", |
237 | | - }), |
238 | | - "msp430-interrupt" => Err(AbiDisabled::Unstable { |
239 | | - feature: sym::abi_msp430_interrupt, |
240 | | - explain: "msp430-interrupt ABI is experimental and subject to change", |
241 | | - }), |
242 | | - "x86-interrupt" => Err(AbiDisabled::Unstable { |
243 | | - feature: sym::abi_x86_interrupt, |
244 | | - explain: "x86-interrupt ABI is experimental and subject to change", |
245 | | - }), |
246 | | - "gpu-kernel" => Err(AbiDisabled::Unstable { |
247 | | - feature: sym::abi_gpu_kernel, |
248 | | - explain: "gpu-kernel ABI is experimental and subject to change", |
249 | | - }), |
250 | | - "avr-interrupt" | "avr-non-blocking-interrupt" => Err(AbiDisabled::Unstable { |
251 | | - feature: sym::abi_avr_interrupt, |
252 | | - explain: "avr-interrupt and avr-non-blocking-interrupt ABIs are experimental and subject to change", |
253 | | - }), |
254 | | - "riscv-interrupt-m" | "riscv-interrupt-s" => Err(AbiDisabled::Unstable { |
255 | | - feature: sym::abi_riscv_interrupt, |
256 | | - explain: "riscv-interrupt ABIs are experimental and subject to change", |
257 | | - }), |
258 | | - "C-cmse-nonsecure-call" => Err(AbiDisabled::Unstable { |
259 | | - feature: sym::abi_c_cmse_nonsecure_call, |
260 | | - explain: "C-cmse-nonsecure-call ABI is experimental and subject to change", |
261 | | - }), |
262 | | - "C-cmse-nonsecure-entry" => Err(AbiDisabled::Unstable { |
263 | | - feature: sym::cmse_nonsecure_entry, |
264 | | - explain: "C-cmse-nonsecure-entry ABI is experimental and subject to change", |
265 | | - }), |
266 | | - _ => Err(AbiDisabled::Unrecognized), |
267 | | - } |
268 | | -} |
269 | | - |
270 | 171 | impl Abi { |
271 | 172 | /// Default ABI chosen for `extern fn` declarations without an explicit ABI. |
272 | 173 | pub const FALLBACK: Abi = Abi::C { unwind: false }; |
|
0 commit comments