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 #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
66                  marketing)                                                    \
67   case PLATFORM_##platform:                                                    \
68     return #marketing;
69 #include "llvm/BinaryFormat/MachO.def"
70   }
71   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
72 }
73 
74 PlatformType getPlatformFromName(StringRef Name) {
75   return StringSwitch<PlatformType>(Name)
76       .Case("osx", PLATFORM_MACOS)
77 #define PLATFORM(platform, id, name, build_name, target, tapi_target,          \
78                  marketing)                                                    \
79   .Case(#target, PLATFORM_##platform)
80 #include "llvm/BinaryFormat/MachO.def"
81       .Default(PLATFORM_UNKNOWN);
82 }
83 
84 std::string getOSAndEnvironmentName(PlatformType Platform,
85                                     std::string Version) {
86   switch (Platform) {
87   case PLATFORM_UNKNOWN:
88     return "darwin" + Version;
89   case PLATFORM_MACOS:
90     return "macos" + Version;
91   case PLATFORM_IOS:
92     return "ios" + Version;
93   case PLATFORM_TVOS:
94     return "tvos" + Version;
95   case PLATFORM_WATCHOS:
96     return "watchos" + Version;
97   case PLATFORM_BRIDGEOS:
98     return "bridgeos" + Version;
99   case PLATFORM_MACCATALYST:
100     return "ios" + Version + "-macabi";
101   case PLATFORM_IOSSIMULATOR:
102     return "ios" + Version + "-simulator";
103   case PLATFORM_TVOSSIMULATOR:
104     return "tvos" + Version + "-simulator";
105   case PLATFORM_WATCHOSSIMULATOR:
106     return "watchos" + Version + "-simulator";
107   case PLATFORM_DRIVERKIT:
108     return "driverkit" + Version;
109   case PLATFORM_XROS:
110     return "xros" + Version;
111   case PLATFORM_XROS_SIMULATOR:
112     return "xros" + Version + "-simulator";
113   }
114   llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
115 }
116 
117 VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
118   const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
119   if (MinSupportedOS > Triple.getOSVersion())
120     return MinSupportedOS;
121   return Triple.getOSVersion();
122 }
123 
124 } // end namespace MachO.
125 } // end namespace llvm.
126