From f7a14514ee63dc2ab9558c50254efb8ac2ad7cc6 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Mon, 29 Jun 2020 10:23:16 -0700 Subject: [PATCH] [darwin][driver] isMacosxVersionLT should check against the minimum supported OS version This change ensures that the Darwin driver doesn't add unsupported libraries to the link invocation when linking the Apple Silicon macOS slice. rdar://61011136 Differential Revision: https://reviews.llvm.org/D82696 --- clang/lib/Driver/ToolChains/Darwin.h | 12 +++++-- .../Driver/macos-apple-silicon-slice-link-libs.cpp | 42 ++++++++++++++++++++++ llvm/include/llvm/ADT/Triple.h | 6 ++++ llvm/lib/Support/Triple.cpp | 11 ++++++ 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 clang/test/Driver/macos-apple-silicon-slice-link-libs.cpp diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index 4384559..04c5bfa 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -434,9 +434,17 @@ public: return TargetVersion < VersionTuple(V0, V1, V2); } + /// Returns true if the minimum supported macOS version for the slice that's + /// being built is less than the specified version. If there's no minimum + /// supported macOS version, the deployment target version is compared to the + /// specifed version instead. bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const { - assert(isTargetMacOS() && "Unexpected call for non OS X target!"); - return TargetVersion < VersionTuple(V0, V1, V2); + assert(isTargetMacOS() && getTriple().isMacOSX() && + "Unexpected call for non OS X target!"); + VersionTuple MinVers = getTriple().getMinimumSupportedOSVersion(); + return (!MinVers.empty() && MinVers > TargetVersion + ? MinVers + : TargetVersion) < VersionTuple(V0, V1, V2); } protected: diff --git a/clang/test/Driver/macos-apple-silicon-slice-link-libs.cpp b/clang/test/Driver/macos-apple-silicon-slice-link-libs.cpp new file mode 100644 index 0000000..522fda3 --- /dev/null +++ b/clang/test/Driver/macos-apple-silicon-slice-link-libs.cpp @@ -0,0 +1,42 @@ +// RUN: %clang -### -target arm64-apple-macos10.7 %s 2>&1 | FileCheck -check-prefix=ARM64-10_7 %s +// RUN: %clang -### -target x86_64-apple-macos10.7 %s 2>&1 | FileCheck -check-prefix=x86_64-10_7 %s + +// RUN: %clang -### -target arm64-apple-macos10.5 %s 2>&1 | FileCheck -check-prefix=ARM64-10_5 %s +// RUN: %clang -### -target x86_64-apple-macos10.5 %s 2>&1 | FileCheck -check-prefix=x86_64-10_5 %s + +// RUN: %clang -### -target arm64-apple-macos10.4 %s 2>&1 | FileCheck -check-prefix=ARM64-10_4 %s +// RUN: %clang -### -target x86_64-apple-macos10.4 %s 2>&1 | FileCheck -check-prefix=x86_64-10_4 %s + +// RUN: %clang -### -target arm64-apple-macos10.5 -bundle %s 2>&1 | FileCheck -check-prefix=ARM64-BUNDLE %s +// RUN: %clang -### -target x86_64-apple-macos10.5 -bundle %s 2>&1 | FileCheck -check-prefix=x86_64-BUNDLE %s + +// RUN: %clang -### -target arm64-apple-macos10.5 -dynamiclib %s 2>&1 | FileCheck -check-prefix=ARM64-10_5-DYNAMICLIB %s +// RUN: %clang -### -target x86_64-apple-macos10.5 -dynamiclib %s 2>&1 | FileCheck -check-prefix=x86_64-10_5-DYNAMICLIB %s + +// RUN: %clang -### -target arm64-apple-macos10.4 -dynamiclib %s 2>&1 | FileCheck -check-prefix=ARM64-10_4-DYNAMICLIB %s +// RUN: %clang -### -target arm64-apple-darwin8 -dynamiclib %s 2>&1 | FileCheck -check-prefix=ARM64-10_4-DYNAMICLIB %s +// RUN: %clang -### -target x86_64-apple-macos10.4 -dynamiclib %s 2>&1 | FileCheck -check-prefix=x86_64-10_4-DYNAMICLIB %s +// RUN: %clang -### -target x86_64-apple-darwin8 -dynamiclib %s 2>&1 | FileCheck -check-prefix=x86_64-10_4-DYNAMICLIB %s + +// RUN: %clang -### -target arm64-apple-macos10.7 -static %s 2>&1 | FileCheck -check-prefix=STATIC %s +// RUN: %clang -### -target x86_64-apple-macos10.7 -static %s 2>&1 | FileCheck -check-prefix=STATIC %s + +// ARM64-10_7-NOT: -lcrt1.10.6.o +// x86_64-10_7: -lcrt1.10.6.o + +// ARM64-10_5-NOT: -lcrt1.10.5.o +// x86_64-10_5: -lcrt1.10.5.o + +// ARM64-10_4-NOT: -lcrt1.o +// x86_64-10_4: -lcrt1.o + +// ARM64-BUNDLE-NOT: -lbundle1.o +// x86_64-BUNDLE: -lbundle1.o + +// ARM64-10_5-DYNAMICLIB-NOT: -ldylib1.10.5.o +// x86_64-10_5-DYNAMICLIB: -ldylib1.10.5.o + +// ARM64-10_4-DYNAMICLIB-NOT: -ldylib1.o +// x86_64-10_4-DYNAMICLIB: -ldylib1.o + +// STATIC: -lcrt0.o diff --git a/llvm/include/llvm/ADT/Triple.h b/llvm/include/llvm/ADT/Triple.h index 8967961..6bad18f 100644 --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h @@ -860,6 +860,12 @@ public: /// Merge target triples. std::string merge(const Triple &Other) const; + /// Some platforms have different minimum supported OS versions that + /// varies by the architecture specified in the triple. This function + /// returns the minimum supported OS version for this triple if one an exists, + /// or an invalid version tuple if this triple doesn't have one. + VersionTuple getMinimumSupportedOSVersion() const; + /// @} /// @name Static helpers for IDs. /// @{ diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp index 75ec257..b712fad 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -1624,6 +1624,17 @@ 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) + return VersionTuple(11, 0, 0); + if (getOS() == Triple::IOS && isMacCatalystEnvironment()) + return VersionTuple(14, 0, 0); + return VersionTuple(); +} + StringRef Triple::getARMCPUForArch(StringRef MArch) const { if (MArch.empty()) MArch = getArchName(); -- 2.7.4