1*0116d04dSCyndy Ishida //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
2*0116d04dSCyndy Ishida //
3*0116d04dSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0116d04dSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
5*0116d04dSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0116d04dSCyndy Ishida //
7*0116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
8*0116d04dSCyndy Ishida //
9*0116d04dSCyndy Ishida // Implementations of Platform Helper functions.
10*0116d04dSCyndy Ishida //
11*0116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
12*0116d04dSCyndy Ishida 
13*0116d04dSCyndy Ishida #include "llvm/TextAPI/Platform.h"
14*0116d04dSCyndy Ishida #include "llvm/ADT/ArrayRef.h"
15*0116d04dSCyndy Ishida #include "llvm/ADT/Triple.h"
16*0116d04dSCyndy Ishida 
17*0116d04dSCyndy Ishida namespace llvm {
18*0116d04dSCyndy Ishida namespace MachO {
19*0116d04dSCyndy Ishida 
20*0116d04dSCyndy Ishida PlatformKind mapToPlatformKind(PlatformKind Platform, bool WantSim) {
21*0116d04dSCyndy Ishida   switch (Platform) {
22*0116d04dSCyndy Ishida   default:
23*0116d04dSCyndy Ishida     return Platform;
24*0116d04dSCyndy Ishida   case PlatformKind::iOS:
25*0116d04dSCyndy Ishida     return WantSim ? PlatformKind::iOSSimulator : PlatformKind::iOS;
26*0116d04dSCyndy Ishida   case PlatformKind::tvOS:
27*0116d04dSCyndy Ishida     return WantSim ? PlatformKind::tvOSSimulator : PlatformKind::tvOS;
28*0116d04dSCyndy Ishida   case PlatformKind::watchOS:
29*0116d04dSCyndy Ishida     return WantSim ? PlatformKind::watchOSSimulator : PlatformKind::watchOS;
30*0116d04dSCyndy Ishida   }
31*0116d04dSCyndy Ishida   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
32*0116d04dSCyndy Ishida }
33*0116d04dSCyndy Ishida 
34*0116d04dSCyndy Ishida PlatformKind mapToPlatformKind(const Triple &Target) {
35*0116d04dSCyndy Ishida   switch (Target.getOS()) {
36*0116d04dSCyndy Ishida   default:
37*0116d04dSCyndy Ishida     return PlatformKind::unknown;
38*0116d04dSCyndy Ishida   case Triple::MacOSX:
39*0116d04dSCyndy Ishida     return PlatformKind::macOS;
40*0116d04dSCyndy Ishida   case Triple::IOS:
41*0116d04dSCyndy Ishida     if (Target.isSimulatorEnvironment())
42*0116d04dSCyndy Ishida       return PlatformKind::iOSSimulator;
43*0116d04dSCyndy Ishida     if (Target.getEnvironment() == Triple::MacABI)
44*0116d04dSCyndy Ishida       return PlatformKind::macCatalyst;
45*0116d04dSCyndy Ishida     return PlatformKind::iOS;
46*0116d04dSCyndy Ishida   case Triple::TvOS:
47*0116d04dSCyndy Ishida     return Target.isSimulatorEnvironment() ? PlatformKind::tvOSSimulator
48*0116d04dSCyndy Ishida                                            : PlatformKind::tvOS;
49*0116d04dSCyndy Ishida   case Triple::WatchOS:
50*0116d04dSCyndy Ishida     return Target.isSimulatorEnvironment() ? PlatformKind::watchOSSimulator
51*0116d04dSCyndy Ishida                                            : PlatformKind::watchOS;
52*0116d04dSCyndy Ishida     // TODO: add bridgeOS & driverKit once in llvm::Triple
53*0116d04dSCyndy Ishida   }
54*0116d04dSCyndy Ishida   llvm_unreachable("Unknown Target Triple");
55*0116d04dSCyndy Ishida }
56*0116d04dSCyndy Ishida 
57*0116d04dSCyndy Ishida PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
58*0116d04dSCyndy Ishida   PlatformSet Result;
59*0116d04dSCyndy Ishida   for (const auto &Target : Targets)
60*0116d04dSCyndy Ishida     Result.insert(mapToPlatformKind(Target));
61*0116d04dSCyndy Ishida   return Result;
62*0116d04dSCyndy Ishida }
63*0116d04dSCyndy Ishida 
64*0116d04dSCyndy Ishida StringRef getPlatformName(PlatformKind Platform) {
65*0116d04dSCyndy Ishida   switch (Platform) {
66*0116d04dSCyndy Ishida   case PlatformKind::unknown:
67*0116d04dSCyndy Ishida     return "unknown";
68*0116d04dSCyndy Ishida   case PlatformKind::macOS:
69*0116d04dSCyndy Ishida     return "macOS";
70*0116d04dSCyndy Ishida   case PlatformKind::iOS:
71*0116d04dSCyndy Ishida     return "iOS";
72*0116d04dSCyndy Ishida   case PlatformKind::tvOS:
73*0116d04dSCyndy Ishida     return "tvOS";
74*0116d04dSCyndy Ishida   case PlatformKind::watchOS:
75*0116d04dSCyndy Ishida     return "watchOS";
76*0116d04dSCyndy Ishida   case PlatformKind::bridgeOS:
77*0116d04dSCyndy Ishida     return "bridgeOS";
78*0116d04dSCyndy Ishida   case PlatformKind::macCatalyst:
79*0116d04dSCyndy Ishida     return "macCatalyst";
80*0116d04dSCyndy Ishida   case PlatformKind::iOSSimulator:
81*0116d04dSCyndy Ishida     return "iOS Simulator";
82*0116d04dSCyndy Ishida   case PlatformKind::tvOSSimulator:
83*0116d04dSCyndy Ishida     return "tvOS Simulator";
84*0116d04dSCyndy Ishida   case PlatformKind::watchOSSimulator:
85*0116d04dSCyndy Ishida     return "watchOS Simulator";
86*0116d04dSCyndy Ishida   case PlatformKind::driverKit:
87*0116d04dSCyndy Ishida     return "DriverKit";
88*0116d04dSCyndy Ishida   }
89*0116d04dSCyndy Ishida   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
90*0116d04dSCyndy Ishida }
91*0116d04dSCyndy Ishida 
92*0116d04dSCyndy Ishida } // end namespace MachO.
93*0116d04dSCyndy Ishida } // end namespace llvm.
94