apple-sdk_27: init at 27.0 (#564039)

This commit is contained in:
Randy Eckenrode
2026-09-18 10:43:55 +00:00
committed by GitHub
19 changed files with 1191 additions and 4 deletions

View File

@@ -121,7 +121,8 @@ Generally, only the last SDK release for a major version is packaged.
|---------------|-------------|------------------------------|
| 15.015.4 | 14.4 | `apple-sdk_14` / `apple-sdk` |
| 16.0 | 15.0 | `apple-sdk_15` |
| 26.0+ | 26.0+ | `apple-sdk_26`, etc |
| 26.0 | 26.0 | `apple-sdk_26` |
| 27.0+ | 27.0+ | `apple-sdk_27`, etc |
#### Darwin Default SDK versions {#sec-darwin-troubleshooting-darwin-defaults}

View File

@@ -22,5 +22,13 @@
],
"version": "26.5",
"hash": "sha256-IkDNtiO7PP4GI6OszCNWE1Xb4iepCUKwQHYUyc9NgNA="
},
"27": {
"urls": [
"https://swcdn.apple.com/content/downloads/58/48/082-83364-A_KCEBOO2NJS/0d2rj4y5ucjlkgcvqt6f6a4pergug5tu2b/CLTools_macOSNMOS_SDK.pkg",
"https://web.archive.org/web/20260910221111/https://swcdn.apple.com/content/downloads/58/48/082-83364-A_KCEBOO2NJS/0d2rj4y5ucjlkgcvqt6f6a4pergug5tu2b/CLTools_macOSNMOS_SDK.pkg"
],
"version": "27.0",
"hash": "sha256-qTDE8wu3pfk21WtgboKHYH/MiJnC8gKpDeMyrRJZaP8="
}
}

View File

