summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_target/src/spec/apple_sdk_base.rs
blob: d77558f0f842940ce991f701a5989d761e9c427c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use crate::spec::{cvs, LinkArgs, LinkerFlavor, LldFlavor, TargetOptions};
use std::borrow::Cow;

use Arch::*;
#[allow(non_camel_case_types)]
#[derive(Copy, Clone)]
pub enum Arch {
    Armv7,
    Armv7k,
    Armv7s,
    Arm64,
    Arm64_32,
    I386,
    X86_64,
    X86_64_macabi,
    Arm64_macabi,
    Arm64_sim,
}

fn target_arch_name(arch: Arch) -> &'static str {
    match arch {
        Armv7 => "armv7",
        Armv7k => "armv7k",
        Armv7s => "armv7s",
        Arm64 | Arm64_macabi | Arm64_sim => "arm64",
        Arm64_32 => "arm64_32",
        I386 => "i386",
        X86_64 | X86_64_macabi => "x86_64",
    }
}

fn target_abi(arch: Arch) -> &'static str {
    match arch {
        Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "",
        X86_64_macabi | Arm64_macabi => "macabi",
        Arm64_sim => "sim",
    }
}

fn target_cpu(arch: Arch) -> &'static str {
    match arch {
        Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
        Armv7k => "cortex-a8",
        Armv7s => "cortex-a9",
        Arm64 => "apple-a7",
        Arm64_32 => "apple-s4",
        I386 => "yonah",
        X86_64 => "core2",
        X86_64_macabi => "core2",
        Arm64_macabi => "apple-a12",
        Arm64_sim => "apple-a12",
    }
}

fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> {
    match arch {
        Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 | Arm64_sim => {
            cvs!["MACOSX_DEPLOYMENT_TARGET"]
        }
        X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
    }
}

fn pre_link_args(os: &'static str, arch: Arch) -> LinkArgs {
    let mut args = LinkArgs::new();

    let target_abi = target_abi(arch);

    let platform_name = match target_abi {
        "sim" => format!("{}-simulator", os),
        "macabi" => "mac-catalyst".to_string(),
        _ => os.to_string(),
    };

    let platform_version = match os.as_ref() {
        "ios" => super::apple_base::ios_lld_platform_version(),
        "tvos" => super::apple_base::tvos_lld_platform_version(),
        "watchos" => super::apple_base::watchos_lld_platform_version(),
        _ => unreachable!(),
    };

    let arch_str = target_arch_name(arch);

    if target_abi != "macabi" {
        args.insert(LinkerFlavor::Gcc, vec!["-arch".into(), arch_str.into()]);
    }

    args.insert(
        LinkerFlavor::Lld(LldFlavor::Ld64),
        vec![
            "-arch".into(),
            arch_str.into(),
            "-platform_version".into(),
            platform_name.into(),
            platform_version.clone().into(),
            platform_version.into(),
        ],
    );

    args
}

pub fn opts(os: &'static str, arch: Arch) -> TargetOptions {
    TargetOptions {
        abi: target_abi(arch).into(),
        cpu: target_cpu(arch).into(),
        dynamic_linking: false,
        pre_link_args: pre_link_args(os, arch),
        link_env_remove: link_env_remove(arch),
        has_thread_local: false,
        ..super::apple_base::opts(os)
    }
}