From 94ddbb615d290ece648076f7d34198249a191fff Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 19 Feb 2024 12:13:01 +0100 Subject: [PATCH 1/5] Remove MACOSX_DEPLOYMENT_TARGET env var when linking Mac Catalyst Mac Catalyst uses IPHONEOS_DEPLOYMENT_TARGET to specify the deployment target, so it makes no sense to remove that variable. --- compiler/rustc_target/src/spec/base/apple/mod.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/apple/mod.rs b/compiler/rustc_target/src/spec/base/apple/mod.rs index aee5d60626e31..0724ba53f4e02 100644 --- a/compiler/rustc_target/src/spec/base/apple/mod.rs +++ b/compiler/rustc_target/src/spec/base/apple/mod.rs @@ -131,7 +131,7 @@ pub fn opts(os: &'static str, arch: Arch) -> TargetOptions { abi: abi.into(), os: os.into(), cpu: arch.target_cpu().into(), - link_env_remove: link_env_remove(arch, os), + link_env_remove: link_env_remove(os), vendor: "apple".into(), linker_flavor: LinkerFlavor::Darwin(Cc::Yes, Lld::No), // macOS has -dead_strip, which doesn't rely on function_sections @@ -270,7 +270,7 @@ pub fn macos_llvm_target(arch: Arch) -> String { format!("{}-apple-macosx{}.{}.0", arch.target_name(), major, minor) } -fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow]> { +fn link_env_remove(os: &'static str) -> StaticCow<[StaticCow]> { // Apple platforms only officially support macOS as a host for any compilation. // // If building for macOS, we go ahead and remove any erroneous environment state @@ -298,15 +298,9 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow]> env_remove.push("TVOS_DEPLOYMENT_TARGET".into()); env_remove.into() } else { - // Otherwise if cross-compiling for a different OS/SDK, remove any part + // Otherwise if cross-compiling for a different OS/SDK (including Mac Catalyst), remove any part // of the linking environment that's wrong and reversed. - match arch { - Armv7k | Armv7s | Arm64 | Arm64e | Arm64_32 | I386 | I386_sim | I686 | X86_64 - | X86_64_sim | X86_64h | Arm64_sim => { - cvs!["MACOSX_DEPLOYMENT_TARGET"] - } - X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"], - } + cvs!["MACOSX_DEPLOYMENT_TARGET"] } } From 92d4b313eb11a24292e1c91b07a2887b719265d4 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 19 Feb 2024 12:45:11 +0100 Subject: [PATCH 2/5] Make LLVM target contain correct deployment target info on Mac Catalyst --- .../rustc_target/src/spec/base/apple/mod.rs | 21 +++++++++++++++---- .../spec/targets/aarch64_apple_ios_macabi.rs | 9 +++----- .../spec/targets/x86_64_apple_ios_macabi.rs | 9 +++----- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/apple/mod.rs b/compiler/rustc_target/src/spec/base/apple/mod.rs index 0724ba53f4e02..1caa0eccc6222 100644 --- a/compiler/rustc_target/src/spec/base/apple/mod.rs +++ b/compiler/rustc_target/src/spec/base/apple/mod.rs @@ -106,11 +106,9 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { } .into(); - let arch = arch.target_name(); - let mut args = TargetOptions::link_args( LinkerFlavor::Darwin(Cc::No, Lld::No), - &["-arch", arch, "-platform_version"], + &["-arch", arch.target_name(), "-platform_version"], ); add_link_args_iter( &mut args, @@ -118,7 +116,17 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { [platform_name, platform_version.clone(), platform_version].into_iter(), ); if abi != "macabi" { - add_link_args(&mut args, LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-arch", arch]); + add_link_args( + &mut args, + LinkerFlavor::Darwin(Cc::Yes, Lld::No), + &["-arch", arch.target_name()], + ); + } else { + add_link_args_iter( + &mut args, + LinkerFlavor::Darwin(Cc::Yes, Lld::No), + ["-target".into(), mac_catalyst_llvm_target(arch).into()].into_iter(), + ); } args @@ -326,6 +334,11 @@ pub fn ios_llvm_target(arch: Arch) -> String { format!("{}-apple-ios{}.{}.0", arch.target_name(), major, minor) } +pub fn mac_catalyst_llvm_target(arch: Arch) -> String { + let (major, minor) = mac_catalyst_deployment_target(); + format!("{}-apple-ios{}.{}.0-macabi", arch.target_name(), major, minor) +} + fn ios_lld_platform_version(arch: Arch) -> String { let (major, minor) = ios_deployment_target(arch); format!("{major}.{minor}") diff --git a/compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs b/compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs index 78067a138a938..300e301407924 100644 --- a/compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs +++ b/compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs @@ -1,16 +1,13 @@ -use crate::spec::base::apple::{opts, Arch}; -use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, SanitizerSet, Target, TargetOptions}; +use crate::spec::base::apple::{mac_catalyst_llvm_target, opts, Arch}; +use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions}; pub fn target() -> Target { - let llvm_target = "arm64-apple-ios14.0-macabi"; - let arch = Arch::Arm64_macabi; let mut base = opts("ios", arch); - base.add_pre_link_args(LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-target", llvm_target]); base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::THREAD; Target { - llvm_target: llvm_target.into(), + llvm_target: mac_catalyst_llvm_target(arch).into(), pointer_width: 64, data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".into(), arch: arch.target_arch(), diff --git a/compiler/rustc_target/src/spec/targets/x86_64_apple_ios_macabi.rs b/compiler/rustc_target/src/spec/targets/x86_64_apple_ios_macabi.rs index ff21e48933324..e59f41185deea 100644 --- a/compiler/rustc_target/src/spec/targets/x86_64_apple_ios_macabi.rs +++ b/compiler/rustc_target/src/spec/targets/x86_64_apple_ios_macabi.rs @@ -1,16 +1,13 @@ -use crate::spec::base::apple::{opts, Arch}; -use crate::spec::{Cc, LinkerFlavor, Lld, SanitizerSet, Target, TargetOptions}; +use crate::spec::base::apple::{mac_catalyst_llvm_target, opts, Arch}; +use crate::spec::{SanitizerSet, Target, TargetOptions}; pub fn target() -> Target { - let llvm_target = "x86_64-apple-ios14.0-macabi"; - let arch = Arch::X86_64_macabi; let mut base = opts("ios", arch); - base.add_pre_link_args(LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-target", llvm_target]); base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::THREAD; Target { - llvm_target: llvm_target.into(), + llvm_target: mac_catalyst_llvm_target(arch).into(), pointer_width: 64, data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(), From 3cb4e34310e3548a540b5a3e72567ffb7883b38e Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 19 Feb 2024 13:10:07 +0100 Subject: [PATCH 3/5] Fix ld platform_version argument on Mac Catalyst --- .../rustc_target/src/spec/base/apple/mod.rs | 42 ++++++------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/apple/mod.rs b/compiler/rustc_target/src/spec/base/apple/mod.rs index 1caa0eccc6222..7044e5f8ffc85 100644 --- a/compiler/rustc_target/src/spec/base/apple/mod.rs +++ b/compiler/rustc_target/src/spec/base/apple/mod.rs @@ -97,14 +97,18 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { _ => os.into(), }; - let platform_version: StaticCow = match os { - "ios" => ios_lld_platform_version(arch), - "tvos" => tvos_lld_platform_version(), - "watchos" => watchos_lld_platform_version(), - "macos" => macos_lld_platform_version(arch), - _ => unreachable!(), - } - .into(); + let min_version: StaticCow = { + let (major, minor) = match (os, abi) { + ("ios", "macabi") => mac_catalyst_deployment_target(), + ("ios", _) => ios_deployment_target(arch), + ("tvos", _) => tvos_deployment_target(), + ("watchos", _) => watchos_deployment_target(), + ("macos", _) => macos_deployment_target(arch), + _ => unreachable!(), + }; + format!("{major}.{minor}").into() + }; + let sdk_version = min_version.clone(); let mut args = TargetOptions::link_args( LinkerFlavor::Darwin(Cc::No, Lld::No), @@ -113,7 +117,7 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { add_link_args_iter( &mut args, LinkerFlavor::Darwin(Cc::No, Lld::No), - [platform_name, platform_version.clone(), platform_version].into_iter(), + [platform_name, min_version, sdk_version].into_iter(), ); if abi != "macabi" { add_link_args( @@ -268,11 +272,6 @@ fn macos_deployment_target(arch: Arch) -> (u32, u32) { .unwrap_or_else(|| macos_default_deployment_target(arch)) } -fn macos_lld_platform_version(arch: Arch) -> String { - let (major, minor) = macos_deployment_target(arch); - format!("{major}.{minor}") -} - pub fn macos_llvm_target(arch: Arch) -> String { let (major, minor) = macos_deployment_target(arch); format!("{}-apple-macosx{}.{}.0", arch.target_name(), major, minor) @@ -339,11 +338,6 @@ pub fn mac_catalyst_llvm_target(arch: Arch) -> String { format!("{}-apple-ios{}.{}.0-macabi", arch.target_name(), major, minor) } -fn ios_lld_platform_version(arch: Arch) -> String { - let (major, minor) = ios_deployment_target(arch); - format!("{major}.{minor}") -} - pub fn ios_sim_llvm_target(arch: Arch) -> String { let (major, minor) = ios_deployment_target(arch); format!("{}-apple-ios{}.{}.0-simulator", arch.target_name(), major, minor) @@ -354,11 +348,6 @@ fn tvos_deployment_target() -> (u32, u32) { from_set_deployment_target("TVOS_DEPLOYMENT_TARGET").unwrap_or((10, 0)) } -fn tvos_lld_platform_version() -> String { - let (major, minor) = tvos_deployment_target(); - format!("{major}.{minor}") -} - pub fn tvos_llvm_target(arch: Arch) -> String { let (major, minor) = tvos_deployment_target(); format!("{}-apple-tvos{}.{}.0", arch.target_name(), major, minor) @@ -374,11 +363,6 @@ fn watchos_deployment_target() -> (u32, u32) { from_set_deployment_target("WATCHOS_DEPLOYMENT_TARGET").unwrap_or((5, 0)) } -fn watchos_lld_platform_version() -> String { - let (major, minor) = watchos_deployment_target(); - format!("{major}.{minor}") -} - pub fn watchos_sim_llvm_target(arch: Arch) -> String { let (major, minor) = watchos_deployment_target(); format!("{}-apple-watchos{}.{}.0-simulator", arch.target_name(), major, minor) From cd530fccb3f4bc870d3e671d6944fa2883720b14 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 19 Feb 2024 13:09:47 +0100 Subject: [PATCH 4/5] Merge deployment target variable loading on iOS and Mac Catalyst --- .../rustc_target/src/spec/base/apple/mod.rs | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/compiler/rustc_target/src/spec/base/apple/mod.rs b/compiler/rustc_target/src/spec/base/apple/mod.rs index 7044e5f8ffc85..322d1c4e5f636 100644 --- a/compiler/rustc_target/src/spec/base/apple/mod.rs +++ b/compiler/rustc_target/src/spec/base/apple/mod.rs @@ -98,12 +98,11 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs { }; let min_version: StaticCow = { - let (major, minor) = match (os, abi) { - ("ios", "macabi") => mac_catalyst_deployment_target(), - ("ios", _) => ios_deployment_target(arch), - ("tvos", _) => tvos_deployment_target(), - ("watchos", _) => watchos_deployment_target(), - ("macos", _) => macos_deployment_target(arch), + let (major, minor) = match os { + "ios" => ios_deployment_target(arch, abi), + "tvos" => tvos_deployment_target(), + "watchos" => watchos_deployment_target(), + "macos" => macos_deployment_target(arch), _ => unreachable!(), }; format!("{major}.{minor}").into() @@ -232,16 +231,13 @@ pub fn deployment_target(target: &Target) -> Option<(u32, u32)> { }; macos_deployment_target(arch) } - "ios" => match &*target.abi { - "macabi" => mac_catalyst_deployment_target(), - _ => { - let arch = match target.arch.as_ref() { - "arm64e" => Arm64e, - _ => Arm64, - }; - ios_deployment_target(arch) - } - }, + "ios" => { + let arch = match target.arch.as_ref() { + "arm64e" => Arm64e, + _ => Arm64, + }; + ios_deployment_target(arch, &target.abi) + } "watchos" => watchos_deployment_target(), "tvos" => tvos_deployment_target(), _ => return None, @@ -311,17 +307,16 @@ fn link_env_remove(os: &'static str) -> StaticCow<[StaticCow]> { } } -fn ios_deployment_target(arch: Arch) -> (u32, u32) { +fn ios_deployment_target(arch: Arch, abi: &str) -> (u32, u32) { // If you are looking for the default deployment target, prefer `rustc --print deployment-target`. - let (major, minor) = if arch == Arm64e { (14, 0) } else { (10, 0) }; + let (major, minor) = match (arch, abi) { + (Arm64e, _) => (14, 0), + (_, "macabi") => (14, 0), + _ => (10, 0), + }; from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((major, minor)) } -fn mac_catalyst_deployment_target() -> (u32, u32) { - // If you are looking for the default deployment target, prefer `rustc --print deployment-target`. - from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((14, 0)) -} - pub fn ios_llvm_target(arch: Arch) -> String { // Modern iOS tooling extracts information about deployment target // from LC_BUILD_VERSION. This load command will only be emitted when @@ -329,17 +324,17 @@ pub fn ios_llvm_target(arch: Arch) -> String { // set high enough. Luckily one LC_BUILD_VERSION is enough, for Xcode // to pick it up (since std and core are still built with the fallback // of version 7.0 and hence emit the old LC_IPHONE_MIN_VERSION). - let (major, minor) = ios_deployment_target(arch); + let (major, minor) = ios_deployment_target(arch, ""); format!("{}-apple-ios{}.{}.0", arch.target_name(), major, minor) } pub fn mac_catalyst_llvm_target(arch: Arch) -> String { - let (major, minor) = mac_catalyst_deployment_target(); + let (major, minor) = ios_deployment_target(arch, "macabi"); format!("{}-apple-ios{}.{}.0-macabi", arch.target_name(), major, minor) } pub fn ios_sim_llvm_target(arch: Arch) -> String { - let (major, minor) = ios_deployment_target(arch); + let (major, minor) = ios_deployment_target(arch, "sim"); format!("{}-apple-ios{}.{}.0-simulator", arch.target_name(), major, minor) } From a3cf493642e770783d2bd89deb8afe90af45525b Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 19 Feb 2024 13:30:53 +0100 Subject: [PATCH 5/5] Lower default Mac Catalyst deployment target to 13.1 Same default as Clang: https://github.com/llvm/llvm-project/blob/d022f32c73c57b59a9121eba909f5034e89c628e/clang/lib/Driver/ToolChains/Darwin.cpp#L2038 --- compiler/rustc_target/src/spec/base/apple/mod.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_target/src/spec/base/apple/mod.rs b/compiler/rustc_target/src/spec/base/apple/mod.rs index 322d1c4e5f636..dd75377ead2a7 100644 --- a/compiler/rustc_target/src/spec/base/apple/mod.rs +++ b/compiler/rustc_target/src/spec/base/apple/mod.rs @@ -311,7 +311,8 @@ fn ios_deployment_target(arch: Arch, abi: &str) -> (u32, u32) { // If you are looking for the default deployment target, prefer `rustc --print deployment-target`. let (major, minor) = match (arch, abi) { (Arm64e, _) => (14, 0), - (_, "macabi") => (14, 0), + // Mac Catalyst defaults to 13.1 in Clang. + (_, "macabi") => (13, 1), _ => (10, 0), }; from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((major, minor))