@@ -100,6 +100,7 @@ stdenvNoCC.mkDerivation (
passthru = {
sdkroot = finalAttrs.finalPackage + "/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk";
tests = callPackage ./tests { };
};
__structuredAttrs = true;

View File

@@ -0,0 +1,10 @@
#include <math.h>
#include <stdio.h>
int main() {
if (@available(macOS 15, *)) {
printf("%f\n", (double) __sqrtf16(2));
} else {
printf(":(\n");
}
}

View File

@@ -0,0 +1,2 @@
project('apple-sdk_15-test', 'objc')
executable('apple-sdk_15-test', 'apple-sdk_15-test.m', install : true)

View File

@@ -0,0 +1,21 @@
#include <stdio.h>
#include <spawn.h>
int main(int argc, char** argv, char** env) {
if (@available(macOS 26, *)) {
int ret;
pid_t pid;
posix_spawn_file_actions_t actions;
if ((ret = posix_spawn_file_actions_init(&actions))) {
printf("cannot create file_actions\n");
}
if ((ret = posix_spawn_file_actions_addchdir(&actions, "/tmp"))) {
printf("cannot add_chdir\n");
}
if ((ret = posix_spawnp(&pid, "pwd", &actions, NULL, argv, env))) {
printf("cannot spawn\n");
}
} else {
printf(":(\n");
}
}

View File

@@ -0,0 +1,2 @@
project('apple-sdk_26-test', 'objc')
executable('apple-sdk_26-test', 'apple-sdk_26-test.m', install : true)

View File

@@ -0,0 +1,15 @@
#include <sys/unistd.h>
#include <stdio.h>
int main() {
if (@available(macOS 27, *)) {
int ret = dup3(1, 3, 0);
if (ret < 0) {
printf("dup3(1,3,0) failed with error\n");
return -1;
}
dprintf(3, ":)\n");
} else {
printf(":(\n");
}
}

View File

@@ -0,0 +1,2 @@
project('apple-sdk_27-test', 'objc')
executable('apple-sdk_27-test', 'apple-sdk_27-test.m', install : true)

View File

@@ -0,0 +1,61 @@
{
lib,
stdenv,
ninja,
meson,
apple-sdk_15,
apple-sdk_26,
apple-sdk_27,
}:
{
apple-sdk_15 = stdenv.mkDerivation {
name = "apple-sdk_15-test";
src = ./15;
nativeBuildInputs = [
meson
ninja
];
buildInputs = [
apple-sdk_15
];
meta.mainProgram = "apple-sdk_15-test";
};
apple-sdk_26 = stdenv.mkDerivation {
name = "apple-sdk_26-test";
src = ./26;
nativeBuildInputs = [
meson
ninja
];
buildInputs = [
apple-sdk_26
];
meta.mainProgram = "apple-sdk_26-test";
};
apple-sdk_27 = stdenv.mkDerivation {
name = "apple-sdk_27-test";
src = ./27;
nativeBuildInputs = [
meson
ninja
];
buildInputs = [
apple-sdk_27
];
meta.mainProgram = "apple-sdk_27-test";
};
}

View File

@@ -0,0 +1,205 @@
--- llvm/include/llvm/BinaryFormat/MachO.h
+++ llvm/include/llvm/BinaryFormat/MachO.h
@@ -1641,6 +1641,7 @@
CPU_SUBTYPE_ARM64_ALL = 0,
CPU_SUBTYPE_ARM64_V8 = 1,
CPU_SUBTYPE_ARM64E = 2,
+ CPU_SUBTYPE_ARM64E_X1 = 12,
};
enum CPUSubTypeARM64_32 { CPU_SUBTYPE_ARM64_32_V8 = 1 };
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -147,6 +147,7 @@
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64e_x1,
AArch64SubArch_arm64ec,
KalimbaSubArch_v3,
@@ -1008,6 +1009,11 @@
getSubArch() == Triple::AArch64SubArch_arm64e;
}
+ bool isArm64e_x1() const {
+ return getArch() == Triple::aarch64 &&
+ getSubArch() == Triple::AArch64SubArch_arm64e_x1;
+ }
+
/// Tests whether the target is X32.
bool isX32() const {
EnvironmentType Env = getEnvironment();
--- llvm/include/llvm/TextAPI/Architecture.def
+++ llvm/include/llvm/TextAPI/Architecture.def
@@ -37,7 +37,7 @@
///
ARCHINFO(arm64, arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)
ARCHINFO(arm64e, arm64e, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E, 64)
-
+ARCHINFO(arm64e_x1, arm64e.x1, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E_X1, 64)
///
/// ARM64_32 architectures sorted by cpu sub type id
--- llvm/lib/BinaryFormat/MachO.cpp
+++ llvm/lib/BinaryFormat/MachO.cpp
@@ -60,6 +60,8 @@
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
if (T.isArm64e())
return MachO::CPU_SUBTYPE_ARM64E;
+ if (T.isArm64e_x1())
+ return MachO::CPU_SUBTYPE_ARM64E_X1;
return MachO::CPU_SUBTYPE_ARM64_ALL;
}
--- llvm/lib/Object/MachOObjectFile.cpp
+++ llvm/lib/Object/MachOObjectFile.cpp
@@ -2807,6 +2807,12 @@
if (ArchFlag)
*ArchFlag = "arm64e";
return Triple("arm64e-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ if (McpuDefault)
+ *McpuDefault = "apple-a20";
+ if (ArchFlag)
+ *ArchFlag = "arm64e.x1";
+ return Triple("arm64e.x1-apple-darwin");
default:
return Triple();
}
--- llvm/lib/TargetParser/Triple.cpp
+++ llvm/lib/TargetParser/Triple.cpp
@@ -114,6 +114,8 @@
return "arm64ec";
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
+ if (SubArch == AArch64SubArch_arm64e_x1)
+ return "arm64e.x1";
break;
default:
break;
@@ -515,6 +517,7 @@
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
+ .Case("arm64e.x1", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
@@ -720,6 +723,8 @@
if (SubArchName == "arm64e")
return Triple::AArch64SubArch_arm64e;
+ if (SubArchName == "arm64e.x1")
+ return Triple::AArch64SubArch_arm64e_x1;
if (SubArchName == "arm64ec")
return Triple::AArch64SubArch_arm64ec;
--- llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
+++ llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
@@ -13,6 +13,11 @@
# RUN: llvm-readobj -h %t.arm64e \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E (0x2)"
+## Check subtype Arm64E.X1:
+# RUN: yaml2obj %s -o %t.arm64e.x1 -DSUBTYPE=0xC
+# RUN: llvm-readobj -h %t.arm64e.x1 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e.x1 --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E_X1 (0xC)"
+
# ARM64:File: [[FILE]]
# ARM64-NEXT:Format: Mach-O arm64
# ARM64-NEXT:Arch: aarch64
--- llvm/tools/llvm-objdump/MachODump.cpp
+++ llvm/tools/llvm-objdump/MachODump.cpp
@@ -2323,6 +2323,10 @@
outs() << " cputype CPU_TYPE_ARM64\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM64E\n";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " cputype CPU_TYPE_ARM64\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM64E_X1\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8213,6 +8217,9 @@
case MachO::CPU_SUBTYPE_ARM64E:
outs() << " E";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " E.X1";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
--- llvm/tools/llvm-readobj/MachODumper.cpp
+++ llvm/tools/llvm-readobj/MachODumper.cpp
@@ -170,6 +170,7 @@
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E_X1),
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = {
--- llvm/unittests/BinaryFormat/MachOTest.cpp
+++ llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -57,6 +57,7 @@
CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
+ CHECK_CPUTYPE("arm64e.x1-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
{
@@ -98,6 +99,7 @@
CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
+ CHECK_CPUSUBTYPE("arm64e.x1-apple-darwin", MachO::CPU_SUBTYPE_ARM64E_X1);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
{
--- /dev/null
+++ lld/test/MachO/arm64-x1.s
@@ -0,0 +1,20 @@
+# REQUIRES: aarch64
+
+## Test that arm64.x1-macos is ignored instead of causing an error.
+## linked re-exported dylibs that only declare arm64e-macos targets, even if targeting arm64.
+# arm64 and arm64e are ABI compatible (same CPU type), and ld64 accepts this.
+
+# RUN: rm -rf %t; split-file --no-leading-lines %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t/test.o /dev/null
+
+# RUN: %no-arg-lld -syslibroot %t/sdk -lSystem -dylib -arch arm64 \
+# RUN: -platform_version macos 15 26 %t/test.o -o /dev/null
+
+#--- sdk/usr/lib/libSystem.tbd
+--- !tapi-tbd
+tbd-version: 4
+targets: [ arm64-macos, arm64e.x1-macos ]
+install-name: '/usr/lib/libSystem.dylib'
+current-version: 0001.001.1
+...
--- /dev/null
+++ llvm/test/tools/llvm-readobj/macho-arm64e_x1.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -h %t.o | FileCheck %s
+
+# CHECK: Magic: Magic64 (0xFEEDFACF)
+# CHECK: CpuType: Arm64 (0x100000C)
+# CHECK: CpuSubType: CPU_SUBTYPE_ARM64E_X1 (0xC)
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x0000000C
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00000000
+ reserved: 0x00000000

View File

@@ -0,0 +1,205 @@
--- llvm/include/llvm/BinaryFormat/MachO.h
+++ llvm/include/llvm/BinaryFormat/MachO.h
@@ -1641,6 +1641,7 @@
CPU_SUBTYPE_ARM64_ALL = 0,
CPU_SUBTYPE_ARM64_V8 = 1,
CPU_SUBTYPE_ARM64E = 2,
+ CPU_SUBTYPE_ARM64E_X1 = 12,
};
enum CPUSubTypeARM64_32 { CPU_SUBTYPE_ARM64_32_V8 = 1 };
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -147,6 +147,7 @@
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64e_x1,
AArch64SubArch_arm64ec,
KalimbaSubArch_v3,
@@ -1042,6 +1043,11 @@
getSubArch() == Triple::AArch64SubArch_arm64e;
}
+ bool isArm64e_x1() const {
+ return getArch() == Triple::aarch64 &&
+ getSubArch() == Triple::AArch64SubArch_arm64e_x1;
+ }
+
/// Tests whether the target is X32.
bool isX32() const {
EnvironmentType Env = getEnvironment();
--- llvm/include/llvm/TextAPI/Architecture.def
+++ llvm/include/llvm/TextAPI/Architecture.def
@@ -37,7 +37,7 @@
///
ARCHINFO(arm64, arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)
ARCHINFO(arm64e, arm64e, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E, 64)
-
+ARCHINFO(arm64e_x1, arm64e.x1, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E_X1, 64)
///
/// ARM64_32 architectures sorted by cpu sub type id
--- llvm/lib/BinaryFormat/MachO.cpp
+++ llvm/lib/BinaryFormat/MachO.cpp
@@ -60,6 +60,8 @@
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
if (T.isArm64e())
return MachO::CPU_SUBTYPE_ARM64E;
+ if (T.isArm64e_x1())
+ return MachO::CPU_SUBTYPE_ARM64E_X1;
return MachO::CPU_SUBTYPE_ARM64_ALL;
}
--- llvm/lib/Object/MachOObjectFile.cpp
+++ llvm/lib/Object/MachOObjectFile.cpp
@@ -2807,6 +2807,12 @@
if (ArchFlag)
*ArchFlag = "arm64e";
return Triple("arm64e-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ if (McpuDefault)
+ *McpuDefault = "apple-a20";
+ if (ArchFlag)
+ *ArchFlag = "arm64e.x1";
+ return Triple("arm64e.x1-apple-darwin");
default:
return Triple();
}
--- llvm/lib/TargetParser/Triple.cpp
+++ llvm/lib/TargetParser/Triple.cpp
@@ -114,6 +114,8 @@
return "arm64ec";
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
+ if (SubArch == AArch64SubArch_arm64e_x1)
+ return "arm64e.x1";
break;
case Triple::dxil:
switch (SubArch) {
@@ -549,6 +551,7 @@
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
+ .Case("arm64e.x1", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
@@ -764,6 +767,8 @@
if (SubArchName == "arm64e")
return Triple::AArch64SubArch_arm64e;
+ if (SubArchName == "arm64e.x1")
+ return Triple::AArch64SubArch_arm64e_x1;
if (SubArchName == "arm64ec")
return Triple::AArch64SubArch_arm64ec;
--- llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
+++ llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
@@ -13,6 +13,11 @@
# RUN: llvm-readobj -h %t.arm64e \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E (0x2)"
+## Check subtype Arm64E.X1:
+# RUN: yaml2obj %s -o %t.arm64e.x1 -DSUBTYPE=0xC
+# RUN: llvm-readobj -h %t.arm64e.x1 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e.x1 --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E_X1 (0xC)"
+
# ARM64:File: [[FILE]]
# ARM64-NEXT:Format: Mach-O arm64
# ARM64-NEXT:Arch: aarch64
--- llvm/tools/llvm-objdump/MachODump.cpp
+++ llvm/tools/llvm-objdump/MachODump.cpp
@@ -2323,6 +2323,10 @@
outs() << " cputype CPU_TYPE_ARM64\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM64E\n";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " cputype CPU_TYPE_ARM64\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM64E_X1\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8325,6 +8329,9 @@
case MachO::CPU_SUBTYPE_ARM64E:
outs() << " E";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " E.X1";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
--- llvm/tools/llvm-readobj/MachODumper.cpp
+++ llvm/tools/llvm-readobj/MachODumper.cpp
@@ -170,6 +170,7 @@
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E_X1),
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = {
--- llvm/unittests/BinaryFormat/MachOTest.cpp
+++ llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -66,6 +66,7 @@
CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
+ CHECK_CPUTYPE("arm64e.x1-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
{
@@ -107,6 +108,7 @@
CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
+ CHECK_CPUSUBTYPE("arm64e.x1-apple-darwin", MachO::CPU_SUBTYPE_ARM64E_X1);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
{
--- /dev/null
+++ lld/test/MachO/arm64-x1.s
@@ -0,0 +1,20 @@
+# REQUIRES: aarch64
+
+## Test that arm64.x1-macos is ignored instead of causing an error.
+## linked re-exported dylibs that only declare arm64e-macos targets, even if targeting arm64.
+# arm64 and arm64e are ABI compatible (same CPU type), and ld64 accepts this.
+
+# RUN: rm -rf %t; split-file --no-leading-lines %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t/test.o /dev/null
+
+# RUN: %no-arg-lld -syslibroot %t/sdk -lSystem -dylib -arch arm64 \
+# RUN: -platform_version macos 15 26 %t/test.o -o /dev/null
+
+#--- sdk/usr/lib/libSystem.tbd
+--- !tapi-tbd
+tbd-version: 4
+targets: [ arm64-macos, arm64e.x1-macos ]
+install-name: '/usr/lib/libSystem.dylib'
+current-version: 0001.001.1
+...
--- /dev/null
+++ llvm/test/tools/llvm-readobj/macho-arm64e_x1.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -h %t.o | FileCheck %s
+
+# CHECK: Magic: Magic64 (0xFEEDFACF)
+# CHECK: CpuType: Arm64 (0x100000C)
+# CHECK: CpuSubType: CPU_SUBTYPE_ARM64E_X1 (0xC)
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x0000000C
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00000000
+ reserved: 0x00000000

View File

@@ -0,0 +1,205 @@
--- llvm/include/llvm/BinaryFormat/MachO.h
+++ llvm/include/llvm/BinaryFormat/MachO.h
@@ -1641,6 +1641,7 @@
CPU_SUBTYPE_ARM64_ALL = 0,
CPU_SUBTYPE_ARM64_V8 = 1,
CPU_SUBTYPE_ARM64E = 2,
+ CPU_SUBTYPE_ARM64E_X1 = 12,
// arm64e uses the capability bits to encode ptrauth ABI information.
// Bit 63 marks the binary as Versioned.
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -146,6 +146,7 @@
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64e_x1,
AArch64SubArch_arm64ec,
KalimbaSubArch_v3,
@@ -1077,6 +1077,11 @@
getSubArch() == Triple::AArch64SubArch_arm64e;
}
+ bool isArm64e_x1() const {
+ return getArch() == Triple::aarch64 &&
+ getSubArch() == Triple::AArch64SubArch_arm64e_x1;
+ }
+
// Tests whether the target is N32.
bool isABIN32() const {
EnvironmentType Env = getEnvironment();
--- llvm/include/llvm/TextAPI/Architecture.def
+++ llvm/include/llvm/TextAPI/Architecture.def
@@ -37,7 +37,7 @@
///
ARCHINFO(arm64, arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)
ARCHINFO(arm64e, arm64e, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E, 64)
-
+ARCHINFO(arm64e_x1, arm64e.x1, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E_X1, 64)
///
/// ARM64_32 architectures sorted by cpu sub type id
--- llvm/lib/BinaryFormat/MachO.cpp
+++ llvm/lib/BinaryFormat/MachO.cpp
@@ -60,6 +60,8 @@
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
if (T.isArm64e())
return MachO::CPU_SUBTYPE_ARM64E;
+ if (T.isArm64e_x1())
+ return MachO::CPU_SUBTYPE_ARM64E_X1;
return MachO::CPU_SUBTYPE_ARM64_ALL;
}
--- llvm/lib/Object/MachOObjectFile.cpp
+++ llvm/lib/Object/MachOObjectFile.cpp
@@ -2806,6 +2806,12 @@
if (ArchFlag)
*ArchFlag = "arm64e";
return Triple("arm64e-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ if (McpuDefault)
+ *McpuDefault = "apple-a20";
+ if (ArchFlag)
+ *ArchFlag = "arm64e.x1";
+ return Triple("arm64e.x1-apple-darwin");
default:
return Triple();
}
--- llvm/lib/TargetParser/Triple.cpp
+++ llvm/lib/TargetParser/Triple.cpp
@@ -114,6 +191,8 @@
return "arm64ec";
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
+ if (SubArch == AArch64SubArch_arm64e_x1)
+ return "arm64e.x1";
break;
case Triple::spirv:
switch (SubArch) {
@@ -574,6 +576,7 @@
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
+ .Case("arm64e.x1", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
@@ -793,6 +796,8 @@
if (SubArchName == "arm64e")
return Triple::AArch64SubArch_arm64e;
+ if (SubArchName == "arm64e.x1")
+ return Triple::AArch64SubArch_arm64e_x1;
if (SubArchName == "arm64ec")
return Triple::AArch64SubArch_arm64ec;
--- llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
+++ llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
@@ -13,6 +13,11 @@
# RUN: llvm-readobj -h %t.arm64e \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E (0x2)"
+## Check subtype Arm64E.X1:
+# RUN: yaml2obj %s -o %t.arm64e.x1 -DSUBTYPE=0xC
+# RUN: llvm-readobj -h %t.arm64e.x1 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e.x1 --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E_X1 (0xC)"
+
# ARM64:File: [[FILE]]
# ARM64-NEXT:Format: Mach-O arm64
# ARM64-NEXT:Arch: aarch64
--- llvm/tools/llvm-objdump/MachODump.cpp
+++ llvm/tools/llvm-objdump/MachODump.cpp
@@ -2323,6 +2323,10 @@
outs() << " cputype CPU_TYPE_ARM64\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM64E\n";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " cputype CPU_TYPE_ARM64\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM64E_X1\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8337,6 +8341,9 @@
case MachO::CPU_SUBTYPE_ARM64E:
outs() << " E";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " E.X1";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
--- llvm/tools/llvm-readobj/MachODumper.cpp
+++ llvm/tools/llvm-readobj/MachODumper.cpp
@@ -170,6 +170,7 @@
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E_X1),
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = {
--- llvm/unittests/BinaryFormat/MachOTest.cpp
+++ llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -66,6 +66,7 @@
CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
+ CHECK_CPUTYPE("arm64e.x1-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
{
@@ -107,6 +108,7 @@
CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
+ CHECK_CPUSUBTYPE("arm64e.x1-apple-darwin", MachO::CPU_SUBTYPE_ARM64E_X1);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
{
--- /dev/null
+++ lld/test/MachO/arm64-x1.s
@@ -0,0 +1,20 @@
+# REQUIRES: aarch64
+
+## Test that arm64.x1-macos is ignored instead of causing an error.
+## linked re-exported dylibs that only declare arm64e-macos targets, even if targeting arm64.
+# arm64 and arm64e are ABI compatible (same CPU type), and ld64 accepts this.
+
+# RUN: rm -rf %t; split-file --no-leading-lines %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t/test.o /dev/null
+
+# RUN: %no-arg-lld -syslibroot %t/sdk -lSystem -dylib -arch arm64 \
+# RUN: -platform_version macos 15 26 %t/test.o -o /dev/null
+
+#--- sdk/usr/lib/libSystem.tbd
+--- !tapi-tbd
+tbd-version: 4
+targets: [ arm64-macos, arm64e.x1-macos ]
+install-name: '/usr/lib/libSystem.dylib'
+current-version: 0001.001.1
+...
--- /dev/null
+++ llvm/test/tools/llvm-readobj/macho-arm64e_x1.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -h %t.o | FileCheck %s
+
+# CHECK: Magic: Magic64 (0xFEEDFACF)
+# CHECK: CpuType: Arm64 (0x100000C)
+# CHECK: CpuSubType: CPU_SUBTYPE_ARM64E_X1 (0xC)
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x0000000C
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00000000
+ reserved: 0x00000000

View File

@@ -0,0 +1,205 @@
--- llvm/include/llvm/BinaryFormat/MachO.h
+++ llvm/include/llvm/BinaryFormat/MachO.h
@@ -1715,6 +1715,7 @@
CPU_SUBTYPE_ARM64_ALL = 0,
CPU_SUBTYPE_ARM64_V8 = 1,
CPU_SUBTYPE_ARM64E = 2,
+ CPU_SUBTYPE_ARM64E_X1 = 12,
// arm64e uses the capability bits to encode ptrauth ABI information.
// Bit 63 marks the binary as Versioned.
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -157,6 +157,7 @@
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64e_x1,
AArch64SubArch_arm64ec,
AArch64SubArch_lfi,
@@ -1220,6 +1221,11 @@
getSubArch() == Triple::AArch64SubArch_arm64e;
}
+ bool isArm64e_x1() const {
+ return getArch() == Triple::aarch64 &&
+ getSubArch() == Triple::AArch64SubArch_arm64e_x1;
+ }
+
// Tests whether the target is N32.
bool isABIN32() const {
EnvironmentType Env = getEnvironment();
--- llvm/include/llvm/TextAPI/Architecture.def
+++ llvm/include/llvm/TextAPI/Architecture.def
@@ -39,7 +39,7 @@
///
ARCHINFO(arm64, arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)
ARCHINFO(arm64e, arm64e, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E, 64)
-
+ARCHINFO(arm64e_x1, arm64e.x1, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E_X1, 64)
///
/// ARM64_32 architectures sorted by cpu sub type id
--- llvm/lib/BinaryFormat/MachO.cpp
+++ llvm/lib/BinaryFormat/MachO.cpp
@@ -66,6 +66,8 @@
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
if (T.isArm64e())
return MachO::CPU_SUBTYPE_ARM64E;
+ if (T.isArm64e_x1())
+ return MachO::CPU_SUBTYPE_ARM64E_X1;
return MachO::CPU_SUBTYPE_ARM64_ALL;
}
--- llvm/lib/Object/MachOObjectFile.cpp
+++ llvm/lib/Object/MachOObjectFile.cpp
@@ -2919,6 +2919,12 @@
if (ArchFlag)
*ArchFlag = "arm64e";
return Triple("arm64e-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ if (McpuDefault)
+ *McpuDefault = "apple-a20";
+ if (ArchFlag)
+ *ArchFlag = "arm64e.x1";
+ return Triple("arm64e.x1-apple-darwin");
default:
return Triple();
}
--- llvm/lib/TargetParser/Triple.cpp
+++ llvm/lib/TargetParser/Triple.cpp
@@ -191,6 +191,8 @@
return "arm64ec";
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
+ if (SubArch == AArch64SubArch_arm64e_x1)
+ return "arm64e.x1";
if (SubArch == AArch64SubArch_lfi)
return "aarch64_lfi";
break;
@@ -612,6 +614,7 @@
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
+ .Case("arm64e.x1", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
@@ -739,6 +742,8 @@
if (SubArchName == "arm64e")
return Triple::AArch64SubArch_arm64e;
+ if (SubArchName == "arm64e.x1")
+ return Triple::AArch64SubArch_arm64e_x1;
if (SubArchName == "arm64ec")
return Triple::AArch64SubArch_arm64ec;
--- llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
+++ llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
@@ -13,6 +13,11 @@
# RUN: llvm-readobj -h %t.arm64e \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E (0x2)"
+## Check subtype Arm64E.X1:
+# RUN: yaml2obj %s -o %t.arm64e.x1 -DSUBTYPE=0xC
+# RUN: llvm-readobj -h %t.arm64e.x1 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e.x1 --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E_X1 (0xC)"
+
# ARM64:File: [[FILE]]
# ARM64-NEXT:Format: Mach-O arm64
# ARM64-NEXT:Arch: aarch64
--- llvm/tools/llvm-objdump/MachODump.cpp
+++ llvm/tools/llvm-objdump/MachODump.cpp
@@ -2344,6 +2344,10 @@
outs() << " cputype CPU_TYPE_ARM64\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM64E\n";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " cputype CPU_TYPE_ARM64\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM64E_X1\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8472,6 +8476,9 @@
case MachO::CPU_SUBTYPE_ARM64E:
outs() << " E";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " E.X1";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
--- llvm/tools/llvm-readobj/MachODumper.cpp
+++ llvm/tools/llvm-readobj/MachODumper.cpp
@@ -190,6 +190,7 @@
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E_X1),
};
constexpr auto MachOHeaderCpuSubtypesARM64 =
BUILD_ENUM_STRINGS(MachOHeaderCpuSubtypesARM64Defs);
--- llvm/unittests/BinaryFormat/MachOTest.cpp
+++ llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -66,6 +66,7 @@
CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
+ CHECK_CPUTYPE("arm64e.x1-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
{
@@ -107,6 +108,7 @@
CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
+ CHECK_CPUSUBTYPE("arm64e.x1-apple-darwin", MachO::CPU_SUBTYPE_ARM64E_X1);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
CHECK_CPUSUBTYPE("armv8m.main-apple-darwin", MachO::CPU_SUBTYPE_ARM_V8M_MAIN);
CHECK_CPUSUBTYPE("armv8m.base-apple-darwin", MachO::CPU_SUBTYPE_ARM_V8M_BASE);
--- /dev/null
+++ lld/test/MachO/arm64-x1.s
@@ -0,0 +1,20 @@
+# REQUIRES: aarch64
+
+## Test that arm64.x1-macos is ignored instead of causing an error.
+## linked re-exported dylibs that only declare arm64e-macos targets, even if targeting arm64.
+# arm64 and arm64e are ABI compatible (same CPU type), and ld64 accepts this.
+
+# RUN: rm -rf %t; split-file --no-leading-lines %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t/test.o /dev/null
+
+# RUN: %no-arg-lld -syslibroot %t/sdk -lSystem -dylib -arch arm64 \
+# RUN: -platform_version macos 15 26 %t/test.o -o /dev/null
+
+#--- sdk/usr/lib/libSystem.tbd
+--- !tapi-tbd
+tbd-version: 4
+targets: [ arm64-macos, arm64e.x1-macos ]
+install-name: '/usr/lib/libSystem.dylib'
+current-version: 0001.001.1
+...
--- /dev/null
+++ llvm/test/tools/llvm-readobj/macho-arm64e_x1.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -h %t.o | FileCheck %s
+
+# CHECK: Magic: Magic64 (0xFEEDFACF)
+# CHECK: CpuType: Arm64 (0x100000C)
+# CHECK: CpuSubType: CPU_SUBTYPE_ARM64E_X1 (0xC)
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x0000000C
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00000000
+ reserved: 0x00000000

View File

@@ -263,6 +263,21 @@ stdenv.mkDerivation (
# This patch is a backport of the target parsing changes in LLVM 23, which fixes the problem.
# Hopefully, Apple does not change the version number scheme again any time soon.
(getVersionFile "llvm/backport-darwin-triple-parsing.patch")
]
++ lib.optionals (lib.versionOlder release_version "22") [
# Needed to add arm64e.x1 support, as the enum name differs from the architecture name
(fetchpatch {
name = "llvm-textapi-separate-arch-name-enum-label.patch";
url = "https://github.com/llvm/llvm-project/commit/477a65a051ce151895193f8dede1262fdc251132.patch";
stripLen = 1;
hash = "sha256-XXteX2zK5TzFQX+XhLzUtikY4PkCWF1f8l5MshelzX4=";
})
]
++ lib.optionals (lib.versionOlder release_version "23") [
# Needed to link with the macOS 27 sdk, as it has libraries linked for arm64e.x1
# a new arm64 subtype that gives more pointer authentication machinery.
# Vendored backport of the patch for LLVM 23
(getVersionFile "llvm/backport-minimal-arm64e_x1-support.patch")
];
nativeBuildInputs = [

View File

@@ -52,6 +52,27 @@
path = ../21;
}
];
"llvm/backport-minimal-arm64e_x1-support.patch" = [
{
after = "18";
before = "19";
path = ../18;
}
{
after = "19";
before = "20";
path = ../19;
}
{
after = "20";
before = "22";
path = ../20;
}
{
after = "22";
path = ../22;
}
];
"llvm/gnu-install-dirs.patch" = [
{
after = "23";

View File

@@ -50,6 +50,8 @@ in
"lldb/backport-ParseTrieEntries-fixes.patch" = [ { path = ./patches; } ];
# Update backport of the Darwin triple changes for macOS 27.
"llvm/backport-darwin-triple-parsing.patch" = [ { path = ./patches; } ];
# Backport support for arm64e.x1, the new cpu subtype for A20 and M6
"llvm/backport-minimal-arm64e_x1-support.patch" = [ { path = ./patches; } ];
};
}).overrideScope
(

View File

@@ -0,0 +1,205 @@
--- llvm/include/llvm/BinaryFormat/MachO.h
+++ llvm/include/llvm/BinaryFormat/MachO.h
@@ -1643,6 +1643,7 @@
CPU_SUBTYPE_ARM64_ALL = 0,
CPU_SUBTYPE_ARM64_V8 = 1,
CPU_SUBTYPE_ARM64E = 2,
+ CPU_SUBTYPE_ARM64E_X1 = 12,
// arm64 reserves bits in the high byte for subtype-specific flags.
// On arm64e, the 6 low bits represent the ptrauth ABI version.
--- llvm/include/llvm/TargetParser/Triple.h
+++ llvm/include/llvm/TargetParser/Triple.h
@@ -147,6 +147,7 @@
ARMSubArch_v4t,
AArch64SubArch_arm64e,
+ AArch64SubArch_arm64e_x1,
AArch64SubArch_arm64ec,
KalimbaSubArch_v3,
@@ -1048,6 +1049,11 @@
getSubArch() == Triple::AArch64SubArch_arm64e;
}
+ bool isArm64e_x1() const {
+ return getArch() == Triple::aarch64 &&
+ getSubArch() == Triple::AArch64SubArch_arm64e_x1;
+ }
+
/// Tests whether the target is X32.
bool isX32() const {
EnvironmentType Env = getEnvironment();
--- llvm/include/llvm/TextAPI/Architecture.def
+++ llvm/include/llvm/TextAPI/Architecture.def
@@ -37,7 +37,7 @@
///
ARCHINFO(arm64, arm64, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64_ALL, 64)
ARCHINFO(arm64e, arm64e, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E, 64)
-
+ARCHINFO(arm64e_x1, arm64e.x1, MachO::CPU_TYPE_ARM64, MachO::CPU_SUBTYPE_ARM64E_X1, 64)
///
/// ARM64_32 architectures sorted by cpu sub type id
--- llvm/lib/BinaryFormat/MachO.cpp
+++ llvm/lib/BinaryFormat/MachO.cpp
@@ -60,6 +60,8 @@
return (MachO::CPUSubTypeARM64)MachO::CPU_SUBTYPE_ARM64_32_V8;
if (T.isArm64e())
return MachO::CPU_SUBTYPE_ARM64E;
+ if (T.isArm64e_x1())
+ return MachO::CPU_SUBTYPE_ARM64E_X1;
return MachO::CPU_SUBTYPE_ARM64_ALL;
}
--- llvm/lib/Object/MachOObjectFile.cpp
+++ llvm/lib/Object/MachOObjectFile.cpp
@@ -2810,6 +2810,12 @@
if (ArchFlag)
*ArchFlag = "arm64e";
return Triple("arm64e-apple-darwin");
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ if (McpuDefault)
+ *McpuDefault = "apple-a20";
+ if (ArchFlag)
+ *ArchFlag = "arm64e.x1";
+ return Triple("arm64e.x1-apple-darwin");
default:
return Triple();
}
--- llvm/lib/TargetParser/Triple.cpp
+++ llvm/lib/TargetParser/Triple.cpp
@@ -114,6 +114,8 @@
return "arm64ec";
if (SubArch == AArch64SubArch_arm64e)
return "arm64e";
+ if (SubArch == AArch64SubArch_arm64e_x1)
+ return "arm64e.x1";
break;
case Triple::dxil:
switch (SubArch) {
@@ -550,6 +552,7 @@
.Case("arm64", Triple::aarch64)
.Case("arm64_32", Triple::aarch64_32)
.Case("arm64e", Triple::aarch64)
+ .Case("arm64e.x1", Triple::aarch64)
.Case("arm64ec", Triple::aarch64)
.Case("arm", Triple::arm)
.Case("armeb", Triple::armeb)
@@ -766,6 +769,8 @@
if (SubArchName == "arm64e")
return Triple::AArch64SubArch_arm64e;
+ if (SubArchName == "arm64e.x1")
+ return Triple::AArch64SubArch_arm64e_x1;
if (SubArchName == "arm64ec")
return Triple::AArch64SubArch_arm64ec;
--- llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
+++ llvm/test/tools/llvm-readobj/MachO/file-headers-arm64.test
@@ -13,6 +13,11 @@
# RUN: llvm-readobj -h %t.arm64e \
# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E (0x2)"
+## Check subtype Arm64E.X1:
+# RUN: yaml2obj %s -o %t.arm64e.x1 -DSUBTYPE=0xC
+# RUN: llvm-readobj -h %t.arm64e.x1 \
+# RUN: | FileCheck %s --strict-whitespace --match-full-lines -DFILE=%t.arm64e.x1 --check-prefix=ARM64 -DSUBTYPE="CPU_SUBTYPE_ARM64E_X1 (0xC)"
+
# ARM64:File: [[FILE]]
# ARM64-NEXT:Format: Mach-O arm64{{e?}}
# ARM64-NEXT:Arch: aarch64
--- llvm/tools/llvm-objdump/MachODump.cpp
+++ llvm/tools/llvm-objdump/MachODump.cpp
@@ -2323,6 +2323,10 @@
outs() << " cputype CPU_TYPE_ARM64\n";
outs() << " cpusubtype CPU_SUBTYPE_ARM64E\n";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " cputype CPU_TYPE_ARM64\n";
+ outs() << " cpusubtype CPU_SUBTYPE_ARM64E_X1\n";
+ break;
default:
printUnknownCPUType(cputype, cpusubtype);
break;
@@ -8333,6 +8337,9 @@
case MachO::CPU_SUBTYPE_ARM64E:
outs() << " E";
break;
+ case MachO::CPU_SUBTYPE_ARM64E_X1:
+ outs() << " E.X1";
+ break;
default:
outs() << format(" %10d", cpusubtype & ~MachO::CPU_SUBTYPE_MASK);
break;
--- llvm/tools/llvm-readobj/MachODumper.cpp
+++ llvm/tools/llvm-readobj/MachODumper.cpp
@@ -170,6 +170,7 @@
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_ALL),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64_V8),
LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E),
+ LLVM_READOBJ_ENUM_ENT(MachO, CPU_SUBTYPE_ARM64E_X1),
};
const EnumEntry<uint32_t> MachOHeaderCpuSubtypesSPARC[] = {
--- llvm/unittests/BinaryFormat/MachOTest.cpp
+++ llvm/unittests/BinaryFormat/MachOTest.cpp
@@ -66,6 +66,7 @@
CHECK_CPUTYPE("thumbv7-apple-darwin", MachO::CPU_TYPE_ARM);
CHECK_CPUTYPE("arm64-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64e-apple-darwin", MachO::CPU_TYPE_ARM64);
+ CHECK_CPUTYPE("arm64e.x1-apple-darwin", MachO::CPU_TYPE_ARM64);
CHECK_CPUTYPE("arm64_32-apple-darwin", MachO::CPU_TYPE_ARM64_32);
{
@@ -107,6 +108,7 @@
CHECK_CPUSUBTYPE("thumbv6-apple-darwin", MachO::CPU_SUBTYPE_ARM_V6);
CHECK_CPUSUBTYPE("arm64-apple-darwin", MachO::CPU_SUBTYPE_ARM64_ALL);
CHECK_CPUSUBTYPE("arm64e-apple-darwin", MachO::CPU_SUBTYPE_ARM64E);
+ CHECK_CPUSUBTYPE("arm64e.x1-apple-darwin", MachO::CPU_SUBTYPE_ARM64E_X1);
CHECK_CPUSUBTYPE("arm64_32-apple-darwin", MachO::CPU_SUBTYPE_ARM64_32_V8);
{
--- /dev/null
+++ lld/test/MachO/arm64-x1.s
@@ -0,0 +1,20 @@
+# REQUIRES: aarch64
+
+## Test that arm64.x1-macos is ignored instead of causing an error.
+## linked re-exported dylibs that only declare arm64e-macos targets, even if targeting arm64.
+# arm64 and arm64e are ABI compatible (same CPU type), and ld64 accepts this.
+
+# RUN: rm -rf %t; split-file --no-leading-lines %s %t
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-macos -o %t/test.o /dev/null
+
+# RUN: %no-arg-lld -syslibroot %t/sdk -lSystem -dylib -arch arm64 \
+# RUN: -platform_version macos 15 26 %t/test.o -o /dev/null
+
+#--- sdk/usr/lib/libSystem.tbd
+--- !tapi-tbd
+tbd-version: 4
+targets: [ arm64-macos, arm64e.x1-macos ]
+install-name: '/usr/lib/libSystem.dylib'
+current-version: 0001.001.1
+...
--- /dev/null
+++ llvm/test/tools/llvm-readobj/macho-arm64e_x1.test
@@ -0,0 +1,17 @@
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj -h %t.o | FileCheck %s
+
+# CHECK: Magic: Magic64 (0xFEEDFACF)
+# CHECK: CpuType: Arm64 (0x100000C)
+# CHECK: CpuSubType: CPU_SUBTYPE_ARM64E_X1 (0xC)
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x0100000C
+ cpusubtype: 0x0000000C
+ filetype: 0x00000001
+ ncmds: 0
+ sizeofcmds: 0
+ flags: 0x00000000
+ reserved: 0x00000000

View File

@@ -6771,9 +6771,10 @@ with pkgs;
### DEVELOPMENT / LIBRARIES / DARWIN SDKS
apple-sdk_14 = callPackage ../by-name/ap/apple-sdk/package.nix { darwinSdkMajorVersion = "14"; };
apple-sdk_15 = callPackage ../by-name/ap/apple-sdk/package.nix { darwinSdkMajorVersion = "15"; };
apple-sdk_26 = callPackage ../by-name/ap/apple-sdk/package.nix { darwinSdkMajorVersion = "26"; };
apple-sdk_14 = apple-sdk.override { darwinSdkMajorVersion = "14"; };
apple-sdk_15 = apple-sdk.override { darwinSdkMajorVersion = "15"; };
apple-sdk_26 = apple-sdk.override { darwinSdkMajorVersion = "26"; };
apple-sdk_27 = apple-sdk.override { darwinSdkMajorVersion = "27"; };
darwinMinVersionHook =
deploymentTarget: