1 // Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
13 pub use self::Architecture
::*;
14 pub use self::AbiArchitecture
::*;
18 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
31 #[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
33 // NB: This ordering MUST match the AbiDatas array below.
34 // (This is ensured by the test indices_are_correct().)
36 // Single platform ABIs come first (`for_arch()` relies on this)
43 // Multiplatform ABIs second
51 #[allow(non_camel_case_types)]
52 #[derive(Copy, Clone, PartialEq, Debug)]
53 pub enum Architecture
{
61 #[derive(Copy, Clone)]
65 // Name of this ABI as we like it called.
69 #[derive(Copy, Clone)]
70 pub enum AbiArchitecture
{
71 /// Not a real ABI (e.g., intrinsic)
73 /// An ABI that specifies cross-platform defaults (e.g., "C")
75 /// Multiple architectures (bitset)
79 #[allow(non_upper_case_globals)]
80 const AbiDatas
: &'
static [AbiData
] = &[
81 // Platform-specific ABIs
82 AbiData {abi: Cdecl, name: "cdecl" }
,
83 AbiData {abi: Stdcall, name: "stdcall" }
,
84 AbiData {abi: Fastcall, name: "fastcall" }
,
85 AbiData {abi: Aapcs, name: "aapcs" }
,
86 AbiData {abi: Win64, name: "win64" }
,
88 // Cross-platform ABIs
90 // NB: Do not adjust this ordering without
91 // adjusting the indices below.
92 AbiData {abi: Rust, name: "Rust" }
,
93 AbiData {abi: C, name: "C" }
,
94 AbiData {abi: System, name: "system" }
,
95 AbiData {abi: RustIntrinsic, name: "rust-intrinsic" }
,
96 AbiData {abi: RustCall, name: "rust-call" }
,
99 /// Returns the ABI with the given name (if any).
100 pub fn lookup(name
: &str) -> Option
<Abi
> {
101 AbiDatas
.iter().find(|abi_data
| name
== abi_data
.name
).map(|&x
| x
.abi
)
104 pub fn all_names() -> Vec
<&'
static str> {
105 AbiDatas
.iter().map(|d
| d
.name
).collect()
110 pub fn index(&self) -> usize {
115 pub fn data(&self) -> &'
static AbiData
{
116 &AbiDatas
[self.index()]
119 pub fn name(&self) -> &'
static str {
124 impl fmt
::Display
for Abi
{
125 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
126 write
!(f
, "\"{}\"", self.name())
130 impl fmt
::Display
for Os
{
131 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
133 OsLinux
=> "linux".fmt(f
),
134 OsWindows
=> "windows".fmt(f
),
135 OsMacos
=> "macos".fmt(f
),
136 OsiOS
=> "ios".fmt(f
),
137 OsAndroid
=> "android".fmt(f
),
138 OsFreebsd
=> "freebsd".fmt(f
),
139 OsDragonfly
=> "dragonfly".fmt(f
),
140 OsBitrig
=> "bitrig".fmt(f
),
141 OsOpenbsd
=> "openbsd".fmt(f
),
146 #[allow(non_snake_case)]
149 let abi
= lookup("Rust");
150 assert
!(abi
.is_some() && abi
.unwrap().data().name
== "Rust");
155 let abi
= lookup("cdecl");
156 assert
!(abi
.is_some() && abi
.unwrap().data().name
== "cdecl");
161 let abi
= lookup("baz");
162 assert
!(abi
.is_none());
166 fn indices_are_correct() {
167 for (i
, abi_data
) in AbiDatas
.iter().enumerate() {
168 assert_eq
!(i
, abi_data
.abi
.index());