mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-21 19:33:16 +00:00
Add support for the x86_64h-apple-darwin target
This commit is contained in:
parent
73c8d2df7b
commit
9684c38450
@ -19,6 +19,7 @@ pub enum Arch {
|
||||
I386,
|
||||
I686,
|
||||
X86_64,
|
||||
X86_64h,
|
||||
X86_64_sim,
|
||||
X86_64_macabi,
|
||||
Arm64_macabi,
|
||||
@ -36,6 +37,7 @@ impl Arch {
|
||||
I386 => "i386",
|
||||
I686 => "i686",
|
||||
X86_64 | X86_64_sim | X86_64_macabi => "x86_64",
|
||||
X86_64h => "x86_64h",
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,13 +46,13 @@ impl Arch {
|
||||
Armv7 | Armv7k | Armv7s => "arm",
|
||||
Arm64 | Arm64_32 | Arm64_macabi | Arm64_sim => "aarch64",
|
||||
I386 | I686 => "x86",
|
||||
X86_64 | X86_64_sim | X86_64_macabi => "x86_64",
|
||||
X86_64 | X86_64_sim | X86_64_macabi | X86_64h => "x86_64",
|
||||
})
|
||||
}
|
||||
|
||||
fn target_abi(self) -> &'static str {
|
||||
match self {
|
||||
Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | I686 | X86_64 => "",
|
||||
Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | I686 | X86_64 | X86_64h => "",
|
||||
X86_64_macabi | Arm64_macabi => "macabi",
|
||||
// x86_64-apple-ios is a simulator target, even though it isn't
|
||||
// declared that way in the target like the other ones...
|
||||
@ -67,6 +69,10 @@ impl Arch {
|
||||
Arm64_32 => "apple-s4",
|
||||
I386 | I686 => "yonah",
|
||||
X86_64 | X86_64_sim => "core2",
|
||||
// Note: `core-avx2` is slightly more advanced than `x86_64h`, see
|
||||
// comments (and disabled features) in `x86_64h_apple_darwin` for
|
||||
// details.
|
||||
X86_64h => "core-avx2",
|
||||
X86_64_macabi => "core2",
|
||||
Arm64_macabi => "apple-a12",
|
||||
Arm64_sim => "apple-a12",
|
||||
@ -182,8 +188,13 @@ fn deployment_target(var_name: &str) -> Option<(u32, u32)> {
|
||||
}
|
||||
|
||||
fn macos_default_deployment_target(arch: Arch) -> (u32, u32) {
|
||||
// Note: Arm64_sim is not included since macOS has no simulator.
|
||||
if matches!(arch, Arm64 | Arm64_macabi) { (11, 0) } else { (10, 7) }
|
||||
match arch {
|
||||
// Note: Arm64_sim is not included since macOS has no simulator.
|
||||
Arm64 | Arm64_macabi => (11, 0),
|
||||
// x86_64h-apple-darwin only supports macOS 10.8 and later
|
||||
X86_64h => (10, 8),
|
||||
_ => (10, 7),
|
||||
}
|
||||
}
|
||||
|
||||
fn macos_deployment_target(arch: Arch) -> (u32, u32) {
|
||||
@ -227,7 +238,7 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]>
|
||||
// of the linking environment that's wrong and reversed.
|
||||
match arch {
|
||||
Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | I686 | X86_64 | X86_64_sim
|
||||
| Arm64_sim => {
|
||||
| X86_64h | Arm64_sim => {
|
||||
cvs!["MACOSX_DEPLOYMENT_TARGET"]
|
||||
}
|
||||
X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
|
||||
|
@ -1110,6 +1110,7 @@ supported_targets! {
|
||||
|
||||
("aarch64-apple-darwin", aarch64_apple_darwin),
|
||||
("x86_64-apple-darwin", x86_64_apple_darwin),
|
||||
("x86_64h-apple-darwin", x86_64h_apple_darwin),
|
||||
("i686-apple-darwin", i686_apple_darwin),
|
||||
|
||||
// FIXME(#106649): Remove aarch64-fuchsia in favor of aarch64-unknown-fuchsia
|
||||
|
44
compiler/rustc_target/src/spec/x86_64h_apple_darwin.rs
Normal file
44
compiler/rustc_target/src/spec/x86_64h_apple_darwin.rs
Normal file
@ -0,0 +1,44 @@
|
||||
use super::apple_base::{macos_llvm_target, opts, Arch};
|
||||
use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, SanitizerSet};
|
||||
use crate::spec::{StackProbeType, Target, TargetOptions};
|
||||
|
||||
pub fn target() -> Target {
|
||||
let arch = Arch::X86_64h;
|
||||
let mut base = opts("macos", arch);
|
||||
base.max_atomic_width = Some(128);
|
||||
base.frame_pointer = FramePointer::Always;
|
||||
base.add_pre_link_args(LinkerFlavor::Darwin(Cc::Yes, Lld::No), &["-m64"]);
|
||||
base.stack_probes = StackProbeType::X86;
|
||||
base.supported_sanitizers =
|
||||
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK | SanitizerSet::THREAD;
|
||||
|
||||
// x86_64h is core2-avx without a few of the features which would otherwise
|
||||
// be guaranteed, so we need to disable those. This imitates clang's logic:
|
||||
// - https://github.com/llvm/llvm-project/blob/bd1f7c417/clang/lib/Driver/ToolChains/Arch/X86.cpp#L77-L78
|
||||
// - https://github.com/llvm/llvm-project/blob/bd1f7c417/clang/lib/Driver/ToolChains/Arch/X86.cpp#L133-L141
|
||||
//
|
||||
// FIXME: Sadly, turning these off here disables them in such a way that they
|
||||
// aren't re-enabled by `-Ctarget-cpu=native` (on a machine that has them).
|
||||
// It would be nice if this were not the case, but fixing it seems tricky
|
||||
// (and given that the main use-case for this target is for use in universal
|
||||
// binaries, probably not that important).
|
||||
base.features = "-rdrnd,-aes,-pclmul,-rtm,-fsgsbase".into();
|
||||
// Double-check that the `cpu` is what we expect (if it's not the list above
|
||||
// may need updating).
|
||||
assert_eq!(
|
||||
base.cpu, "core-avx2",
|
||||
"you need to adjust the feature list in x86_64h-apple-darwin if you change this",
|
||||
);
|
||||
|
||||
Target {
|
||||
// Clang automatically chooses a more specific target based on
|
||||
// MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work
|
||||
// correctly, we do too.
|
||||
llvm_target: macos_llvm_target(arch).into(),
|
||||
pointer_width: 64,
|
||||
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
.into(),
|
||||
arch: arch.target_arch(),
|
||||
options: TargetOptions { mcount: "\u{1}mcount".into(), ..base },
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user