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)]
32 #[derive(PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Clone, Copy, Debug)]
34 // NB: This ordering MUST match the AbiDatas array below.
35 // (This is ensured by the test indices_are_correct().)
37 // Single platform ABIs come first (`for_arch()` relies on this)
44 // Multiplatform ABIs second
52 #[allow(non_camel_case_types)]
53 #[derive(Copy, Clone, PartialEq, Debug)]
54 pub enum Architecture
{
62 #[derive(Copy, Clone)]
66 // Name of this ABI as we like it called.
70 #[derive(Copy, Clone)]
71 pub enum AbiArchitecture
{
72 /// Not a real ABI (e.g., intrinsic)
74 /// An ABI that specifies cross-platform defaults (e.g., "C")
76 /// Multiple architectures (bitset)
80 #[allow(non_upper_case_globals)]
81 const AbiDatas
: &'
static [AbiData
] = &[
82 // Platform-specific ABIs
83 AbiData {abi: Cdecl, name: "cdecl" }
,
84 AbiData {abi: Stdcall, name: "stdcall" }
,
85 AbiData {abi: Fastcall, name: "fastcall" }
,
86 AbiData {abi: Aapcs, name: "aapcs" }
,
87 AbiData {abi: Win64, name: "win64" }
,
89 // Cross-platform ABIs
91 // NB: Do not adjust this ordering without
92 // adjusting the indices below.
93 AbiData {abi: Rust, name: "Rust" }
,
94 AbiData {abi: C, name: "C" }
,
95 AbiData {abi: System, name: "system" }
,
96 AbiData {abi: RustIntrinsic, name: "rust-intrinsic" }
,
97 AbiData {abi: RustCall, name: "rust-call" }
,
100 /// Returns the ABI with the given name (if any).
101 pub fn lookup(name
: &str) -> Option
<Abi
> {
102 AbiDatas
.iter().find(|abi_data
| name
== abi_data
.name
).map(|&x
| x
.abi
)
105 pub fn all_names() -> Vec
<&'
static str> {
106 AbiDatas
.iter().map(|d
| d
.name
).collect()
111 pub fn index(&self) -> usize {
116 pub fn data(&self) -> &'
static AbiData
{
117 &AbiDatas
[self.index()]
120 pub fn name(&self) -> &'
static str {
125 impl fmt
::Display
for Abi
{
126 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
127 write
!(f
, "\"{}\"", self.name())
131 impl fmt
::Display
for Os
{
132 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
134 OsLinux
=> "linux".fmt(f
),
135 OsWindows
=> "windows".fmt(f
),
136 OsMacos
=> "macos".fmt(f
),
137 OsiOS
=> "ios".fmt(f
),
138 OsAndroid
=> "android".fmt(f
),
139 OsFreebsd
=> "freebsd".fmt(f
),
140 OsDragonfly
=> "dragonfly".fmt(f
),
141 OsBitrig
=> "bitrig".fmt(f
),
142 OsNetbsd
=> "netbsd".fmt(f
),
143 OsOpenbsd
=> "openbsd".fmt(f
),
148 #[allow(non_snake_case)]
151 let abi
= lookup("Rust");
152 assert
!(abi
.is_some() && abi
.unwrap().data().name
== "Rust");
157 let abi
= lookup("cdecl");
158 assert
!(abi
.is_some() && abi
.unwrap().data().name
== "cdecl");
163 let abi
= lookup("baz");
164 assert
!(abi
.is_none());
168 fn indices_are_correct() {
169 for (i
, abi_data
) in AbiDatas
.iter().enumerate() {
170 assert_eq
!(i
, abi_data
.abi
.index());