10116d04dSCyndy Ishida //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
20116d04dSCyndy Ishida //
30116d04dSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40116d04dSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
50116d04dSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60116d04dSCyndy Ishida //
70116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
80116d04dSCyndy Ishida //
90116d04dSCyndy Ishida // Implementations of Platform Helper functions.
100116d04dSCyndy Ishida //
110116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
120116d04dSCyndy Ishida 
130116d04dSCyndy Ishida #include "llvm/TextAPI/Platform.h"
140116d04dSCyndy Ishida #include "llvm/ADT/ArrayRef.h"
15*c4ed142eSCyndy Ishida #include "llvm/ADT/StringSwitch.h"
160116d04dSCyndy Ishida #include "llvm/ADT/Triple.h"
170116d04dSCyndy Ishida 
180116d04dSCyndy Ishida namespace llvm {
190116d04dSCyndy Ishida namespace MachO {
200116d04dSCyndy Ishida 
210116d04dSCyndy Ishida PlatformKind mapToPlatformKind(PlatformKind Platform, bool WantSim) {
220116d04dSCyndy Ishida   switch (Platform) {
230116d04dSCyndy Ishida   default:
240116d04dSCyndy Ishida     return Platform;
250116d04dSCyndy Ishida   case PlatformKind::iOS:
260116d04dSCyndy Ishida     return WantSim ? PlatformKind::iOSSimulator : PlatformKind::iOS;
270116d04dSCyndy Ishida   case PlatformKind::tvOS:
280116d04dSCyndy Ishida     return WantSim ? PlatformKind::tvOSSimulator : PlatformKind::tvOS;
290116d04dSCyndy Ishida   case PlatformKind::watchOS:
300116d04dSCyndy Ishida     return WantSim ? PlatformKind::watchOSSimulator : PlatformKind::watchOS;
310116d04dSCyndy Ishida   }
320116d04dSCyndy Ishida   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
330116d04dSCyndy Ishida }
340116d04dSCyndy Ishida 
350116d04dSCyndy Ishida PlatformKind mapToPlatformKind(const Triple &Target) {
360116d04dSCyndy Ishida   switch (Target.getOS()) {
370116d04dSCyndy Ishida   default:
380116d04dSCyndy Ishida     return PlatformKind::unknown;
390116d04dSCyndy Ishida   case Triple::MacOSX:
400116d04dSCyndy Ishida     return PlatformKind::macOS;
410116d04dSCyndy Ishida   case Triple::IOS:
420116d04dSCyndy Ishida     if (Target.isSimulatorEnvironment())
430116d04dSCyndy Ishida       return PlatformKind::iOSSimulator;
440116d04dSCyndy Ishida     if (Target.getEnvironment() == Triple::MacABI)
450116d04dSCyndy Ishida       return PlatformKind::macCatalyst;
460116d04dSCyndy Ishida     return PlatformKind::iOS;
470116d04dSCyndy Ishida   case Triple::TvOS:
480116d04dSCyndy Ishida     return Target.isSimulatorEnvironment() ? PlatformKind::tvOSSimulator
490116d04dSCyndy Ishida                                            : PlatformKind::tvOS;
500116d04dSCyndy Ishida   case Triple::WatchOS:
510116d04dSCyndy Ishida     return Target.isSimulatorEnvironment() ? PlatformKind::watchOSSimulator
520116d04dSCyndy Ishida                                            : PlatformKind::watchOS;
530116d04dSCyndy Ishida     // TODO: add bridgeOS & driverKit once in llvm::Triple
540116d04dSCyndy Ishida   }
550116d04dSCyndy Ishida   llvm_unreachable("Unknown Target Triple");
560116d04dSCyndy Ishida }
570116d04dSCyndy Ishida 
580116d04dSCyndy Ishida PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
590116d04dSCyndy Ishida   PlatformSet Result;
600116d04dSCyndy Ishida   for (const auto &Target : Targets)
610116d04dSCyndy Ishida     Result.insert(mapToPlatformKind(Target));
620116d04dSCyndy Ishida   return Result;
630116d04dSCyndy Ishida }
640116d04dSCyndy Ishida 
650116d04dSCyndy Ishida StringRef getPlatformName(PlatformKind Platform) {
660116d04dSCyndy Ishida   switch (Platform) {
670116d04dSCyndy Ishida   case PlatformKind::unknown:
680116d04dSCyndy Ishida     return "unknown";
690116d04dSCyndy Ishida   case PlatformKind::macOS:
700116d04dSCyndy Ishida     return "macOS";
710116d04dSCyndy Ishida   case PlatformKind::iOS:
720116d04dSCyndy Ishida     return "iOS";
730116d04dSCyndy Ishida   case PlatformKind::tvOS:
740116d04dSCyndy Ishida     return "tvOS";
750116d04dSCyndy Ishida   case PlatformKind::watchOS:
760116d04dSCyndy Ishida     return "watchOS";
770116d04dSCyndy Ishida   case PlatformKind::bridgeOS:
780116d04dSCyndy Ishida     return "bridgeOS";
790116d04dSCyndy Ishida   case PlatformKind::macCatalyst:
800116d04dSCyndy Ishida     return "macCatalyst";
810116d04dSCyndy Ishida   case PlatformKind::iOSSimulator:
820116d04dSCyndy Ishida     return "iOS Simulator";
830116d04dSCyndy Ishida   case PlatformKind::tvOSSimulator:
840116d04dSCyndy Ishida     return "tvOS Simulator";
850116d04dSCyndy Ishida   case PlatformKind::watchOSSimulator:
860116d04dSCyndy Ishida     return "watchOS Simulator";
870116d04dSCyndy Ishida   case PlatformKind::driverKit:
880116d04dSCyndy Ishida     return "DriverKit";
890116d04dSCyndy Ishida   }
900116d04dSCyndy Ishida   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
910116d04dSCyndy Ishida }
920116d04dSCyndy Ishida 
93*c4ed142eSCyndy Ishida PlatformKind getPlatformFromName(StringRef Name) {
94*c4ed142eSCyndy Ishida   return StringSwitch<PlatformKind>(Name)
95*c4ed142eSCyndy Ishida       .Case("macos", PlatformKind::macOS)
96*c4ed142eSCyndy Ishida       .Case("ios", PlatformKind::iOS)
97*c4ed142eSCyndy Ishida       .Case("tvos", PlatformKind::tvOS)
98*c4ed142eSCyndy Ishida       .Case("watchos", PlatformKind::watchOS)
99*c4ed142eSCyndy Ishida       .Case("bridgeos", PlatformKind::macOS)
100*c4ed142eSCyndy Ishida       .Case("ios-macabi", PlatformKind::macCatalyst)
101*c4ed142eSCyndy Ishida       .Case("ios-simulator", PlatformKind::iOSSimulator)
102*c4ed142eSCyndy Ishida       .Case("tvos-simulator", PlatformKind::tvOSSimulator)
103*c4ed142eSCyndy Ishida       .Case("watchos-simulator", PlatformKind::watchOSSimulator)
104*c4ed142eSCyndy Ishida       .Case("driverkit", PlatformKind::driverKit)
105*c4ed142eSCyndy Ishida       .Default(PlatformKind::unknown);
106*c4ed142eSCyndy Ishida }
107*c4ed142eSCyndy Ishida 
1080116d04dSCyndy Ishida } // end namespace MachO.
1090116d04dSCyndy Ishida } // end namespace llvm.
110