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