diff options
Diffstat (limited to 'llvm/lib/Support/Triple.cpp')
-rw-r--r-- | llvm/lib/Support/Triple.cpp | 92 |
1 files changed, 78 insertions, 14 deletions
diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp index 2c480c1094a5..fec1985ccaca 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -9,10 +9,14 @@ #include "llvm/ADT/Triple.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Host.h" +#include "llvm/Support/SwapByteOrder.h" #include "llvm/Support/TargetParser.h" +#include "llvm/Support/VersionTuple.h" +#include <cassert> #include <cstring> using namespace llvm; @@ -625,6 +629,8 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) { return Triple::ARMSubArch_v8_4a; case ARM::ArchKind::ARMV8_5A: return Triple::ARMSubArch_v8_5a; + case ARM::ArchKind::ARMV8_6A: + return Triple::ARMSubArch_v8_6a; case ARM::ArchKind::ARMV8R: return Triple::ARMSubArch_v8r; case ARM::ArchKind::ARMV8MBaseline: @@ -710,9 +716,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) { case Triple::ppc64: case Triple::ppc: - if (T.isOSDarwin()) - return Triple::MachO; - else if (T.isOSAIX()) + if (T.isOSAIX()) return Triple::XCOFF; return Triple::ELF; @@ -983,12 +987,7 @@ std::string Triple::normalize(StringRef Str) { } // Stick the corrected components back together to form the normalized string. - std::string Normalized; - for (unsigned i = 0, e = Components.size(); i != e; ++i) { - if (i) Normalized += '-'; - Normalized += Components[i]; - } - return Normalized; + return join(Components, "-"); } StringRef Triple::getArchName() const { @@ -1088,17 +1087,23 @@ bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor, // Darwin version numbers are skewed from OS X versions. if (Major < 4) return false; - Micro = 0; - Minor = Major - 4; - Major = 10; + if (Major <= 19) { + Micro = 0; + Minor = Major - 4; + Major = 10; + } else { + Micro = 0; + Minor = 0; + // darwin20+ corresponds to macOS 11+. + Major = 11 + Major - 20; + } break; case MacOSX: // Default to 10.4. if (Major == 0) { Major = 10; Minor = 4; - } - if (Major != 10) + } else if (Major < 10) return false; break; case IOS: @@ -1602,6 +1607,52 @@ std::string Triple::merge(const Triple &Other) const { return Other.str(); } +bool Triple::isMacOSXVersionLT(unsigned Major, unsigned Minor, + unsigned Micro) const { + assert(isMacOSX() && "Not an OS X triple!"); + + // If this is OS X, expect a sane version number. + if (getOS() == Triple::MacOSX) + return isOSVersionLT(Major, Minor, Micro); + + // Otherwise, compare to the "Darwin" number. + if (Major == 10) { + return isOSVersionLT(Minor + 4, Micro, 0); + } else { + assert(Major >= 11 && "Unexpected major version"); + return isOSVersionLT(Major - 11 + 20, Minor, Micro); + } +} + +VersionTuple Triple::getMinimumSupportedOSVersion() const { + if (getVendor() != Triple::Apple || getArch() != Triple::aarch64) + return VersionTuple(); + switch (getOS()) { + case Triple::MacOSX: + // ARM64 slice is supported starting from macOS 11.0+. + return VersionTuple(11, 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(); +} + StringRef Triple::getARMCPUForArch(StringRef MArch) const { if (MArch.empty()) MArch = getArchName(); @@ -1664,3 +1715,16 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const { llvm_unreachable("invalid arch name"); } + +VersionTuple Triple::getCanonicalVersionForOS(OSType OSKind, + const VersionTuple &Version) { + switch (OSKind) { + case MacOSX: + // macOS 10.16 is canonicalized to macOS 11. + if (Version == VersionTuple(10, 16)) + return VersionTuple(11, 0); + LLVM_FALLTHROUGH; + default: + return Version; + } +} |