diff --git a/llvm/include/llvm/BinaryFormat/MachO.def b/llvm/include/llvm/BinaryFormat/MachO.def index df527b4a8ab7c..4124c723ec021 100644 --- a/llvm/include/llvm/BinaryFormat/MachO.def +++ b/llvm/include/llvm/BinaryFormat/MachO.def @@ -133,6 +133,8 @@ PLATFORM(IOSSIMULATOR, 7, iossimulator, iossimulator, ios-simulator, ios-simulat PLATFORM(TVOSSIMULATOR, 8, tvossimulator, tvossimulator, tvos-simulator, tvos-simulator, tvOS Simulator) PLATFORM(WATCHOSSIMULATOR, 9, watchossimulator, watchossimulator, watchos-simulator, watchos-simulator, watchOS Simulator) PLATFORM(DRIVERKIT, 10, driverkit, driverkit, driverkit, driverkit, DriverKit) +PLATFORM(XROS, 11, xros, xros, xros, xros, xrOS) +PLATFORM(XROS_SIMULATOR, 12, xrsimulator, xrsimulator, xrsimulator, xros-simulator, xrOS Simulator) #endif #undef HANDLE_LOAD_COMMAND diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 95014a546f724..052336c8a305c 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -214,6 +214,7 @@ class Triple { TvOS, // Apple tvOS WatchOS, // Apple watchOS DriverKit, // Apple DriverKit + XROS, // Apple XROS Mesa3D, AMDPAL, // AMD PAL Runtime HermitCore, // HermitCore Unikernel/Multikernel @@ -514,14 +515,17 @@ class Triple { return getSubArch() == Triple::ARMSubArch_v7k; } + /// Is this an Apple XROS triple. + bool isXROS() const { return getOS() == Triple::XROS; } + /// Is this an Apple DriverKit triple. bool isDriverKit() const { return getOS() == Triple::DriverKit; } bool isOSzOS() const { return getOS() == Triple::ZOS; } - /// Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, or DriverKit). + /// Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, XROS, or DriverKit). bool isOSDarwin() const { - return isMacOSX() || isiOS() || isWatchOS() || isDriverKit(); + return isMacOSX() || isiOS() || isWatchOS() || isDriverKit() || isXROS(); } bool isSimulatorEnvironment() const { diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index b9971c25af71f..40079c1dcd3e7 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -273,6 +273,7 @@ StringRef Triple::getOSTypeName(OSType Kind) { case ZOS: return "zos"; case ShaderModel: return "shadermodel"; case LiteOS: return "liteos"; + case XROS: return "xros"; } llvm_unreachable("Invalid OSType"); @@ -634,6 +635,8 @@ static Triple::OSType parseOS(StringRef OSName) { .StartsWith("tvos", Triple::TvOS) .StartsWith("watchos", Triple::WatchOS) .StartsWith("driverkit", Triple::DriverKit) + .StartsWith("xros", Triple::XROS) + .StartsWith("visionos", Triple::XROS) .StartsWith("mesa3d", Triple::Mesa3D) .StartsWith("amdpal", Triple::AMDPAL) .StartsWith("hermit", Triple::HermitCore) @@ -1224,6 +1227,8 @@ VersionTuple Triple::getOSVersion() const { OSName = OSName.substr(OSTypeName.size()); else if (getOS() == MacOSX) OSName.consume_front("macos"); + else if (OSName.starts_with("visionos")) + OSName.consume_front("visionos"); return parseVersionFromName(OSName); } @@ -1265,6 +1270,8 @@ bool Triple::getMacOSXVersion(VersionTuple &Version) const { // IOS. Version = VersionTuple(10, 4); break; + case XROS: + llvm_unreachable("OSX version isn't relevant for xrOS"); case DriverKit: llvm_unreachable("OSX version isn't relevant for DriverKit"); } @@ -1289,6 +1296,11 @@ VersionTuple Triple::getiOSVersion() const { return (getArch() == aarch64) ? VersionTuple(7) : VersionTuple(5); return Version; } + case XROS: { + // xrOS 1 is aligned with iOS 17. + VersionTuple Version = getOSVersion(); + return Version.withMajorReplaced(Version.getMajor() + 16); + } case WatchOS: llvm_unreachable("conflicting triple info"); case DriverKit: @@ -1314,6 +1326,8 @@ VersionTuple Triple::getWatchOSVersion() const { } case IOS: llvm_unreachable("conflicting triple info"); + case XROS: + llvm_unreachable("watchOS version isn't relevant for xrOS"); case DriverKit: llvm_unreachable("DriverKit doesn't have a WatchOS version"); } diff --git a/llvm/lib/TextAPI/Platform.cpp b/llvm/lib/TextAPI/Platform.cpp index ed041af40aa5b..e891594300c2e 100644 --- a/llvm/lib/TextAPI/Platform.cpp +++ b/llvm/lib/TextAPI/Platform.cpp @@ -106,6 +106,10 @@ std::string getOSAndEnvironmentName(PlatformType Platform, return "watchos" + Version + "-simulator"; case PLATFORM_DRIVERKIT: return "driverkit" + Version; + case PLATFORM_XROS: + return "xros" + Version; + case PLATFORM_XROS_SIMULATOR: + return "xros" + Version + "-simulator"; } llvm_unreachable("Unknown llvm::MachO::PlatformType enum"); } diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp index d3bde2986ea2c..1b0e6c456c046 100644 --- a/llvm/unittests/TargetParser/TripleTest.cpp +++ b/llvm/unittests/TargetParser/TripleTest.cpp @@ -1746,6 +1746,42 @@ TEST(TripleTest, EndianArchVariants) { EXPECT_EQ(Triple::dxil, T.getLittleEndianArchVariant().getArch()); } +TEST(TripleTest, XROS) { + Triple T; + VersionTuple Version; + + T = Triple("arm64-apple-xros"); + EXPECT_TRUE(T.isXROS()); + EXPECT_TRUE(T.isOSDarwin()); + EXPECT_FALSE(T.isiOS()); + EXPECT_FALSE(T.isMacOSX()); + EXPECT_FALSE(T.isSimulatorEnvironment()); + EXPECT_EQ(T.getOSName(), "xros"); + Version = T.getOSVersion(); + EXPECT_EQ(VersionTuple(0), Version); + + T = Triple("arm64-apple-visionos1.2"); + EXPECT_TRUE(T.isXROS()); + EXPECT_TRUE(T.isOSDarwin()); + EXPECT_FALSE(T.isiOS()); + EXPECT_FALSE(T.isMacOSX()); + EXPECT_FALSE(T.isSimulatorEnvironment()); + EXPECT_EQ(T.getOSName(), "visionos1.2"); + Version = T.getOSVersion(); + EXPECT_EQ(VersionTuple(1, 2), Version); + + T = Triple("arm64-apple-xros1-simulator"); + EXPECT_TRUE(T.isXROS()); + EXPECT_TRUE(T.isOSDarwin()); + EXPECT_FALSE(T.isiOS()); + EXPECT_FALSE(T.isMacOSX()); + EXPECT_TRUE(T.isSimulatorEnvironment()); + Version = T.getOSVersion(); + EXPECT_EQ(VersionTuple(1), Version); + Version = T.getiOSVersion(); + EXPECT_EQ(VersionTuple(17), Version); +} + TEST(TripleTest, getOSVersion) { Triple T; VersionTuple Version;