xref: /freebsd-src/contrib/llvm-project/llvm/lib/TextAPI/Platform.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1fe6060f1SDimitry Andric //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric //
9fe6060f1SDimitry Andric // Implementations of Platform Helper functions.
10fe6060f1SDimitry Andric //
11fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
12fe6060f1SDimitry Andric 
13fe6060f1SDimitry Andric #include "llvm/TextAPI/Platform.h"
14fe6060f1SDimitry Andric #include "llvm/ADT/ArrayRef.h"
15fe6060f1SDimitry Andric #include "llvm/ADT/StringSwitch.h"
1606c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
17fe6060f1SDimitry Andric 
18fe6060f1SDimitry Andric namespace llvm {
19fe6060f1SDimitry Andric namespace MachO {
20fe6060f1SDimitry Andric 
2104eeddc0SDimitry Andric PlatformType mapToPlatformType(PlatformType Platform, bool WantSim) {
22fe6060f1SDimitry Andric   switch (Platform) {
23fe6060f1SDimitry Andric   default:
24fe6060f1SDimitry Andric     return Platform;
2504eeddc0SDimitry Andric   case PLATFORM_IOS:
2604eeddc0SDimitry Andric     return WantSim ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
2704eeddc0SDimitry Andric   case PLATFORM_TVOS:
2804eeddc0SDimitry Andric     return WantSim ? PLATFORM_TVOSSIMULATOR : PLATFORM_TVOS;
2904eeddc0SDimitry Andric   case PLATFORM_WATCHOS:
3004eeddc0SDimitry Andric     return WantSim ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
31fe6060f1SDimitry Andric   }
32fe6060f1SDimitry Andric }
33fe6060f1SDimitry Andric 
3404eeddc0SDimitry Andric PlatformType mapToPlatformType(const Triple &Target) {
35fe6060f1SDimitry Andric   switch (Target.getOS()) {
36fe6060f1SDimitry Andric   default:
3704eeddc0SDimitry Andric     return PLATFORM_UNKNOWN;
38fe6060f1SDimitry Andric   case Triple::MacOSX:
3904eeddc0SDimitry Andric     return PLATFORM_MACOS;
40fe6060f1SDimitry Andric   case Triple::IOS:
41fe6060f1SDimitry Andric     if (Target.isSimulatorEnvironment())
4204eeddc0SDimitry Andric       return PLATFORM_IOSSIMULATOR;
43fe6060f1SDimitry Andric     if (Target.getEnvironment() == Triple::MacABI)
4404eeddc0SDimitry Andric       return PLATFORM_MACCATALYST;
4504eeddc0SDimitry Andric     return PLATFORM_IOS;
46fe6060f1SDimitry Andric   case Triple::TvOS:
4704eeddc0SDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_TVOSSIMULATOR
4804eeddc0SDimitry Andric                                            : PLATFORM_TVOS;
49fe6060f1SDimitry Andric   case Triple::WatchOS:
5004eeddc0SDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_WATCHOSSIMULATOR
5104eeddc0SDimitry Andric                                            : PLATFORM_WATCHOS;
52*0fca6ea1SDimitry Andric   case Triple::BridgeOS:
53*0fca6ea1SDimitry Andric     return PLATFORM_BRIDGEOS;
54*0fca6ea1SDimitry Andric   case Triple::DriverKit:
55*0fca6ea1SDimitry Andric     return PLATFORM_DRIVERKIT;
56*0fca6ea1SDimitry Andric   case Triple::XROS:
57*0fca6ea1SDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_XROS_SIMULATOR
58*0fca6ea1SDimitry Andric                                            : PLATFORM_XROS;
59fe6060f1SDimitry Andric   }
60fe6060f1SDimitry Andric }
61fe6060f1SDimitry Andric 
62fe6060f1SDimitry Andric PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
63fe6060f1SDimitry Andric   PlatformSet Result;
64fe6060f1SDimitry Andric   for (const auto &Target : Targets)
6504eeddc0SDimitry Andric     Result.insert(mapToPlatformType(Target));
66fe6060f1SDimitry Andric   return Result;
67fe6060f1SDimitry Andric }
68fe6060f1SDimitry Andric 
6904eeddc0SDimitry Andric StringRef getPlatformName(PlatformType Platform) {
70fe6060f1SDimitry Andric   switch (Platform) {
715f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
725f757f3fSDimitry Andric                  marketing)                                                    \
735f757f3fSDimitry Andric   case PLATFORM_##platform:                                                    \
745f757f3fSDimitry Andric     return #marketing;
755f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
76fe6060f1SDimitry Andric   }
7704eeddc0SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
78fe6060f1SDimitry Andric }
79fe6060f1SDimitry Andric 
8004eeddc0SDimitry Andric PlatformType getPlatformFromName(StringRef Name) {
8104eeddc0SDimitry Andric   return StringSwitch<PlatformType>(Name)
8206c3fb27SDimitry Andric       .Case("osx", PLATFORM_MACOS)
835f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
845f757f3fSDimitry Andric                  marketing)                                                    \
855f757f3fSDimitry Andric   .Case(#target, PLATFORM_##platform)
865f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
8704eeddc0SDimitry Andric       .Default(PLATFORM_UNKNOWN);
88fe6060f1SDimitry Andric }
89fe6060f1SDimitry Andric 
9004eeddc0SDimitry Andric std::string getOSAndEnvironmentName(PlatformType Platform,
91fe6060f1SDimitry Andric                                     std::string Version) {
92fe6060f1SDimitry Andric   switch (Platform) {
9304eeddc0SDimitry Andric   case PLATFORM_UNKNOWN:
94fe6060f1SDimitry Andric     return "darwin" + Version;
9504eeddc0SDimitry Andric   case PLATFORM_MACOS:
96fe6060f1SDimitry Andric     return "macos" + Version;
9704eeddc0SDimitry Andric   case PLATFORM_IOS:
98fe6060f1SDimitry Andric     return "ios" + Version;
9904eeddc0SDimitry Andric   case PLATFORM_TVOS:
100fe6060f1SDimitry Andric     return "tvos" + Version;
10104eeddc0SDimitry Andric   case PLATFORM_WATCHOS:
102fe6060f1SDimitry Andric     return "watchos" + Version;
10304eeddc0SDimitry Andric   case PLATFORM_BRIDGEOS:
104fe6060f1SDimitry Andric     return "bridgeos" + Version;
10504eeddc0SDimitry Andric   case PLATFORM_MACCATALYST:
106fe6060f1SDimitry Andric     return "ios" + Version + "-macabi";
10704eeddc0SDimitry Andric   case PLATFORM_IOSSIMULATOR:
108fe6060f1SDimitry Andric     return "ios" + Version + "-simulator";
10904eeddc0SDimitry Andric   case PLATFORM_TVOSSIMULATOR:
110fe6060f1SDimitry Andric     return "tvos" + Version + "-simulator";
11104eeddc0SDimitry Andric   case PLATFORM_WATCHOSSIMULATOR:
112fe6060f1SDimitry Andric     return "watchos" + Version + "-simulator";
11304eeddc0SDimitry Andric   case PLATFORM_DRIVERKIT:
114fe6060f1SDimitry Andric     return "driverkit" + Version;
1157a6dacacSDimitry Andric   case PLATFORM_XROS:
1167a6dacacSDimitry Andric     return "xros" + Version;
1177a6dacacSDimitry Andric   case PLATFORM_XROS_SIMULATOR:
1187a6dacacSDimitry Andric     return "xros" + Version + "-simulator";
119fe6060f1SDimitry Andric   }
12004eeddc0SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
121fe6060f1SDimitry Andric }
122fe6060f1SDimitry Andric 
12306c3fb27SDimitry Andric VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
12406c3fb27SDimitry Andric   const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
12506c3fb27SDimitry Andric   if (MinSupportedOS > Triple.getOSVersion())
12606c3fb27SDimitry Andric     return MinSupportedOS;
12706c3fb27SDimitry Andric   return Triple.getOSVersion();
12806c3fb27SDimitry Andric }
12906c3fb27SDimitry Andric 
130fe6060f1SDimitry Andric } // end namespace MachO.
131fe6060f1SDimitry Andric } // end namespace llvm.
132