Skip to content

Commit dc5c610

Browse files
committed
Add Apple WatchOS compile targets
1 parent c845946 commit dc5c610

File tree

16 files changed

+231
-9
lines changed

16 files changed

+231
-9
lines changed

compiler/rustc_codegen_llvm/src/back/write.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,8 @@ unsafe fn embed_bitcode(
10361036
// reason (see issue #90326 for historical background).
10371037
let is_apple = cgcx.opts.target_triple.triple().contains("-ios")
10381038
|| cgcx.opts.target_triple.triple().contains("-darwin")
1039-
|| cgcx.opts.target_triple.triple().contains("-tvos");
1039+
|| cgcx.opts.target_triple.triple().contains("-tvos")
1040+
|| cgcx.opts.target_triple.triple().contains("-watchos");
10401041
if is_apple
10411042
|| cgcx.opts.target_triple.triple().starts_with("wasm")
10421043
|| cgcx.opts.target_triple.triple().starts_with("asmjs")

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,7 +2602,7 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
26022602
let os = &sess.target.os;
26032603
let llvm_target = &sess.target.llvm_target;
26042604
if sess.target.vendor != "apple"
2605-
|| !matches!(os.as_ref(), "ios" | "tvos")
2605+
|| !matches!(os.as_ref(), "ios" | "tvos" | "watchos")
26062606
|| flavor != LinkerFlavor::Gcc
26072607
{
26082608
return;
@@ -2612,11 +2612,16 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
26122612
("x86_64", "tvos") => "appletvsimulator",
26132613
("arm", "ios") => "iphoneos",
26142614
("aarch64", "ios") if llvm_target.contains("macabi") => "macosx",
2615-
("aarch64", "ios") if llvm_target.contains("sim") => "iphonesimulator",
2615+
("aarch64", "ios") if llvm_target.ends_with("-simulator") => "iphonesimulator",
26162616
("aarch64", "ios") => "iphoneos",
26172617
("x86", "ios") => "iphonesimulator",
26182618
("x86_64", "ios") if llvm_target.contains("macabi") => "macosx",
26192619
("x86_64", "ios") => "iphonesimulator",
2620+
("x86_64", "watchos") => "watchsimulator",
2621+
("arm64_32", "watchos") => "watchos",
2622+
("aarch64", "watchos") if llvm_target.ends_with("-simulator") => "watchsimulator",
2623+
("aarch64", "watchos") => "watchos",
2624+
("arm", "watchos") => "watchos",
26202625
_ => {
26212626
sess.err(&format!("unsupported arch `{}` for os `{}`", arch, os));
26222627
return;
@@ -2663,6 +2668,11 @@ fn get_apple_sdk_root(sdk_name: &str) -> Result<String, String> {
26632668
"macosx10.15"
26642669
if sdkroot.contains("iPhoneOS.platform")
26652670
|| sdkroot.contains("iPhoneSimulator.platform") => {}
2671+
"watchos"
2672+
if sdkroot.contains("WatchSimulator.platform")
2673+
|| sdkroot.contains("MacOSX.platform") => {}
2674+
"watchsimulator"
2675+
if sdkroot.contains("WatchOS.platform") || sdkroot.contains("MacOSX.platform") => {}
26662676
// Ignore `SDKROOT` if it's not a valid path.
26672677
_ if !p.is_absolute() || p == Path::new("/") || !p.exists() => {}
26682678
_ => return Ok(sdkroot),
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use super::apple_sdk_base::{opts, Arch};
2+
use crate::spec::{FramePointer, Target, TargetOptions};
3+
4+
pub fn target() -> Target {
5+
let base = opts("watchos", Arch::Arm64_sim);
6+
7+
// Clang automatically chooses a more specific target based on
8+
// WATCHOS_DEPLOYMENT_TARGET.
9+
// This is required for the simulator target to pick the right
10+
// MACH-O commands, so we do too.
11+
let arch = "arm64";
12+
let llvm_target = super::apple_base::watchos_sim_llvm_target(arch);
13+
14+
Target {
15+
llvm_target: llvm_target.into(),
16+
pointer_width: 64,
17+
data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".into(),
18+
arch: "aarch64".into(),
19+
options: TargetOptions {
20+
features: "+neon,+fp-armv8,+apple-a7".into(),
21+
max_atomic_width: Some(128),
22+
forces_embed_bitcode: true,
23+
frame_pointer: FramePointer::NonLeaf,
24+
// Taken from a clang build on Xcode 11.4.1.
25+
// These arguments are not actually invoked - they just have
26+
// to look right to pass App Store validation.
27+
bitcode_llvm_cmdline: "-triple\0\
28+
arm64-apple-watchos5.0-simulator\0\
29+
-emit-obj\0\
30+
-disable-llvm-passes\0\
31+
-target-abi\0\
32+
darwinpcs\0\
33+
-Os\0"
34+
.into(),
35+
..base
36+
},
37+
}
38+
}

compiler/rustc_target/src/spec/apple_base.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,3 +114,12 @@ pub fn ios_sim_llvm_target(arch: &str) -> String {
114114
let (major, minor) = ios_deployment_target();
115115
format!("{}-apple-ios{}.{}.0-simulator", arch, major, minor)
116116
}
117+
118+
fn watchos_deployment_target() -> (u32, u32) {
119+
deployment_target("WATCHOS_DEPLOYMENT_TARGET").unwrap_or((5, 0))
120+
}
121+
122+
pub fn watchos_sim_llvm_target(arch: &str) -> String {
123+
let (major, minor) = watchos_deployment_target();
124+
format!("{}-apple-watchos{}.{}.0-simulator", arch, major, minor)
125+
}

compiler/rustc_target/src/spec/apple_sdk_base.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ use Arch::*;
66
#[derive(Copy, Clone)]
77
pub enum Arch {
88
Armv7,
9+
Armv7k,
910
Armv7s,
1011
Arm64,
12+
Arm64_32,
1113
I386,
1214
X86_64,
1315
X86_64_macabi,
@@ -17,7 +19,7 @@ pub enum Arch {
1719

1820
fn target_abi(arch: Arch) -> &'static str {
1921
match arch {
20-
Armv7 | Armv7s | Arm64 | I386 | X86_64 => "",
22+
Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "",
2123
X86_64_macabi | Arm64_macabi => "macabi",
2224
Arm64_sim => "sim",
2325
}
@@ -26,8 +28,10 @@ fn target_abi(arch: Arch) -> &'static str {
2628
fn target_cpu(arch: Arch) -> &'static str {
2729
match arch {
2830
Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
31+
Armv7k => "cortex-a8",
2932
Armv7s => "cortex-a9",
3033
Arm64 => "apple-a7",
34+
Arm64_32 => "apple-s4",
3135
I386 => "yonah",
3236
X86_64 => "core2",
3337
X86_64_macabi => "core2",
@@ -38,7 +42,7 @@ fn target_cpu(arch: Arch) -> &'static str {
3842

3943
fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> {
4044
match arch {
41-
Armv7 | Armv7s | Arm64 | I386 | X86_64 | Arm64_sim => {
45+
Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 | Arm64_sim => {
4246
cvs!["MACOSX_DEPLOYMENT_TARGET"]
4347
}
4448
X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use super::apple_sdk_base::{opts, Arch};
2+
use crate::spec::{Target, TargetOptions};
3+
4+
pub fn target() -> Target {
5+
let base = opts("watchos", Arch::Arm64_32);
6+
Target {
7+
llvm_target: "arm64_32-apple-watchos".into(),
8+
pointer_width: 32,
9+
data_layout: "e-m:o-p:32:32-i64:64-i128:128-n32:64-S128".into(),
10+
arch: "aarch64".into(),
11+
options: TargetOptions {
12+
features: "+neon,+fp-armv8,+apple-a7".into(),
13+
max_atomic_width: Some(64),
14+
forces_embed_bitcode: true,
15+
// These arguments are not actually invoked - they just have
16+
// to look right to pass App Store validation.
17+
bitcode_llvm_cmdline: "-triple\0\
18+
arm64_32-apple-watchos5.0.0\0\
19+
-emit-obj\0\
20+
-disable-llvm-passes\0\
21+
-target-abi\0\
22+
darwinpcs\0\
23+
-Os\0"
24+
.into(),
25+
..base
26+
},
27+
}
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use super::apple_sdk_base::{opts, Arch};
2+
use crate::spec::{Target, TargetOptions};
3+
4+
pub fn target() -> Target {
5+
let base = opts("watchos", Arch::Armv7k);
6+
Target {
7+
llvm_target: "armv7k-apple-watchos".into(),
8+
pointer_width: 32,
9+
data_layout: "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128".into(),
10+
arch: "arm".into(),
11+
options: TargetOptions {
12+
features: "+v7,+vfp4,+neon".into(),
13+
max_atomic_width: Some(64),
14+
forces_embed_bitcode: true,
15+
// These arguments are not actually invoked - they just have
16+
// to look right to pass App Store validation.
17+
bitcode_llvm_cmdline: "-triple\0\
18+
armv7k-apple-watchos3.0.0\0\
19+
-emit-obj\0\
20+
-disable-llvm-passes\0\
21+
-target-abi\0\
22+
darwinpcs\0\
23+
-Os\0"
24+
.into(),
25+
..base
26+
},
27+
}
28+
}

compiler/rustc_target/src/spec/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,11 @@ supported_targets! {
928928
("aarch64-apple-tvos", aarch64_apple_tvos),
929929
("x86_64-apple-tvos", x86_64_apple_tvos),
930930

931+
("armv7k-apple-watchos", armv7k_apple_watchos),
932+
("arm64_32-apple-watchos", arm64_32_apple_watchos),
933+
("x86_64-apple-watchos-sim", x86_64_apple_watchos_sim),
934+
("aarch64-apple-watchos-sim", aarch64_apple_watchos_sim),
935+
931936
("armebv7r-none-eabi", armebv7r_none_eabi),
932937
("armebv7r-none-eabihf", armebv7r_none_eabihf),
933938
("armv7r-none-eabi", armv7r_none_eabi),
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use super::apple_sdk_base::{opts, Arch};
2+
use crate::spec::{StackProbeType, Target, TargetOptions};
3+
4+
pub fn target() -> Target {
5+
let base = opts("watchos", Arch::X86_64);
6+
7+
let arch = "x86_64";
8+
let llvm_target = super::apple_base::watchos_sim_llvm_target(arch);
9+
10+
Target {
11+
llvm_target: llvm_target.into(),
12+
pointer_width: 64,
13+
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
14+
.into(),
15+
arch: "x86_64".into(),
16+
options: TargetOptions {
17+
max_atomic_width: Some(64),
18+
// don't use probe-stack=inline-asm until rust#83139 and rust#84667 are resolved
19+
stack_probes: StackProbeType::Call,
20+
forces_embed_bitcode: true,
21+
// Taken from a clang build on Xcode 11.4.1.
22+
// These arguments are not actually invoked - they just have
23+
// to look right to pass App Store validation.
24+
bitcode_llvm_cmdline: "-triple\0\
25+
x86_64-apple-watchos5.0-simulator\0\
26+
-emit-obj\0\
27+
-disable-llvm-passes\0\
28+
-target-abi\0\
29+
darwinpcs\0\
30+
-Os\0"
31+
.into(),
32+
..base
33+
},
34+
}
35+
}

src/bootstrap/native.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,11 @@ impl Step for Llvm {
315315
cfg.define("LLVM_ENABLE_ZLIB", "OFF");
316316
}
317317

318-
// Are we compiling for iOS/tvOS?
319-
if target.contains("apple-ios") || target.contains("apple-tvos") {
318+
// Are we compiling for iOS/tvOS/watchOS?
319+
if target.contains("apple-ios")
320+
|| target.contains("apple-tvos")
321+
|| target.contains("apple-watchos")
322+
{
320323
// These two defines prevent CMake from automatically trying to add a MacOSX sysroot, which leads to a compiler error.
321324
cfg.define("CMAKE_OSX_SYSROOT", "/");
322325
cfg.define("CMAKE_OSX_DEPLOYMENT_TARGET", "");

0 commit comments

Comments
 (0)