Skip to content

Commit 2259028

Browse files
committed
Auto merge of #124762 - madsmtm:refactor-apple-target-abi, r=lcnr,BlackHoleFox
Refactor Apple `target_abi` This was bundled together with `Arch`, which complicated a few code paths and meant we had to do more string matching than necessary. CC `@BlackHoleFox` as you've worked on the Apple target spec before Related: Is there a reason why `Target`/`TargetOptions` use `StaticCow` for so many things, instead of an enum with defined values (and perhaps a catch-all case for custom target json files)? Tagging `@Nilstrieb,` as you might know?
2 parents be7549f + 8f0d357 commit 2259028

24 files changed

+103
-97
lines changed

compiler/rustc_target/src/spec/base/apple/mod.rs

+42-41
Original file line numberDiff line numberDiff line change
@@ -17,89 +17,93 @@ pub enum Arch {
1717
Arm64e,
1818
Arm64_32,
1919
I386,
20-
I386_sim,
2120
I686,
2221
X86_64,
2322
X86_64h,
24-
X86_64_sim,
25-
X86_64_macabi,
26-
Arm64_macabi,
27-
Arm64_sim,
2823
}
2924

3025
impl Arch {
3126
pub fn target_name(self) -> &'static str {
3227
match self {
3328
Armv7k => "armv7k",
3429
Armv7s => "armv7s",
35-
Arm64 | Arm64_macabi | Arm64_sim => "arm64",
30+
Arm64 => "arm64",
3631
Arm64e => "arm64e",
3732
Arm64_32 => "arm64_32",
38-
I386 | I386_sim => "i386",
33+
I386 => "i386",
3934
I686 => "i686",
40-
X86_64 | X86_64_sim | X86_64_macabi => "x86_64",
35+
X86_64 => "x86_64",
4136
X86_64h => "x86_64h",
4237
}
4338
}
4439

4540
pub fn target_arch(self) -> Cow<'static, str> {
4641
Cow::Borrowed(match self {
4742
Armv7k | Armv7s => "arm",
48-
Arm64 | Arm64e | Arm64_32 | Arm64_macabi | Arm64_sim => "aarch64",
49-
I386 | I386_sim | I686 => "x86",
50-
X86_64 | X86_64_sim | X86_64_macabi | X86_64h => "x86_64",
43+
Arm64 | Arm64e | Arm64_32 => "aarch64",
44+
I386 | I686 => "x86",
45+
X86_64 | X86_64h => "x86_64",
5146
})
5247
}
5348

54-
fn target_abi(self) -> &'static str {
55-
match self {
56-
Armv7k | Armv7s | Arm64 | Arm64e | Arm64_32 | I386 | I686 | X86_64 | X86_64h => "",
57-
X86_64_macabi | Arm64_macabi => "macabi",
58-
I386_sim | Arm64_sim | X86_64_sim => "sim",
59-
}
60-
}
61-
62-
fn target_cpu(self) -> &'static str {
49+
fn target_cpu(self, abi: TargetAbi) -> &'static str {
6350
match self {
6451
Armv7k => "cortex-a8",
6552
Armv7s => "swift", // iOS 10 is only supported on iPhone 5 or higher.
66-
Arm64 => "apple-a7",
53+
Arm64 => match abi {
54+
TargetAbi::Normal => "apple-a7",
55+
TargetAbi::Simulator => "apple-a12",
56+
TargetAbi::MacCatalyst => "apple-a12",
57+
},
6758
Arm64e => "apple-a12",
6859
Arm64_32 => "apple-s4",
6960
// Only macOS 10.12+ is supported, which means
7061
// all x86_64/x86 CPUs must be running at least penryn
7162
// https://github.com/llvm/llvm-project/blob/01f924d0e37a5deae51df0d77e10a15b63aa0c0f/clang/lib/Driver/ToolChains/Arch/X86.cpp#L79-L82
72-
I386 | I386_sim | I686 => "penryn",
73-
X86_64 | X86_64_sim => "penryn",
74-
X86_64_macabi => "penryn",
63+
I386 | I686 => "penryn",
64+
X86_64 => "penryn",
7565
// Note: `core-avx2` is slightly more advanced than `x86_64h`, see
7666
// comments (and disabled features) in `x86_64h_apple_darwin` for
7767
// details. It is a higher baseline then `penryn` however.
7868
X86_64h => "core-avx2",
79-
Arm64_macabi => "apple-a12",
80-
Arm64_sim => "apple-a12",
8169
}
8270
}
8371

