Author: Alex Lorenz Date: 2020-06-29T12:21:54-07:00 New Revision: f7a14514ee63dc2ab9558c50254efb8ac2ad7cc6
URL: https://github.com/llvm/llvm-project/commit/f7a14514ee63dc2ab9558c50254efb8ac2ad7cc6 DIFF: https://github.com/llvm/llvm-project/commit/f7a14514ee63dc2ab9558c50254efb8ac2ad7cc6.diff LOG: [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 Added: clang/test/Driver/macos-apple-silicon-slice-link-libs.cpp Modified: clang/lib/Driver/ToolChains/Darwin.h llvm/include/llvm/ADT/Triple.h llvm/lib/Support/Triple.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Darwin.h b/clang/lib/Driver/ToolChains/Darwin.h index 438455996ccb..04c5bfa69a5a 100644 --- a/clang/lib/Driver/ToolChains/Darwin.h +++ b/clang/lib/Driver/ToolChains/Darwin.h @@ -434,9 +434,17 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO { 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 000000000000..522fda34987e --- /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 89679619dd55..6bad18f19244 100644 --- a/llvm/include/llvm/ADT/Triple.h +++ b/llvm/include/llvm/ADT/Triple.h @@ -860,6 +860,12 @@ class Triple { /// Merge target triples. std::string merge(const Triple &Other) const; + /// Some platforms have diff erent 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 75ec257e15b5..b712fad2f438 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(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits