From 0e27faeb9389fc901d535f6a3fc1e08708c5e68c Mon Sep 17 00:00:00 2001 From: Cyndy Ishida Date: Wed, 10 Jan 2024 16:06:42 -0800 Subject: [PATCH 1/3] [llvm] Introduce XROS platform Accepts but otherwise ignore visionOS/XROS target triples. --- llvm/include/llvm/BinaryFormat/MachO.def | 2 ++ llvm/include/llvm/TargetParser/Triple.h | 9 ++++-- llvm/lib/MC/MCParser/DarwinAsmParser.cpp | 2 ++ llvm/lib/TargetParser/Triple.cpp | 10 ++++++ llvm/lib/TextAPI/Platform.cpp | 4 +++ llvm/unittests/TargetParser/TripleTest.cpp | 36 ++++++++++++++++++++++ 6 files changed, 61 insertions(+), 2 deletions(-) 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..34ff7a8ccc43d 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -214,6 +214,8 @@ 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 +516,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/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp index edea5a56bec3d..3cd44e7195be6 100644 --- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp @@ -1147,6 +1147,7 @@ static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type) { case MachO::PLATFORM_IOS: return Triple::IOS; case MachO::PLATFORM_TVOS: return Triple::TvOS; case MachO::PLATFORM_WATCHOS: return Triple::WatchOS; + case MachO::PLATFORM_XROS: return Triple::XROS; case MachO::PLATFORM_BRIDGEOS: /* silence warning */ break; case MachO::PLATFORM_DRIVERKIT: return Triple::DriverKit; @@ -1154,6 +1155,7 @@ static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type) { case MachO::PLATFORM_IOSSIMULATOR: /* silence warning */ break; case MachO::PLATFORM_TVOSSIMULATOR: /* silence warning */ break; case MachO::PLATFORM_WATCHOSSIMULATOR: /* silence warning */ break; + case MachO::PLATFORM_XROS_SIMULATOR: /* silence warning */ break; } llvm_unreachable("Invalid mach-o platform type"); } diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index b9971c25af71f..cc696745c7dd5 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); } @@ -1289,6 +1294,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: 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; From 0f3d0e0b9ba7c8c374311c13921ff626eedd3174 Mon Sep 17 00:00:00 2001 From: Cyndy Ishida Date: Wed, 10 Jan 2024 16:49:08 -0800 Subject: [PATCH 2/3] remove whitespace --- llvm/include/llvm/TargetParser/Triple.h | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 34ff7a8ccc43d..052336c8a305c 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -215,7 +215,6 @@ class Triple { WatchOS, // Apple watchOS DriverKit, // Apple DriverKit XROS, // Apple XROS - Mesa3D, AMDPAL, // AMD PAL Runtime HermitCore, // HermitCore Unikernel/Multikernel From 64395216ba1e2dce28c3f580a0c7357d36caaad5 Mon Sep 17 00:00:00 2001 From: Cyndy Ishida Date: Thu, 11 Jan 2024 09:39:03 -0800 Subject: [PATCH 3/3] Move out MCParser changes --- llvm/lib/MC/MCParser/DarwinAsmParser.cpp | 2 -- llvm/lib/TargetParser/Triple.cpp | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp index 3cd44e7195be6..edea5a56bec3d 100644 --- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp @@ -1147,7 +1147,6 @@ static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type) { case MachO::PLATFORM_IOS: return Triple::IOS; case MachO::PLATFORM_TVOS: return Triple::TvOS; case MachO::PLATFORM_WATCHOS: return Triple::WatchOS; - case MachO::PLATFORM_XROS: return Triple::XROS; case MachO::PLATFORM_BRIDGEOS: /* silence warning */ break; case MachO::PLATFORM_DRIVERKIT: return Triple::DriverKit; @@ -1155,7 +1154,6 @@ static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type) { case MachO::PLATFORM_IOSSIMULATOR: /* silence warning */ break; case MachO::PLATFORM_TVOSSIMULATOR: /* silence warning */ break; case MachO::PLATFORM_WATCHOSSIMULATOR: /* silence warning */ break; - case MachO::PLATFORM_XROS_SIMULATOR: /* silence warning */ break; } llvm_unreachable("Invalid mach-o platform type"); } diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp index cc696745c7dd5..40079c1dcd3e7 100644 --- a/llvm/lib/TargetParser/Triple.cpp +++ b/llvm/lib/TargetParser/Triple.cpp @@ -1270,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"); } @@ -1324,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"); }