Add support for link-flavor rust-lld for iOS, tvOS and watchOS · rust-lang/rust@78bbe57 (original) (raw)
1
``
`-
use crate::{spec::cvs, spec::TargetOptions};
`
``
1
`+
use crate::spec::{cvs, LinkArgs, LinkerFlavor, LldFlavor, TargetOptions};
`
2
2
`use std::borrow::Cow;
`
3
3
``
4
4
`use Arch::*;
`
`@@ -17,6 +17,18 @@ pub enum Arch {
`
17
17
`Arm64_sim,
`
18
18
`}
`
19
19
``
``
20
`+
fn target_arch_name(arch: Arch) -> &'static str {
`
``
21
`+
match arch {
`
``
22
`+
Armv7 => "armv7",
`
``
23
`+
Armv7k => "armv7k",
`
``
24
`+
Armv7s => "armv7s",
`
``
25
`+
Arm64 | Arm64_macabi | Arm64_sim => "arm64",
`
``
26
`+
Arm64_32 => "arm64_32",
`
``
27
`+
I386 => "i386",
`
``
28
`+
X86_64 | X86_64_macabi => "x86_64",
`
``
29
`+
}
`
``
30
`+
}
`
``
31
+
20
32
`fn target_abi(arch: Arch) -> &'static str {
`
21
33
`match arch {
`
22
34
`Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "",
`
`@@ -49,11 +61,51 @@ fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> {
`
49
61
`}
`
50
62
`}
`
51
63
``
``
64
`+
fn pre_link_args(os: &'static str, arch: Arch) -> LinkArgs {
`
``
65
`+
let mut args = LinkArgs::new();
`
``
66
+
``
67
`+
let target_abi = target_abi(arch);
`
``
68
+
``
69
`+
let platform_name = match target_abi {
`
``
70
`+
"sim" => format!("{}-simulator", os),
`
``
71
`+
"macabi" => "mac-catalyst".to_string(),
`
``
72
`+
_ => os.to_string(),
`
``
73
`+
};
`
``
74
+
``
75
`+
let platform_version = match os.as_ref() {
`
``
76
`+
"ios" => super::apple_base::ios_lld_platform_version(),
`
``
77
`+
"tvos" => super::apple_base::tvos_lld_platform_version(),
`
``
78
`+
"watchos" => super::apple_base::watchos_lld_platform_version(),
`
``
79
`+
_ => unreachable!(),
`
``
80
`+
};
`
``
81
+
``
82
`+
let arch_str = target_arch_name(arch);
`
``
83
+
``
84
`+
if target_abi != "macabi" {
`
``
85
`+
args.insert(LinkerFlavor::Gcc, vec!["-arch".into(), arch_str.into()]);
`
``
86
`+
}
`
``
87
+
``
88
`+
args.insert(
`
``
89
`+
LinkerFlavor::Lld(LldFlavor::Ld64),
`
``
90
`+
vec![
`
``
91
`+
"-arch".into(),
`
``
92
`+
arch_str.into(),
`
``
93
`+
"-platform_version".into(),
`
``
94
`+
platform_name.into(),
`
``
95
`+
platform_version.clone().into(),
`
``
96
`+
platform_version.into(),
`
``
97
`+
],
`
``
98
`+
);
`
``
99
+
``
100
`+
args
`
``
101
`+
}
`
``
102
+
52
103
`pub fn opts(os: &'static str, arch: Arch) -> TargetOptions {
`
53
104
`TargetOptions {
`
54
105
`abi: target_abi(arch).into(),
`
55
106
`cpu: target_cpu(arch).into(),
`
56
107
`dynamic_linking: false,
`
``
108
`+
pre_link_args: pre_link_args(os, arch),
`
57
109
`link_env_remove: link_env_remove(arch),
`
58
110
`has_thread_local: false,
`
59
111
` ..super::apple_base::opts(os)
`