Add arm64e-apple-ios target
This commit is contained in:
parent
698fcc8219
commit
f5e3492194
@ -2659,9 +2659,9 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "object"
|
name = "object"
|
||||||
version = "0.32.0"
|
version = "0.32.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe"
|
checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"compiler_builtins",
|
"compiler_builtins",
|
||||||
"crc32fast",
|
"crc32fast",
|
||||||
|
@ -46,7 +46,7 @@ libc = "0.2.50"
|
|||||||
# tidy-alphabetical-end
|
# tidy-alphabetical-end
|
||||||
|
|
||||||
[dependencies.object]
|
[dependencies.object]
|
||||||
version = "0.32.0"
|
version = "0.32.1"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["read_core", "elf", "macho", "pe", "xcoff", "unaligned", "archive", "write"]
|
features = ["read_core", "elf", "macho", "pe", "xcoff", "unaligned", "archive", "write"]
|
||||||
|
|
||||||
|
@ -226,6 +226,10 @@ pub(crate) fn create_object_file(sess: &Session) -> Option<write::Object<'static
|
|||||||
|
|
||||||
let mut file = write::Object::new(binary_format, architecture, endianness);
|
let mut file = write::Object::new(binary_format, architecture, endianness);
|
||||||
if sess.target.is_like_osx {
|
if sess.target.is_like_osx {
|
||||||
|
if macho_is_arm64e(&sess.target) {
|
||||||
|
file.set_macho_cpu_subtype(object::macho::CPU_SUBTYPE_ARM64E);
|
||||||
|
}
|
||||||
|
|
||||||
file.set_macho_build_version(macho_object_build_version_for_target(&sess.target))
|
file.set_macho_build_version(macho_object_build_version_for_target(&sess.target))
|
||||||
}
|
}
|
||||||
if binary_format == BinaryFormat::Coff {
|
if binary_format == BinaryFormat::Coff {
|
||||||
@ -385,6 +389,11 @@ fn macho_object_build_version_for_target(target: &Target) -> object::write::Mach
|
|||||||
build_version
|
build_version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Is Apple's CPU subtype `arm64e`s
|
||||||
|
fn macho_is_arm64e(target: &Target) -> bool {
|
||||||
|
return target.llvm_target.starts_with("arm64e");
|
||||||
|
}
|
||||||
|
|
||||||
pub enum MetadataPosition {
|
pub enum MetadataPosition {
|
||||||
First,
|
First,
|
||||||
Last,
|
Last,
|
||||||
|
@ -9,11 +9,12 @@ mod tests;
|
|||||||
|
|
||||||
use Arch::*;
|
use Arch::*;
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone, PartialEq)]
|
||||||
pub enum Arch {
|
pub enum Arch {
|
||||||
Armv7k,
|
Armv7k,
|
||||||
Armv7s,
|
Armv7s,
|
||||||
Arm64,
|
Arm64,
|
||||||
|
Arm64e,
|
||||||
Arm64_32,
|
Arm64_32,
|
||||||
I386,
|
I386,
|
||||||
I686,
|
I686,
|
||||||
@ -31,6 +32,7 @@ impl Arch {
|
|||||||
Armv7k => "armv7k",
|
Armv7k => "armv7k",
|
||||||
Armv7s => "armv7s",
|
Armv7s => "armv7s",
|
||||||
Arm64 | Arm64_macabi | Arm64_sim => "arm64",
|
Arm64 | Arm64_macabi | Arm64_sim => "arm64",
|
||||||
|
Arm64e => "arm64e",
|
||||||
Arm64_32 => "arm64_32",
|
Arm64_32 => "arm64_32",
|
||||||
I386 => "i386",
|
I386 => "i386",
|
||||||
I686 => "i686",
|
I686 => "i686",
|
||||||
@ -42,7 +44,7 @@ impl Arch {
|
|||||||
pub fn target_arch(self) -> Cow<'static, str> {
|
pub fn target_arch(self) -> Cow<'static, str> {
|
||||||
Cow::Borrowed(match self {
|
Cow::Borrowed(match self {
|
||||||
Armv7k | Armv7s => "arm",
|
Armv7k | Armv7s => "arm",
|
||||||
Arm64 | Arm64_32 | Arm64_macabi | Arm64_sim => "aarch64",
|
Arm64 | Arm64e | Arm64_32 | Arm64_macabi | Arm64_sim => "aarch64",
|
||||||
I386 | I686 => "x86",
|
I386 | I686 => "x86",
|
||||||
X86_64 | X86_64_sim | X86_64_macabi | X86_64h => "x86_64",
|
X86_64 | X86_64_sim | X86_64_macabi | X86_64h => "x86_64",
|
||||||
})
|
})
|
||||||
@ -50,7 +52,7 @@ impl Arch {
|
|||||||
|
|
||||||
fn target_abi(self) -> &'static str {
|
fn target_abi(self) -> &'static str {
|
||||||
match self {
|
match self {
|
||||||
Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | I686 | X86_64 | X86_64h => "",
|
Armv7k | Armv7s | Arm64 | Arm64e | Arm64_32 | I386 | I686 | X86_64 | X86_64h => "",
|
||||||
X86_64_macabi | Arm64_macabi => "macabi",
|
X86_64_macabi | Arm64_macabi => "macabi",
|
||||||
// x86_64-apple-ios is a simulator target, even though it isn't
|
// x86_64-apple-ios is a simulator target, even though it isn't
|
||||||
// declared that way in the target like the other ones...
|
// declared that way in the target like the other ones...
|
||||||
@ -63,6 +65,7 @@ impl Arch {
|
|||||||
Armv7k => "cortex-a8",
|
Armv7k => "cortex-a8",
|
||||||
Armv7s => "swift", // iOS 10 is only supported on iPhone 5 or higher.
|
Armv7s => "swift", // iOS 10 is only supported on iPhone 5 or higher.
|
||||||
Arm64 => "apple-a7",
|
Arm64 => "apple-a7",
|
||||||
|
Arm64e => "apple-a12",
|
||||||
Arm64_32 => "apple-s4",
|
Arm64_32 => "apple-s4",
|
||||||
// Only macOS 10.12+ is supported, which means
|
// Only macOS 10.12+ is supported, which means
|
||||||
// all x86_64/x86 CPUs must be running at least penryn
|
// all x86_64/x86 CPUs must be running at least penryn
|
||||||
@ -88,7 +91,7 @@ fn pre_link_args(os: &'static str, arch: Arch, abi: &'static str) -> LinkArgs {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let platform_version: StaticCow<str> = match os {
|
let platform_version: StaticCow<str> = match os {
|
||||||
"ios" => ios_lld_platform_version(),
|
"ios" => ios_lld_platform_version(arch),
|
||||||
"tvos" => tvos_lld_platform_version(),
|
"tvos" => tvos_lld_platform_version(),
|
||||||
"watchos" => watchos_lld_platform_version(),
|
"watchos" => watchos_lld_platform_version(),
|
||||||
"macos" => macos_lld_platform_version(arch),
|
"macos" => macos_lld_platform_version(arch),
|
||||||
@ -202,12 +205,22 @@ pub fn deployment_target(target: &Target) -> Option<(u32, u32)> {
|
|||||||
let (major, minor) = match &*target.os {
|
let (major, minor) = match &*target.os {
|
||||||
"macos" => {
|
"macos" => {
|
||||||
// This does not need to be specific. It just needs to handle x86 vs M1.
|
// This does not need to be specific. It just needs to handle x86 vs M1.
|
||||||
let arch = if target.arch == "x86" || target.arch == "x86_64" { X86_64 } else { Arm64 };
|
let arch = match target.arch.as_ref() {
|
||||||
|
"x86" | "x86_64" => X86_64,
|
||||||
|
"arm64e" => Arm64e,
|
||||||
|
_ => Arm64,
|
||||||
|
};
|
||||||
macos_deployment_target(arch)
|
macos_deployment_target(arch)
|
||||||
}
|
}
|
||||||
"ios" => match &*target.abi {
|
"ios" => match &*target.abi {
|
||||||
"macabi" => mac_catalyst_deployment_target(),
|
"macabi" => mac_catalyst_deployment_target(),
|
||||||
_ => ios_deployment_target(),
|
_ => {
|
||||||
|
let arch = match target.arch.as_ref() {
|
||||||
|
"arm64e" => Arm64e,
|
||||||
|
_ => Arm64,
|
||||||
|
};
|
||||||
|
ios_deployment_target(arch)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"watchos" => watchos_deployment_target(),
|
"watchos" => watchos_deployment_target(),
|
||||||
"tvos" => tvos_deployment_target(),
|
"tvos" => tvos_deployment_target(),
|
||||||
@ -228,7 +241,7 @@ fn from_set_deployment_target(var_name: &str) -> Option<(u32, u32)> {
|
|||||||
fn macos_default_deployment_target(arch: Arch) -> (u32, u32) {
|
fn macos_default_deployment_target(arch: Arch) -> (u32, u32) {
|
||||||
match arch {
|
match arch {
|
||||||
// Note: Arm64_sim is not included since macOS has no simulator.
|
// Note: Arm64_sim is not included since macOS has no simulator.
|
||||||
Arm64 | Arm64_macabi => (11, 0),
|
Arm64 | Arm64e | Arm64_macabi => (11, 0),
|
||||||
_ => (10, 12),
|
_ => (10, 12),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,8 +293,8 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]>
|
|||||||
// Otherwise if cross-compiling for a different OS/SDK, remove any part
|
// Otherwise if cross-compiling for a different OS/SDK, remove any part
|
||||||
// of the linking environment that's wrong and reversed.
|
// of the linking environment that's wrong and reversed.
|
||||||
match arch {
|
match arch {
|
||||||
Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | I686 | X86_64 | X86_64_sim | X86_64h
|
Armv7k | Armv7s | Arm64 | Arm64e | Arm64_32 | I386 | I686 | X86_64 | X86_64_sim
|
||||||
| Arm64_sim => {
|
| X86_64h | Arm64_sim => {
|
||||||
cvs!["MACOSX_DEPLOYMENT_TARGET"]
|
cvs!["MACOSX_DEPLOYMENT_TARGET"]
|
||||||
}
|
}
|
||||||
X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
|
X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"],
|
||||||
@ -289,9 +302,10 @@ fn link_env_remove(arch: Arch, os: &'static str) -> StaticCow<[StaticCow<str>]>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ios_deployment_target() -> (u32, u32) {
|
fn ios_deployment_target(arch: Arch) -> (u32, u32) {
|
||||||
// If you are looking for the default deployment target, prefer `rustc --print deployment-target`.
|
// If you are looking for the default deployment target, prefer `rustc --print deployment-target`.
|
||||||
from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((10, 0))
|
let (major, minor) = if arch == Arm64e { (14, 0) } else { (10, 0) };
|
||||||
|
from_set_deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((major, minor))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mac_catalyst_deployment_target() -> (u32, u32) {
|
fn mac_catalyst_deployment_target() -> (u32, u32) {
|
||||||
@ -306,17 +320,17 @@ pub fn ios_llvm_target(arch: Arch) -> String {
|
|||||||
// set high enough. Luckily one LC_BUILD_VERSION is enough, for Xcode
|
// 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
|
// 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).
|
// of version 7.0 and hence emit the old LC_IPHONE_MIN_VERSION).
|
||||||
let (major, minor) = ios_deployment_target();
|
let (major, minor) = ios_deployment_target(arch);
|
||||||
format!("{}-apple-ios{}.{}.0", arch.target_name(), major, minor)
|
format!("{}-apple-ios{}.{}.0", arch.target_name(), major, minor)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ios_lld_platform_version() -> String {
|
fn ios_lld_platform_version(arch: Arch) -> String {
|
||||||
let (major, minor) = ios_deployment_target();
|
let (major, minor) = ios_deployment_target(arch);
|
||||||
format!("{major}.{minor}")
|
format!("{major}.{minor}")
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ios_sim_llvm_target(arch: Arch) -> String {
|
pub fn ios_sim_llvm_target(arch: Arch) -> String {
|
||||||
let (major, minor) = ios_deployment_target();
|
let (major, minor) = ios_deployment_target(arch);
|
||||||
format!("{}-apple-ios{}.{}.0-simulator", arch.target_name(), major, minor)
|
format!("{}-apple-ios{}.{}.0-simulator", arch.target_name(), major, minor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1566,6 +1566,7 @@ supported_targets! {
|
|||||||
("i386-apple-ios", i386_apple_ios),
|
("i386-apple-ios", i386_apple_ios),
|
||||||
("x86_64-apple-ios", x86_64_apple_ios),
|
("x86_64-apple-ios", x86_64_apple_ios),
|
||||||
("aarch64-apple-ios", aarch64_apple_ios),
|
("aarch64-apple-ios", aarch64_apple_ios),
|
||||||
|
("arm64e-apple-ios", arm64e_apple_ios),
|
||||||
("armv7s-apple-ios", armv7s_apple_ios),
|
("armv7s-apple-ios", armv7s_apple_ios),
|
||||||
("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
|
("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi),
|
||||||
("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
|
("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi),
|
||||||
|
30
compiler/rustc_target/src/spec/targets/arm64e_apple_ios.rs
Normal file
30
compiler/rustc_target/src/spec/targets/arm64e_apple_ios.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
use crate::spec::base::apple::{ios_llvm_target, opts, Arch};
|
||||||
|
use crate::spec::{FramePointer, SanitizerSet, Target, TargetOptions};
|
||||||
|
|
||||||
|
pub fn target() -> Target {
|
||||||
|
let arch = Arch::Arm64e;
|
||||||
|
let mut base = opts("ios", arch);
|
||||||
|
base.supported_sanitizers = SanitizerSet::ADDRESS | SanitizerSet::THREAD;
|
||||||
|
|
||||||
|
Target {
|
||||||
|
llvm_target: ios_llvm_target(arch).into(),
|
||||||
|
pointer_width: 64,
|
||||||
|
data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".into(),
|
||||||
|
arch: arch.target_arch(),
|
||||||
|
options: TargetOptions {
|
||||||
|
features: "+neon,+fp-armv8,+apple-a12,+v8.3a,+paca,+pacg".into(),
|
||||||
|
max_atomic_width: Some(128),
|
||||||
|
forces_embed_bitcode: true,
|
||||||
|
frame_pointer: FramePointer::NonLeaf,
|
||||||
|
bitcode_llvm_cmdline: "-triple\0\
|
||||||
|
arm64e-apple-ios14.1.0\0\
|
||||||
|
-emit-obj\0\
|
||||||
|
-disable-llvm-passes\0\
|
||||||
|
-target-abi\0\
|
||||||
|
darwinpcs\0\
|
||||||
|
-Os\0"
|
||||||
|
.into(),
|
||||||
|
..base
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
@ -15,6 +15,7 @@
|
|||||||
- [Platform Support](platform-support.md)
|
- [Platform Support](platform-support.md)
|
||||||
- [Target Tier Policy](target-tier-policy.md)
|
- [Target Tier Policy](target-tier-policy.md)
|
||||||
- [Template for Target-specific Documentation](platform-support/TEMPLATE.md)
|
- [Template for Target-specific Documentation](platform-support/TEMPLATE.md)
|
||||||
|
- [arm64e-apple-ios.md](platform-support/arm64e-apple-ios.md)
|
||||||
- [aarch64-apple-ios-sim](platform-support/aarch64-apple-ios-sim.md)
|
- [aarch64-apple-ios-sim](platform-support/aarch64-apple-ios-sim.md)
|
||||||
- [\*-apple-tvos](platform-support/apple-tvos.md)
|
- [\*-apple-tvos](platform-support/apple-tvos.md)
|
||||||
- [\*-apple-watchos\*](platform-support/apple-watchos.md)
|
- [\*-apple-watchos\*](platform-support/apple-watchos.md)
|
||||||
|
@ -216,6 +216,7 @@ host tools.
|
|||||||
|
|
||||||
target | std | host | notes
|
target | std | host | notes
|
||||||
-------|:---:|:----:|-------
|
-------|:---:|:----:|-------
|
||||||
|
[`arm64e-apple-ios`](platform-support/arm64e-apple-ios.md) | ✓ | | ARM64e Apple iOS
|
||||||
`aarch64-apple-ios-macabi` | ? | | Apple Catalyst on ARM64
|
`aarch64-apple-ios-macabi` | ? | | Apple Catalyst on ARM64
|
||||||
[`aarch64-apple-tvos`](platform-support/apple-tvos.md) | ? | | ARM64 tvOS
|
[`aarch64-apple-tvos`](platform-support/apple-tvos.md) | ? | | ARM64 tvOS
|
||||||
[`aarch64-apple-tvos-sim`](platform-support/apple-tvos.md) | ? | | ARM64 tvOS Simulator
|
[`aarch64-apple-tvos-sim`](platform-support/apple-tvos.md) | ? | | ARM64 tvOS Simulator
|
||||||
|
37
src/doc/rustc/src/platform-support/arm64e-apple-ios.md
Normal file
37
src/doc/rustc/src/platform-support/arm64e-apple-ios.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# `arm64e-apple-ios`
|
||||||
|
|
||||||
|
**Tier: 3**
|
||||||
|
|
||||||
|
ARM64e iOS (12.0+)
|
||||||
|
|
||||||
|
## Target maintainers
|
||||||
|
|
||||||
|
- Artyom Tetyukhin ([@arttet](https://github.com/https://github.com/arttet))
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
These targets only support cross-compilation.
|
||||||
|
The targets do support `std`.
|
||||||
|
|
||||||
|
## Building the target
|
||||||
|
|
||||||
|
You can build Rust with support for the targets by adding it to the `target` list in `config.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[build]
|
||||||
|
target = [ "arm64e-apple-ios" ]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building Rust programs
|
||||||
|
|
||||||
|
Rust does not yet ship pre-compiled artifacts for this target.
|
||||||
|
To compile for this target, you will need to build Rust with the target enabled (see [Building the target](#building-the-target) above).
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
The target does support running binaries on iOS platforms with `arm64e` architecture.
|
||||||
|
|
||||||
|
## Cross-compilation toolchains and C code
|
||||||
|
|
||||||
|
The targets do support `C` code.
|
||||||
|
To build compatible `C` code, you have to use XCode with the same compiler and flags.
|
@ -51,6 +51,7 @@ static HOSTS: &[&str] = &[
|
|||||||
static TARGETS: &[&str] = &[
|
static TARGETS: &[&str] = &[
|
||||||
"aarch64-apple-darwin",
|
"aarch64-apple-darwin",
|
||||||
"aarch64-apple-ios",
|
"aarch64-apple-ios",
|
||||||
|
"arm64e-apple-ios",
|
||||||
"aarch64-apple-ios-sim",
|
"aarch64-apple-ios-sim",
|
||||||
"aarch64-unknown-fuchsia",
|
"aarch64-unknown-fuchsia",
|
||||||
"aarch64-linux-android",
|
"aarch64-linux-android",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user