]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_target/src/spec/apple_sdk_base.rs
:arrow_up: rust-analyzer
[rust.git] / compiler / rustc_target / src / spec / apple_sdk_base.rs
1 use crate::spec::{cvs, TargetOptions};
2 use std::borrow::Cow;
3
4 #[cfg(test)]
5 #[path = "apple/tests.rs"]
6 mod tests;
7
8 use Arch::*;
9 #[allow(non_camel_case_types)]
10 #[derive(Copy, Clone)]
11 pub enum Arch {
12     Armv7,
13     Armv7k,
14     Armv7s,
15     Arm64,
16     Arm64_32,
17     I386,
18     #[allow(dead_code)] // Some targets don't use this enum...
19     X86_64,
20     X86_64_sim,
21     X86_64_macabi,
22     Arm64_macabi,
23     Arm64_sim,
24 }
25
26 fn target_arch_name(arch: Arch) -> &'static str {
27     match arch {
28         Armv7 => "armv7",
29         Armv7k => "armv7k",
30         Armv7s => "armv7s",
31         Arm64 | Arm64_macabi | Arm64_sim => "arm64",
32         Arm64_32 => "arm64_32",
33         I386 => "i386",
34         X86_64 | X86_64_sim | X86_64_macabi => "x86_64",
35     }
36 }
37
38 fn target_abi(arch: Arch) -> &'static str {
39     match arch {
40         Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "",
41         X86_64_macabi | Arm64_macabi => "macabi",
42         // x86_64-apple-ios is a simulator target, even though it isn't
43         // declared that way in the target like the other ones...
44         Arm64_sim | X86_64_sim => "sim",
45     }
46 }
47
48 fn target_cpu(arch: Arch) -> &'static str {
49     match arch {
50         Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
51         Armv7k => "cortex-a8",
52         Armv7s => "cortex-a9",
53         Arm64 => "apple-a7",
54         Arm64_32 => "apple-s4",
55         I386 => "yonah",
56         X86_64 | X86_64_sim => "core2",
57         X86_64_macabi => "core2",
58         Arm64_macabi => "apple-a12",
59         Arm64_sim => "apple-a12",
60     }
61 }
62
63 fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> {
64     match arch {
65         Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 | X86_64_sim | Arm64_sim => {
66             cvs!["MACOSX_DEPLOYMENT_TARGET"]
67         }
68         X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
69     }
70 }
71
72 pub fn opts(os: &'static str, arch: Arch) -> TargetOptions {
73     let abi = target_abi(arch);
74     TargetOptions {
75         abi: abi.into(),
76         cpu: target_cpu(arch).into(),
77         link_env_remove: link_env_remove(arch),
78         has_thread_local: false,
79         ..super::apple_base::opts(os, target_arch_name(arch), abi)
80     }
81 }