8472
fn stack_probes(self) -> StackProbeType {
8573
match self {
8674
Armv7k | Armv7s => StackProbeType::None,
87-
Arm64 | Arm64e | Arm64_32 | I386 | I386_sim | I686 | X86_64 | X86_64h | X86_64_sim
88-
| X86_64_macabi | Arm64_macabi | Arm64_sim => StackProbeType::Inline,
75+
Arm64 | Arm64e | Arm64_32 | I386 | I686 | X86_64 | X86_64h => StackProbeType::Inline,
8976
}
9077
}
9178
}
9279

93-
fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs {
80+
#[derive(Copy, Clone, PartialEq)]
81+
pub enum TargetAbi {
82+
Normal,
83+
Simulator,
84+
MacCatalyst,
85+
}
86+
87+
impl TargetAbi {
88+
fn target_abi(self) -> &'static str {
89+
match self {
90+
Self::Normal => "",
91+
Self::MacCatalyst => "macabi",
92+
Self::Simulator => "sim",
93+
}
94+
}
95+
}
96+
97+
fn pre_link_args(os: &'static str, arch: Arch, abi: TargetAbi) -> LinkArgs {
9498
let platform_name: StaticCow<str> = match abi {
95-
"sim" => format!("{os}-simulator").into(),
96-
"macabi" => "mac-catalyst".into(),
97-
_ => os.into(),
99+
TargetAbi::Normal => os.into(),
100+
TargetAbi::Simulator => format!("{os}-simulator").into(),
101+
TargetAbi::MacCatalyst => "mac-catalyst".into(),
98102
};
99103

100104
let min_version: StaticCow<str> = {
101105
let (major, minor) = match os {
102-
"ios" => ios_deployment_target(arch, abi),
106+
"ios" => ios_deployment_target(arch, abi.target_abi()),
103107
"tvos" => tvos_deployment_target(),
104108
"watchos" => watchos_deployment_target(),
105109
"visionos" => visionos_deployment_target(),
@@ -119,7 +123,7 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs {
119123
LinkerFlavor::Darwin(Cc::No, Lld::No),
120124
[platform_name, min_version, sdk_version].into_iter(),
121125
);
122-
if abi != "macabi" {
126+
if abi != TargetAbi::MacCatalyst {
123127
add_link_args(
124128
&mut args,
125129
LinkerFlavor::Darwin(Cc::Yes, Lld::No),
@@ -136,13 +140,11 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs {
136140
args
137141
}
138142

139-
pub fn opts(os: &'static str, arch: Arch) -> TargetOptions {
140-
let abi = arch.target_abi();
141-
143+
pub fn opts(os: &'static str, arch: Arch, abi: TargetAbi) -> TargetOptions {
142144
TargetOptions {
143-
abi: abi.into(),
145+
abi: abi.target_abi().into(),
144146
os: os.into(),
145-
cpu: arch.target_cpu().into(),
147+
cpu: arch.target_cpu(abi).into(),
146148
link_env_remove: link_env_remove(os),
147149
vendor: "apple".into(),
148150
linker_flavor: LinkerFlavor::Darwin(Cc::Yes, Lld::No),
@@ -263,8 +265,7 @@ fn from_set_deployment_target(var_name: &str) -> Option<(u32, u32)> {
263265

264266
fn macos_default_deployment_target(arch: Arch) -> (u32, u32) {
265267
match arch {
266-
// Note: Arm64_sim is not included since macOS has no simulator.
267-
Arm64 | Arm64e | Arm64_macabi => (11, 0),
268+
Arm64 | Arm64e => (11, 0),
268269
_ => (10, 12),
269270
}
270271
}

compiler/rustc_target/src/spec/targets/aarch64_apple_darwin.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{macos_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{macos_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64;
6-
let mut base = opts("macos", arch);
6+
let mut base = opts("macos", arch, TargetAbi::Normal);
77
base.cpu = "apple-m1".into();
88
base.max_atomic_width = Some(128);
99

compiler/rustc_target/src/spec/targets/aarch64_apple_ios.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{ios_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{ios_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64;
6-
let mut base = opts("ios", arch);
6+
let mut base = opts("ios", arch, TargetAbi::Normal);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{mac_catalyst_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{mac_catalyst_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let arch = Arch::Arm64_macabi;
6-
let mut base = opts("ios", arch);
5+
let arch = Arch::Arm64;
6+
let mut base = opts("ios", arch, TargetAbi::MacCatalyst);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/aarch64_apple_ios_sim.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{ios_sim_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{ios_sim_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let arch = Arch::Arm64_sim;
6-
let mut base = opts("ios", arch);
5+
let arch = Arch::Arm64;
6+
let mut base = opts("ios", arch, TargetAbi::Simulator);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/aarch64_apple_tvos.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::spec::base::apple::{opts, tvos_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, tvos_llvm_target, Arch, TargetAbi};
22
use crate::spec::{FramePointer, Target, TargetOptions};
33

44
pub fn target() -> Target {
@@ -18,7 +18,7 @@ pub fn target() -> Target {
1818
features: "+neon,+fp-armv8,+apple-a7".into(),
1919
max_atomic_width: Some(128),
2020
frame_pointer: FramePointer::NonLeaf,
21-
..opts("tvos", arch)
21+
..opts("tvos", arch, TargetAbi::Normal)
2222
},
2323
}
2424
}

compiler/rustc_target/src/spec/targets/aarch64_apple_tvos_sim.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::spec::base::apple::{opts, tvos_sim_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, tvos_sim_llvm_target, Arch, TargetAbi};
22
use crate::spec::{FramePointer, Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let arch = Arch::Arm64_sim;
5+
let arch = Arch::Arm64;
66
Target {
77
llvm_target: tvos_sim_llvm_target(arch).into(),
88
metadata: crate::spec::TargetMetadata {
@@ -18,7 +18,7 @@ pub fn target() -> Target {
1818
features: "+neon,+fp-armv8,+apple-a7".into(),
1919
max_atomic_width: Some(128),
2020
frame_pointer: FramePointer::NonLeaf,
21-
..opts("tvos", arch)
21+
..opts("tvos", arch, TargetAbi::Simulator)
2222
},
2323
}
2424
}

compiler/rustc_target/src/spec/targets/aarch64_apple_visionos.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{opts, visionos_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, visionos_llvm_target, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64;
6-
let mut base = opts("visionos", arch);
6+
let mut base = opts("visionos", arch, TargetAbi::Normal);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/aarch64_apple_visionos_sim.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{opts, visionos_sim_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, visionos_sim_llvm_target, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let arch = Arch::Arm64_sim;
6-
let mut base = opts("visionos", arch);
5+
let arch = Arch::Arm64;
6+
let mut base = opts("visionos", arch, TargetAbi::Simulator);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/aarch64_apple_watchos.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::spec::base::apple::{opts, Arch};
1+
use crate::spec::base::apple::{opts, Arch, TargetAbi};
22
use crate::spec::{Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let base = opts("watchos", Arch::Arm64);
5+
let base = opts("watchos", Arch::Arm64, TargetAbi::Normal);
66
Target {
77
llvm_target: "aarch64-apple-watchos".into(),
88
metadata: crate::spec::TargetMetadata {

compiler/rustc_target/src/spec/targets/aarch64_apple_watchos_sim.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use crate::spec::base::apple::{opts, watchos_sim_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, watchos_sim_llvm_target, Arch, TargetAbi};
22
use crate::spec::{FramePointer, Target, TargetOptions};
33

44
pub fn target() -> Target {
5-
let arch = Arch::Arm64_sim;
5+
let arch = Arch::Arm64;
66
Target {
77
// Clang automatically chooses a more specific target based on
88
// WATCHOS_DEPLOYMENT_TARGET.
@@ -22,7 +22,7 @@ pub fn target() -> Target {
2222
features: "+neon,+fp-armv8,+apple-a7".into(),
2323
max_atomic_width: Some(128),
2424
frame_pointer: FramePointer::NonLeaf,
25-
..opts("watchos", arch)
25+
..opts("watchos", arch, TargetAbi::Simulator)
2626
},
2727
}
2828
}

compiler/rustc_target/src/spec/targets/arm64_32_apple_watchos.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{opts, watchos_llvm_target, Arch};
1+
use crate::spec::base::apple::{opts, watchos_llvm_target, Arch, TargetAbi};
22
use crate::spec::{Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64_32;
6-
let base = opts("watchos", arch);
6+
let base = opts("watchos", arch, TargetAbi::Normal);
77
Target {
88
llvm_target: watchos_llvm_target(arch).into(),
99
metadata: crate::spec::TargetMetadata {

compiler/rustc_target/src/spec/targets/arm64e_apple_darwin.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{macos_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{macos_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64e;
6-
let mut base = opts("macos", arch);
6+
let mut base = opts("macos", arch, TargetAbi::Normal);
77
base.cpu = "apple-m1".into();
88
base.max_atomic_width = Some(128);
99

compiler/rustc_target/src/spec/targets/arm64e_apple_ios.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use crate::spec::base::apple::{ios_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{ios_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
33

44
pub fn target() -> Target {
55
let arch = Arch::Arm64e;
6-
let mut base = opts("ios", arch);
6+
let mut base = opts("ios", arch, TargetAbi::Normal);
77
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
88

99
Target {

compiler/rustc_target/src/spec/targets/armv7k_apple_watchos.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::spec::base::apple::{opts, Arch};
1+
use crate::spec::base::apple::{opts, Arch, TargetAbi};
22
use crate::spec::{Target, TargetOptions};
33

44
pub fn target() -> Target {
@@ -19,7 +19,7 @@ pub fn target() -> Target {
1919
max_atomic_width: Some(64),
2020
dynamic_linking: false,
2121
position_independent_executables: true,
22-
..opts("watchos", arch)
22+
..opts("watchos", arch, TargetAbi::Normal)
2323
},
2424
}
2525
}

compiler/rustc_target/src/spec/targets/armv7s_apple_ios.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::spec::base::apple::{ios_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{ios_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{Target, TargetOptions};
33

44
pub fn target() -> Target {
@@ -17,7 +17,7 @@ pub fn target() -> Target {
1717
options: TargetOptions {
1818
features: "+v7,+vfp4,+neon".into(),
1919
max_atomic_width: Some(64),
20-
..opts("ios", arch)
20+
..opts("ios", arch, TargetAbi::Normal)
2121
},
2222
}
2323
}

compiler/rustc_target/src/spec/targets/i386_apple_ios.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
use crate::spec::base::apple::{ios_sim_llvm_target, opts, Arch};
1+
use crate::spec::base::apple::{ios_sim_llvm_target, opts, Arch, TargetAbi};
22
use crate::spec::{Target, TargetOptions};
33

44
pub fn target() -> Target {
5+
let arch = Arch::I386;
56
// i386-apple-ios is a simulator target, even though it isn't declared
67
// that way in the target name like the other ones...
7-
let arch = Arch::I386_sim;
8+
let abi = TargetAbi::Simulator;
89
Target {
910
// Clang automatically chooses a more specific target based on
1011
// IPHONEOS_DEPLOYMENT_TARGET.
@@ -22,6 +23,6 @@ pub fn target() -> Target {
2223
i128:128-f64:32:64-f80:128-n8:16:32-S128"
2324
.into(),
2425
arch: arch.target_arch(),
25-
options: TargetOptions { max_atomic_width: Some(64), ..opts("ios", arch) },
26+
options: TargetOptions { max_atomic_width: Some(64), ..opts("ios", arch, abi) },
2627
}
2728
}

0 commit comments

Comments
 (0)