xref: /src/contrib/llvm-project/llvm/lib/TextAPI/Platform.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1344a3780SDimitry Andric //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
2344a3780SDimitry Andric //
3344a3780SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4344a3780SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5344a3780SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6344a3780SDimitry Andric //
7344a3780SDimitry Andric //===----------------------------------------------------------------------===//
8344a3780SDimitry Andric //
9344a3780SDimitry Andric // Implementations of Platform Helper functions.
10344a3780SDimitry Andric //
11344a3780SDimitry Andric //===----------------------------------------------------------------------===//
12344a3780SDimitry Andric 
13344a3780SDimitry Andric #include "llvm/TextAPI/Platform.h"
14344a3780SDimitry Andric #include "llvm/ADT/ArrayRef.h"
15344a3780SDimitry Andric #include "llvm/ADT/StringSwitch.h"
167fa27ce4SDimitry Andric #include "llvm/TargetParser/Triple.h"
17344a3780SDimitry Andric 
18344a3780SDimitry Andric namespace llvm {
19344a3780SDimitry Andric namespace MachO {
20344a3780SDimitry Andric 
mapToPlatformType(PlatformType Platform,bool WantSim)216f8fc217SDimitry Andric PlatformType mapToPlatformType(PlatformType Platform, bool WantSim) {
22344a3780SDimitry Andric   switch (Platform) {
23344a3780SDimitry Andric   default:
24344a3780SDimitry Andric     return Platform;
256f8fc217SDimitry Andric   case PLATFORM_IOS:
266f8fc217SDimitry Andric     return WantSim ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
276f8fc217SDimitry Andric   case PLATFORM_TVOS:
286f8fc217SDimitry Andric     return WantSim ? PLATFORM_TVOSSIMULATOR : PLATFORM_TVOS;
296f8fc217SDimitry Andric   case PLATFORM_WATCHOS:
306f8fc217SDimitry Andric     return WantSim ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
31344a3780SDimitry Andric   }
32344a3780SDimitry Andric }
33344a3780SDimitry Andric 
mapToPlatformType(const Triple & Target)346f8fc217SDimitry Andric PlatformType mapToPlatformType(const Triple &Target) {
35344a3780SDimitry Andric   switch (Target.getOS()) {
36344a3780SDimitry Andric   default:
376f8fc217SDimitry Andric     return PLATFORM_UNKNOWN;
38344a3780SDimitry Andric   case Triple::MacOSX:
396f8fc217SDimitry Andric     return PLATFORM_MACOS;
40344a3780SDimitry Andric   case Triple::IOS:
41344a3780SDimitry Andric     if (Target.isSimulatorEnvironment())
426f8fc217SDimitry Andric       return PLATFORM_IOSSIMULATOR;
43344a3780SDimitry Andric     if (Target.getEnvironment() == Triple::MacABI)
446f8fc217SDimitry Andric       return PLATFORM_MACCATALYST;
456f8fc217SDimitry Andric     return PLATFORM_IOS;
46344a3780SDimitry Andric   case Triple::TvOS:
476f8fc217SDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_TVOSSIMULATOR
486f8fc217SDimitry Andric                                            : PLATFORM_TVOS;
49344a3780SDimitry Andric   case Triple::WatchOS:
506f8fc217SDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_WATCHOSSIMULATOR
516f8fc217SDimitry Andric                                            : PLATFORM_WATCHOS;
52ac9a064cSDimitry Andric   case Triple::BridgeOS:
53ac9a064cSDimitry Andric     return PLATFORM_BRIDGEOS;
54ac9a064cSDimitry Andric   case Triple::DriverKit:
55ac9a064cSDimitry Andric     return PLATFORM_DRIVERKIT;
56ac9a064cSDimitry Andric   case Triple::XROS:
57ac9a064cSDimitry Andric     return Target.isSimulatorEnvironment() ? PLATFORM_XROS_SIMULATOR
58ac9a064cSDimitry Andric                                            : PLATFORM_XROS;
59344a3780SDimitry Andric   }
60344a3780SDimitry Andric }
61344a3780SDimitry Andric 
mapToPlatformSet(ArrayRef<Triple> Targets)62344a3780SDimitry Andric PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
63344a3780SDimitry Andric   PlatformSet Result;
64344a3780SDimitry Andric   for (const auto &Target : Targets)
656f8fc217SDimitry Andric     Result.insert(mapToPlatformType(Target));
66344a3780SDimitry Andric   return Result;
67344a3780SDimitry Andric }
68344a3780SDimitry Andric 
getPlatformName(PlatformType Platform)696f8fc217SDimitry Andric StringRef getPlatformName(PlatformType Platform) {
70344a3780SDimitry Andric   switch (Platform) {
71b1c73532SDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
72b1c73532SDimitry Andric                  marketing)                                                    \
73b1c73532SDimitry Andric   case PLATFORM_##platform:                                                    \
74b1c73532SDimitry Andric     return #marketing;
75b1c73532SDimitry Andric #include "llvm/BinaryFormat/MachO.def"
76344a3780SDimitry Andric   }
776f8fc217SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
78344a3780SDimitry Andric }
79344a3780SDimitry Andric 
getPlatformFromName(StringRef Name)806f8fc217SDimitry Andric PlatformType getPlatformFromName(StringRef Name) {
816f8fc217SDimitry Andric   return StringSwitch<PlatformType>(Name)
827fa27ce4SDimitry Andric       .Case("osx", PLATFORM_MACOS)
83b1c73532SDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
84b1c73532SDimitry Andric                  marketing)                                                    \
85b1c73532SDimitry Andric   .Case(#target, PLATFORM_##platform)
86b1c73532SDimitry Andric #include "llvm/BinaryFormat/MachO.def"
876f8fc217SDimitry Andric       .Default(PLATFORM_UNKNOWN);
88344a3780SDimitry Andric }
89344a3780SDimitry Andric 
getOSAndEnvironmentName(PlatformType Platform,std::string Version)906f8fc217SDimitry Andric std::string getOSAndEnvironmentName(PlatformType Platform,
91344a3780SDimitry Andric                                     std::string Version) {
92344a3780SDimitry Andric   switch (Platform) {
936f8fc217SDimitry Andric   case PLATFORM_UNKNOWN:
94344a3780SDimitry Andric     return "darwin" + Version;
956f8fc217SDimitry Andric   case PLATFORM_MACOS:
96344a3780SDimitry Andric     return "macos" + Version;
976f8fc217SDimitry Andric   case PLATFORM_IOS:
98344a3780SDimitry Andric     return "ios" + Version;
996f8fc217SDimitry Andric   case PLATFORM_TVOS:
100344a3780SDimitry Andric     return "tvos" + Version;
1016f8fc217SDimitry Andric   case PLATFORM_WATCHOS:
102344a3780SDimitry Andric     return "watchos" + Version;
1036f8fc217SDimitry Andric   case PLATFORM_BRIDGEOS:
104344a3780SDimitry Andric     return "bridgeos" + Version;
1056f8fc217SDimitry Andric   case PLATFORM_MACCATALYST:
106344a3780SDimitry Andric     return "ios" + Version + "-macabi";
1076f8fc217SDimitry Andric   case PLATFORM_IOSSIMULATOR:
108344a3780SDimitry Andric     return "ios" + Version + "-simulator";
1096f8fc217SDimitry Andric   case PLATFORM_TVOSSIMULATOR:
110344a3780SDimitry Andric     return "tvos" + Version + "-simulator";
1116f8fc217SDimitry Andric   case PLATFORM_WATCHOSSIMULATOR:
112344a3780SDimitry Andric     return "watchos" + Version + "-simulator";
1136f8fc217SDimitry Andric   case PLATFORM_DRIVERKIT:
114344a3780SDimitry Andric     return "driverkit" + Version;
1154df029ccSDimitry Andric   case PLATFORM_XROS:
1164df029ccSDimitry Andric     return "xros" + Version;
1174df029ccSDimitry Andric   case PLATFORM_XROS_SIMULATOR:
1184df029ccSDimitry Andric     return "xros" + Version + "-simulator";
119344a3780SDimitry Andric   }
1206f8fc217SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
121344a3780SDimitry Andric }
122344a3780SDimitry Andric 
mapToSupportedOSVersion(const Triple & Triple)1237fa27ce4SDimitry Andric VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
1247fa27ce4SDimitry Andric   const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
1257fa27ce4SDimitry Andric   if (MinSupportedOS > Triple.getOSVersion())
1267fa27ce4SDimitry Andric     return MinSupportedOS;
1277fa27ce4SDimitry Andric   return Triple.getOSVersion();
1287fa27ce4SDimitry Andric }
1297fa27ce4SDimitry Andric 
130344a3780SDimitry Andric } // end namespace MachO.
131344a3780SDimitry Andric } // end namespace llvm.
132