1 //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Implementations of Platform Helper functions.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/TextAPI/Platform.h"
14 #include "llvm/ADT/ArrayRef.h"
15 #include "llvm/ADT/StringSwitch.h"
16 #include "llvm/TargetParser/Triple.h"
17 
18 namespace llvm {
19 namespace MachO {
20 
21 PlatformType mapToPlatformType(PlatformType Platform, bool WantSim) {
22   switch (Platform) {
23   default:
24     return Platform;
25   case PLATFORM_IOS:
26     return WantSim ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
27   case PLATFORM_TVOS:
28     return WantSim ? PLATFORM_TVOSSIMULATOR : PLATFORM_TVOS;
29   case PLATFORM_WATCHOS:
30     return WantSim ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
31   }
32 }
33 
34 PlatformType mapToPlatformType(const Triple &Target) {
35   switch (Target.getOS()) {
36   default:
37     return PLATFORM_UNKNOWN;
38   case Triple::MacOSX:
39     return PLATFORM_MACOS;
40   case Triple::IOS:
41     if (Target.isSimulatorEnvironment())
42       return PLATFORM_IOSSIMULATOR;
43     if (Target.getEnvironment() == Triple::MacABI)
44       return PLATFORM_MACCATALYST;
45     return PLATFORM_IOS;
46   case Triple::TvOS:
47     return Target.isSimulatorEnvironment() ? PLATFORM_TVOSSIMULATOR
48                                            : PLATFORM_TVOS;
49   case Triple::WatchOS:
50     return Target.isSimulatorEnvironment() ? PLATFORM_WATCHOSSIMULATOR
51                                            : PLATFORM_WATCHOS;
52     // TODO: add bridgeOS & driverKit once in llvm::Triple
53   }
54 }
55 
56 PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
57   PlatformSet Result;
58   for (const auto &Target : Targets)
59     Result.insert(mapToPlatformType(Target));
60   return Result;
61 }
62 
63 StringRef getPlatformName(PlatformType Platform) {
64   switch (Platform) {
65   case PLATFORM_UNKNOWN:
66     return "unknown";
67   case PLATFORM_MACOS:
68     return "macOS";
69   case PLATFORM_IOS:
70     return "iOS";
71   case PLATFORM_TVOS:
72     return "tvOS";
73   case PLATFORM_WATCHOS:
74     return "watchOS";
75   case PLATFORM_BRIDGEOS:
76     return "bridgeOS";
77   case PLATFORM_MACCATALYST:
78     return "macCatalyst";
79   case PLATFORM_IOSSIMULATOR:
80     return "iOS Simulator";
81   case PLATFORM_TVOSSIMULATOR:
82     return "tvOS Simulator";
83   case PLATFORM_WATCHOSSIMULATOR:
84     return "watchOS Simulator";
85   case PLATFORM_DRIVERKIT:
86     return "DriverKit";
87   }
88   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
89 }
90 
91 PlatformType getPlatformFromName(StringRef Name) {
92   return StringSwitch<PlatformType>(Name)
93       .Case("osx", PLATFORM_MACOS)
94       .Case("macos", PLATFORM_MACOS)
95       .Case("ios", PLATFORM_IOS)
96       .Case("tvos", PLATFORM_TVOS)
97       .Case("watchos", PLATFORM_WATCHOS)
98       .Case("bridgeos", PLATFORM_BRIDGEOS)
99       .Case("ios-macabi", PLATFORM_MACCATALYST)
100       .Case("ios-simulator", PLATFORM_IOSSIMULATOR)
101       .Case("tvos-simulator", PLATFORM_TVOSSIMULATOR)
102       .Case("watchos-simulator", PLATFORM_WATCHOSSIMULATOR)
103       .Case("driverkit", PLATFORM_DRIVERKIT)
104       .Default(PLATFORM_UNKNOWN);
105 }
106 
107 std::string getOSAndEnvironmentName(PlatformType Platform,
108                                     std::string Version) {
109   switch (Platform) {
110   case PLATFORM_UNKNOWN:
111     return "darwin" + Version;
112   case PLATFORM_MACOS:
113     return "macos" + Version;
114   case PLATFORM_IOS:
115     return "ios" + Version;
116   case PLATFORM_TVOS:
117     return "tvos" + Version;
118   case PLATFORM_WATCHOS:
119     return "watchos" + Version;
120   case PLATFORM_BRIDGEOS:
121     return "bridgeos" + Version;
122   case PLATFORM_MACCATALYST:
123     return "ios" + Version + "-macabi";
124   case PLATFORM_IOSSIMULATOR:
125     return "ios" + Version + "-simulator";
126   case PLATFORM_TVOSSIMULATOR:
127     return "tvos" + Version + "-simulator";
128   case PLATFORM_WATCHOSSIMULATOR:
129     return "watchos" + Version + "-simulator";
130   case PLATFORM_DRIVERKIT:
131     return "driverkit" + Version;
132   }
133   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
134 }
135 
136 VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
137   const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
138   if (MinSupportedOS > Triple.getOSVersion())
139     return MinSupportedOS;
140   return Triple.getOSVersion();
141 }
142 
143 } // end namespace MachO.
144 } // end namespace llvm.
145