[llvm] 24a1447 - [macho] emit LC_BUILD_VERSION load command for supported OSes and platforms
Alex Lorenz via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 30 11:48:29 PDT 2020
Author: Alex Lorenz
Date: 2020-06-30T11:48:17-07:00
New Revision: 24a1447b02854f3145bf5337a82c5fd245f61ca5
URL: https://github.com/llvm/llvm-project/commit/24a1447b02854f3145bf5337a82c5fd245f61ca5
DIFF: https://github.com/llvm/llvm-project/commit/24a1447b02854f3145bf5337a82c5fd245f61ca5.diff
LOG: [macho] emit LC_BUILD_VERSION load command for supported OSes and platforms
This change lets LLVM use the LC_BUILD_VERSION command when building for macOS 10.14, iOS 12, tvOS 12, and watchOS 5.
Additionally, this change ensures that new platforms like Apple Silicon macOS / Mac Catalyst,
and simulators running on Apple Silicon alway use LC_BUILD_VERSION with the OS version set to the
minimum supported OS version if the deployment target version is older.
Differential Revision: https://reviews.llvm.org/D82836
Added:
Modified:
llvm/lib/MC/MCStreamer.cpp
llvm/lib/Support/Triple.cpp
llvm/test/MC/MachO/darwin-sdk-version.ll
llvm/test/MC/MachO/darwin-version-min-load-command.s
Removed:
################################################################################
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp
index 0b650ef936bf..0893835caf26 100644
--- a/llvm/lib/MC/MCStreamer.cpp
+++ b/llvm/lib/MC/MCStreamer.cpp
@@ -1128,6 +1128,79 @@ MCSymbol *MCStreamer::endSection(MCSection *Section) {
return Sym;
}
+static VersionTuple
+targetVersionOrMinimumSupportedOSVersion(const Triple &Target,
+ VersionTuple TargetVersion) {
+ VersionTuple Min = Target.getMinimumSupportedOSVersion();
+ return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
+}
+
+static MCVersionMinType
+getMachoVersionMinLoadCommandType(const Triple &Target) {
+ assert(Target.isOSDarwin() && "expected a darwin OS");
+ switch (Target.getOS()) {
+ case Triple::MacOSX:
+ case Triple::Darwin:
+ return MCVM_OSXVersionMin;
+ case Triple::IOS:
+ assert(!Target.isMacCatalystEnvironment() &&
+ "mac Catalyst should use LC_BUILD_VERSION");
+ return MCVM_IOSVersionMin;
+ case Triple::TvOS:
+ return MCVM_TvOSVersionMin;
+ case Triple::WatchOS:
+ return MCVM_WatchOSVersionMin;
+ default:
+ break;
+ }
+ llvm_unreachable("unexpected OS type");
+}
+
+static VersionTuple getMachoBuildVersionSupportedOS(const Triple &Target) {
+ assert(Target.isOSDarwin() && "expected a darwin OS");
+ switch (Target.getOS()) {
+ case Triple::MacOSX:
+ case Triple::Darwin:
+ return VersionTuple(10, 14);
+ case Triple::IOS:
+ // Mac Catalyst always uses the build version load command.
+ if (Target.isMacCatalystEnvironment())
+ return VersionTuple();
+ LLVM_FALLTHROUGH;
+ case Triple::TvOS:
+ return VersionTuple(12);
+ case Triple::WatchOS:
+ return VersionTuple(5);
+ default:
+ break;
+ }
+ llvm_unreachable("unexpected OS type");
+}
+
+static MachO::PlatformType
+getMachoBuildVersionPlatformType(const Triple &Target) {
+ assert(Target.isOSDarwin() && "expected a darwin OS");
+ switch (Target.getOS()) {
+ case Triple::MacOSX:
+ case Triple::Darwin:
+ return MachO::PLATFORM_MACOS;
+ case Triple::IOS:
+ if (Target.isMacCatalystEnvironment())
+ return MachO::PLATFORM_MACCATALYST;
+ return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
+ : MachO::PLATFORM_IOS;
+ case Triple::TvOS:
+ return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
+ : MachO::PLATFORM_TVOS;
+ case Triple::WatchOS:
+ return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
+ : MachO::PLATFORM_WATCHOS;
+ default:
+ break;
+ }
+ llvm_unreachable("unexpected OS type");
+}
+
void MCStreamer::emitVersionForTarget(const Triple &Target,
const VersionTuple &SDKVersion) {
if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
@@ -1136,33 +1209,37 @@ void MCStreamer::emitVersionForTarget(const Triple &Target,
if (Target.getOSMajorVersion() == 0)
return;
- unsigned Major;
- unsigned Minor;
- unsigned Update;
- if (Target.isMacCatalystEnvironment()) {
- // Mac Catalyst always uses the build version load command.
+ unsigned Major = 0;
+ unsigned Minor = 0;
+ unsigned Update = 0;
+ switch (Target.getOS()) {
+ case Triple::MacOSX:
+ case Triple::Darwin:
+ Target.getMacOSXVersion(Major, Minor, Update);
+ break;
+ case Triple::IOS:
+ case Triple::TvOS:
Target.getiOSVersion(Major, Minor, Update);
- assert(Major && "A non-zero major version is expected");
- emitBuildVersion(MachO::PLATFORM_MACCATALYST, Major, Minor, Update,
- SDKVersion);
- return;
- }
-
- MCVersionMinType VersionType;
- if (Target.isWatchOS()) {
- VersionType = MCVM_WatchOSVersionMin;
+ break;
+ case Triple::WatchOS:
Target.getWatchOSVersion(Major, Minor, Update);
- } else if (Target.isTvOS()) {
- VersionType = MCVM_TvOSVersionMin;
- Target.getiOSVersion(Major, Minor, Update);
- } else if (Target.isMacOSX()) {
- VersionType = MCVM_OSXVersionMin;
- if (!Target.getMacOSXVersion(Major, Minor, Update))
- Major = 0;
- } else {
- VersionType = MCVM_IOSVersionMin;
- Target.getiOSVersion(Major, Minor, Update);
+ break;
+ default:
+ llvm_unreachable("unexpected OS type");
}
- if (Major != 0)
- emitVersionMin(VersionType, Major, Minor, Update, SDKVersion);
+ assert(Major != 0 && "A non-zero major version is expected");
+ auto LinkedTargetVersion = targetVersionOrMinimumSupportedOSVersion(
+ Target, VersionTuple(Major, Minor, Update));
+ auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
+ if (BuildVersionOSVersion.empty() ||
+ LinkedTargetVersion >= BuildVersionOSVersion)
+ return emitBuildVersion(getMachoBuildVersionPlatformType(Target),
+ LinkedTargetVersion.getMajor(),
+ *LinkedTargetVersion.getMinor(),
+ *LinkedTargetVersion.getSubminor(), SDKVersion);
+
+ emitVersionMin(getMachoVersionMinLoadCommandType(Target),
+ LinkedTargetVersion.getMajor(),
+ *LinkedTargetVersion.getMinor(),
+ *LinkedTargetVersion.getSubminor(), SDKVersion);
}
diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp
index b712fad2f438..fec1985ccaca 100644
--- a/llvm/lib/Support/Triple.cpp
+++ b/llvm/lib/Support/Triple.cpp
@@ -1627,11 +1627,29 @@ bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor,
VersionTuple Triple::getMinimumSupportedOSVersion() const {
if (getVendor() != Triple::Apple || getArch() != Triple::aarch64)
return VersionTuple();
- /// ARM64 slice is supported starting from macOS 11.0+.
- if (getOS() == Triple::MacOSX)
+ switch (getOS()) {
+ case Triple::MacOSX:
+ // ARM64 slice is supported starting from macOS 11.0+.
return VersionTuple(11, 0, 0);
- if (getOS() == Triple::IOS && isMacCatalystEnvironment())
- return VersionTuple(14, 0, 0);
+ case Triple::IOS:
+ // ARM64 slice is supported starting from Mac Catalyst 14 (macOS 11).
+ // ARM64 simulators are supported for iOS 14+.
+ if (isMacCatalystEnvironment() || isSimulatorEnvironment())
+ return VersionTuple(14, 0, 0);
+ break;
+ case Triple::TvOS:
+ // ARM64 simulators are supported for tvOS 14+.
+ if (isSimulatorEnvironment())
+ return VersionTuple(14, 0, 0);
+ break;
+ case Triple::WatchOS:
+ // ARM64 simulators are supported for watchOS 7+.
+ if (isSimulatorEnvironment())
+ return VersionTuple(7, 0, 0);
+ break;
+ default:
+ break;
+ }
return VersionTuple();
}
diff --git a/llvm/test/MC/MachO/darwin-sdk-version.ll b/llvm/test/MC/MachO/darwin-sdk-version.ll
index bb3db5633702..df67b69001cc 100644
--- a/llvm/test/MC/MachO/darwin-sdk-version.ll
+++ b/llvm/test/MC/MachO/darwin-sdk-version.ll
@@ -1,7 +1,7 @@
; RUN: llc %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s
; RUN: llc %s -filetype=asm -o - | FileCheck --check-prefix=ASM %s
-target triple = "x86_64-apple-macos10.14";
+target triple = "x86_64-apple-macos10.13";
!llvm.module.flags = !{!0};
!0 = !{i32 2, !"SDK Version", [3 x i32] [ i32 10, i32 14, i32 2 ] };
@@ -12,7 +12,7 @@ entry:
; CHECK: cmd LC_VERSION_MIN_MACOSX
; CHECK-NEXT: cmdsize 16
-; CHECK-NEXT: version 10.14
+; CHECK-NEXT: version 10.13
; CHECK-NEXT: sdk 10.14.2
-; ASM: .macosx_version_min 10, 14 sdk_version 10, 14, 2
+; ASM: .macosx_version_min 10, 13 sdk_version 10, 14, 2
diff --git a/llvm/test/MC/MachO/darwin-version-min-load-command.s b/llvm/test/MC/MachO/darwin-version-min-load-command.s
index ad43bd723566..f464dfbddbf7 100644
--- a/llvm/test/MC/MachO/darwin-version-min-load-command.s
+++ b/llvm/test/MC/MachO/darwin-version-min-load-command.s
@@ -3,6 +3,28 @@
// RUN: llvm-mc -triple x86_64-apple-darwin %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-DARWIN
// RUN: llvm-mc -triple x86_64-apple-ios13.0-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST
+// RUN: llvm-mc -triple x86_64-apple-macos10.14 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS
+// RUN: llvm-mc -triple x86_64-apple-ios12 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOS
+// RUN: llvm-mc -triple x86_64-apple-tvos12 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-TVOS
+// RUN: llvm-mc -triple x86_64-apple-watchos5 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-WATCHOS
+// RUN: llvm-mc -triple x86_64-apple-ios12-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM
+// RUN: llvm-mc -triple x86_64-apple-tvos12-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-TVOSSIM
+// RUN: llvm-mc -triple x86_64-apple-watchos5-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-WATCHOSSIM
+
+// RUN: llvm-mc -triple arm64-apple-macos10.10.2 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64
+// RUN: llvm-mc -triple arm64-apple-macos11 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64
+// RUN: llvm-mc -triple arm64-apple-macos11.1 %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-MACOS-ARM64_1
+// RUN: llvm-mc -triple arm64-apple-ios13.0-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST-ARM64
+// RUN: llvm-mc -triple arm64-apple-ios14.1-macabi %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-MACCATALYST-ARM64_1
+
+// RUN: llvm-mc -triple arm64-apple-ios10-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
+// RUN: llvm-mc -triple arm64-apple-ios13-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
+// RUN: llvm-mc -triple arm64-apple-ios14-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM2
+// RUN: llvm-mc -triple arm64-apple-ios14.1-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-IOSSIM3
+// RUN: llvm-mc -triple arm64-apple-tvos10-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-TVOSSIM2
+// RUN: llvm-mc -triple arm64-apple-watchos3-simulator %s -filetype=obj -o - | llvm-objdump --macho --private-headers - | FileCheck %s --check-prefix=CHECK-BUILD-WATCHOSSIM2
+
+
// Test version-min load command should be inferred from triple and should always be generated on Darwin
// CHECK: Load command
// CHECK: cmd LC_VERSION_MIN_MACOSX
@@ -41,3 +63,120 @@
// CHECK-MACCATALYST-NEXT: sdk n/a
// CHECK-MACCATALYST-NEXT: minos 13.0
// CHECK-MACCATALYST-NEXT: ntools 0
+
+// CHECK-BUILD-MACOS: cmd LC_BUILD_VERSION
+// CHECK-BUILD-MACOS-NEXT: cmdsize 24
+// CHECK-BUILD-MACOS-NEXT: platform macos
+// CHECK-BUILD-MACOS-NEXT: sdk n/a
+// CHECK-BUILD-MACOS-NEXT: minos 10.14
+// CHECK-BUILD-MACOS-NEXT: ntools 0
+// CHECK-BUILD-MACOS-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-IOS: cmd LC_BUILD_VERSION
+// CHECK-BUILD-IOS-NEXT: cmdsize 24
+// CHECK-BUILD-IOS-NEXT: platform ios
+// CHECK-BUILD-IOS-NEXT: sdk n/a
+// CHECK-BUILD-IOS-NEXT: minos 12.0
+// CHECK-BUILD-IOS-NEXT: ntools 0
+// CHECK-BUILD-IOS-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-TVOS: cmd LC_BUILD_VERSION
+// CHECK-BUILD-TVOS-NEXT: cmdsize 24
+// CHECK-BUILD-TVOS-NEXT: platform tvos
+// CHECK-BUILD-TVOS-NEXT: sdk n/a
+// CHECK-BUILD-TVOS-NEXT: minos 12.0
+// CHECK-BUILD-TVOS-NEXT: ntools 0
+// CHECK-BUILD-TVOS-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-WATCHOS: cmd LC_BUILD_VERSION
+// CHECK-BUILD-WATCHOS-NEXT: cmdsize 24
+// CHECK-BUILD-WATCHOS-NEXT: platform watchos
+// CHECK-BUILD-WATCHOS-NEXT: sdk n/a
+// CHECK-BUILD-WATCHOS-NEXT: minos 5.0
+// CHECK-BUILD-WATCHOS-NEXT: ntools 0
+// CHECK-BUILD-WATCHOS-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-IOSSIM: cmd LC_BUILD_VERSION
+// CHECK-BUILD-IOSSIM-NEXT: cmdsize 24
+// CHECK-BUILD-IOSSIM-NEXT: platform iossim
+// CHECK-BUILD-IOSSIM-NEXT: sdk n/a
+// CHECK-BUILD-IOSSIM-NEXT: minos 12.0
+// CHECK-BUILD-IOSSIM-NEXT: ntools 0
+// CHECK-BUILD-IOSSIM-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-IOSSIM2: cmd LC_BUILD_VERSION
+// CHECK-BUILD-IOSSIM2-NEXT: cmdsize 24
+// CHECK-BUILD-IOSSIM2-NEXT: platform iossim
+// CHECK-BUILD-IOSSIM2-NEXT: sdk n/a
+// CHECK-BUILD-IOSSIM2-NEXT: minos 14.0
+// CHECK-BUILD-IOSSIM2-NEXT: ntools 0
+// CHECK-BUILD-IOSSIM2-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-IOSSIM3: cmd LC_BUILD_VERSION
+// CHECK-BUILD-IOSSIM3-NEXT: cmdsize 24
+// CHECK-BUILD-IOSSIM3-NEXT: platform iossim
+// CHECK-BUILD-IOSSIM3-NEXT: sdk n/a
+// CHECK-BUILD-IOSSIM3-NEXT: minos 14.1
+// CHECK-BUILD-IOSSIM3-NEXT: ntools 0
+// CHECK-BUILD-IOSSIM3-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-TVOSSIM: cmd LC_BUILD_VERSION
+// CHECK-BUILD-TVOSSIM-NEXT: cmdsize 24
+// CHECK-BUILD-TVOSSIM-NEXT: platform tvossim
+// CHECK-BUILD-TVOSSIM-NEXT: sdk n/a
+// CHECK-BUILD-TVOSSIM-NEXT: minos 12.0
+// CHECK-BUILD-TVOSSIM-NEXT: ntools 0
+// CHECK-BUILD-TVOSSIM-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-TVOSSIM2: cmd LC_BUILD_VERSION
+// CHECK-BUILD-TVOSSIM2-NEXT: cmdsize 24
+// CHECK-BUILD-TVOSSIM2-NEXT: platform tvossim
+// CHECK-BUILD-TVOSSIM2-NEXT: sdk n/a
+// CHECK-BUILD-TVOSSIM2-NEXT: minos 14.0
+// CHECK-BUILD-TVOSSIM2-NEXT: ntools 0
+// CHECK-BUILD-TVOSSIM2-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-WATCHOSSIM: cmd LC_BUILD_VERSION
+// CHECK-BUILD-WATCHOSSIM-NEXT: cmdsize 24
+// CHECK-BUILD-WATCHOSSIM-NEXT: platform watchossim
+// CHECK-BUILD-WATCHOSSIM-NEXT: sdk n/a
+// CHECK-BUILD-WATCHOSSIM-NEXT: minos 5.0
+// CHECK-BUILD-WATCHOSSIM-NEXT: ntools 0
+// CHECK-BUILD-WATCHOSSIM-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-WATCHOSSIM2: cmd LC_BUILD_VERSION
+// CHECK-BUILD-WATCHOSSIM2-NEXT: cmdsize 24
+// CHECK-BUILD-WATCHOSSIM2-NEXT: platform watchossim
+// CHECK-BUILD-WATCHOSSIM2-NEXT: sdk n/a
+// CHECK-BUILD-WATCHOSSIM2-NEXT: minos 7.0
+// CHECK-BUILD-WATCHOSSIM2-NEXT: ntools 0
+// CHECK-BUILD-WATCHOSSIM2-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-MACOS-ARM64: cmd LC_BUILD_VERSION
+// CHECK-BUILD-MACOS-ARM64-NEXT: cmdsize 24
+// CHECK-BUILD-MACOS-ARM64-NEXT: platform macos
+// CHECK-BUILD-MACOS-ARM64-NEXT: sdk n/a
+// CHECK-BUILD-MACOS-ARM64-NEXT: minos 11.0
+// CHECK-BUILD-MACOS-ARM64-NEXT: ntools 0
+// CHECK-BUILD-MACOS-ARM64-NOT: LC_VERSION_MIN
+
+// CHECK-BUILD-MACOS-ARM64_1: cmd LC_BUILD_VERSION
+// CHECK-BUILD-MACOS-ARM64_1-NEXT: cmdsize 24
+// CHECK-BUILD-MACOS-ARM64_1-NEXT: platform macos
+// CHECK-BUILD-MACOS-ARM64_1-NEXT: sdk n/a
+// CHECK-BUILD-MACOS-ARM64_1-NEXT: minos 11.1
+// CHECK-BUILD-MACOS-ARM64_1-NEXT: ntools 0
+
+// CHECK-MACCATALYST-ARM64: cmd LC_BUILD_VERSION
+// CHECK-MACCATALYST-ARM64-NEXT: cmdsize 24
+// CHECK-MACCATALYST-ARM64-NEXT: platform macCatalyst
+// CHECK-MACCATALYST-ARM64-NEXT: sdk n/a
+// CHECK-MACCATALYST-ARM64-NEXT: minos 14.0
+// CHECK-MACCATALYST-ARM64-NEXT: ntools 0
+
+// CHECK-MACCATALYST-ARM64_1: cmd LC_BUILD_VERSION
+// CHECK-MACCATALYST-ARM64_1-NEXT: cmdsize 24
+// CHECK-MACCATALYST-ARM64_1-NEXT: platform macCatalyst
+// CHECK-MACCATALYST-ARM64_1-NEXT: sdk n/a
+// CHECK-MACCATALYST-ARM64_1-NEXT: minos 14.1
+// CHECK-MACCATALYST-ARM64_1-NEXT: ntools 0
More information about the llvm-commits
mailing list