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 
mapToPlatformType(PlatformType Platform,bool WantSim)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 
mapToPlatformType(const Triple & Target)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;
52fe6060f1SDimitry Andric     // TODO: add bridgeOS & driverKit once in llvm::Triple
53fe6060f1SDimitry Andric   }
54fe6060f1SDimitry Andric }
55fe6060f1SDimitry Andric 
mapToPlatformSet(ArrayRef<Triple> Targets)56fe6060f1SDimitry Andric PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
57fe6060f1SDimitry Andric   PlatformSet Result;
58fe6060f1SDimitry Andric   for (const auto &Target : Targets)
5904eeddc0SDimitry Andric     Result.insert(mapToPlatformType(Target));
60fe6060f1SDimitry Andric   return Result;
61fe6060f1SDimitry Andric }
62fe6060f1SDimitry Andric 
getPlatformName(PlatformType Platform)6304eeddc0SDimitry Andric StringRef getPlatformName(PlatformType Platform) {
64fe6060f1SDimitry Andric   switch (Platform) {
655f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
665f757f3fSDimitry Andric                  marketing)                                                    \
675f757f3fSDimitry Andric   case PLATFORM_##platform:                                                    \
685f757f3fSDimitry Andric     return #marketing;
695f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
70fe6060f1SDimitry Andric   }
7104eeddc0SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
72fe6060f1SDimitry Andric }
73fe6060f1SDimitry Andric 
getPlatformFromName(StringRef Name)7404eeddc0SDimitry Andric PlatformType getPlatformFromName(StringRef Name) {
7504eeddc0SDimitry Andric   return StringSwitch<PlatformType>(Name)
7606c3fb27SDimitry Andric       .Case("osx", PLATFORM_MACOS)
775f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
785f757f3fSDimitry Andric                  marketing)                                                    \
795f757f3fSDimitry Andric   .Case(#target, PLATFORM_##platform)
805f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
8104eeddc0SDimitry Andric       .Default(PLATFORM_UNKNOWN);
82fe6060f1SDimitry Andric }
83fe6060f1SDimitry Andric 
getOSAndEnvironmentName(PlatformType Platform,std::string Version)8404eeddc0SDimitry Andric std::string getOSAndEnvironmentName(PlatformType Platform,
85fe6060f1SDimitry Andric                                     std::string Version) {
86fe6060f1SDimitry Andric   switch (Platform) {
8704eeddc0SDimitry Andric   case PLATFORM_UNKNOWN:
88fe6060f1SDimitry Andric     return "darwin" + Version;
8904eeddc0SDimitry Andric   case PLATFORM_MACOS:
90fe6060f1SDimitry Andric     return "macos" + Version;
9104eeddc0SDimitry Andric   case PLATFORM_IOS:
92fe6060f1SDimitry Andric     return "ios" + Version;
9304eeddc0SDimitry Andric   case PLATFORM_TVOS:
94fe6060f1SDimitry Andric     return "tvos" + Version;
9504eeddc0SDimitry Andric   case PLATFORM_WATCHOS:
96fe6060f1SDimitry Andric     return "watchos" + Version;
9704eeddc0SDimitry Andric   case PLATFORM_BRIDGEOS:
98fe6060f1SDimitry Andric     return "bridgeos" + Version;
9904eeddc0SDimitry Andric   case PLATFORM_MACCATALYST:
100fe6060f1SDimitry Andric     return "ios" + Version + "-macabi";
10104eeddc0SDimitry Andric   case PLATFORM_IOSSIMULATOR:
102fe6060f1SDimitry Andric     return "ios" + Version + "-simulator";
10304eeddc0SDimitry Andric   case PLATFORM_TVOSSIMULATOR:
104fe6060f1SDimitry Andric     return "tvos" + Version + "-simulator";
10504eeddc0SDimitry Andric   case PLATFORM_WATCHOSSIMULATOR:
106fe6060f1SDimitry Andric     return "watchos" + Version + "-simulator";
10704eeddc0SDimitry Andric   case PLATFORM_DRIVERKIT:
108fe6060f1SDimitry Andric     return "driverkit" + Version;
109*7a6dacacSDimitry Andric   case PLATFORM_XROS:
110*7a6dacacSDimitry Andric     return "xros" + Version;
111*7a6dacacSDimitry Andric   case PLATFORM_XROS_SIMULATOR:
112*7a6dacacSDimitry Andric     return "xros" + Version + "-simulator";
113fe6060f1SDimitry Andric   }
11404eeddc0SDimitry Andric   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
115fe6060f1SDimitry Andric }
116fe6060f1SDimitry Andric 
mapToSupportedOSVersion(const Triple & Triple)11706c3fb27SDimitry Andric VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
11806c3fb27SDimitry Andric   const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
11906c3fb27SDimitry Andric   if (MinSupportedOS > Triple.getOSVersion())
12006c3fb27SDimitry Andric     return MinSupportedOS;
12106c3fb27SDimitry Andric   return Triple.getOSVersion();
12206c3fb27SDimitry Andric }
12306c3fb27SDimitry Andric 
124fe6060f1SDimitry Andric } // end namespace MachO.
125fe6060f1SDimitry Andric } // end namespace llvm.
126