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