1 //===- llvm/TextAPI/MachO/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/ADT/ArrayRef.h"
14 #include "llvm/ADT/Triple.h"
15 #include "llvm/TextAPI/MachO/Platform.h"
16 
17 namespace llvm {
18 namespace MachO {
19 
mapToPlatformKind(PlatformKind Platform,bool WantSim)20 PlatformKind mapToPlatformKind(PlatformKind Platform, bool WantSim) {
21   switch (Platform) {
22   default:
23     return Platform;
24   case PlatformKind::iOS:
25     return WantSim ? PlatformKind::iOSSimulator : PlatformKind::iOS;
26   case PlatformKind::tvOS:
27     return WantSim ? PlatformKind::tvOSSimulator : PlatformKind::tvOS;
28   case PlatformKind::watchOS:
29     return WantSim ? PlatformKind::watchOSSimulator : PlatformKind::watchOS;
30   }
31   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
32 }
33 
mapToPlatformKind(const Triple & Target)34 PlatformKind mapToPlatformKind(const Triple &Target) {
35   switch (Target.getOS()) {
36   default:
37     return PlatformKind::unknown;
38   case Triple::MacOSX:
39     return PlatformKind::macOS;
40   case Triple::IOS:
41     if (Target.isSimulatorEnvironment())
42       return PlatformKind::iOSSimulator;
43     if (Target.getEnvironment() == Triple::MacABI)
44       return PlatformKind::macCatalyst;
45     return PlatformKind::iOS;
46   case Triple::TvOS:
47     return Target.isSimulatorEnvironment() ? PlatformKind::tvOSSimulator
48                                            : PlatformKind::tvOS;
49   case Triple::WatchOS:
50     return Target.isSimulatorEnvironment() ? PlatformKind::watchOSSimulator
51                                            : PlatformKind::watchOS;
52     // TODO: add bridgeOS once in llvm::Triple
53   }
54   llvm_unreachable("Unknown Target Triple");
55 }
56 
mapToPlatformSet(ArrayRef<Triple> Targets)57 PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
58   PlatformSet Result;
59   for (const auto &Target : Targets)
60     Result.insert(mapToPlatformKind(Target));
61   return Result;
62 }
63 
getPlatformName(PlatformKind Platform)64 StringRef getPlatformName(PlatformKind Platform) {
65   switch (Platform) {
66   case PlatformKind::unknown:
67     return "unknown";
68   case PlatformKind::macOS:
69     return "macOS";
70   case PlatformKind::iOS:
71     return "iOS";
72   case PlatformKind::tvOS:
73     return "tvOS";
74   case PlatformKind::watchOS:
75     return "watchOS";
76   case PlatformKind::bridgeOS:
77     return "bridgeOS";
78   case PlatformKind::macCatalyst:
79     return "macCatalyst";
80   case PlatformKind::iOSSimulator:
81     return "iOS Simulator";
82   case PlatformKind::tvOSSimulator:
83     return "tvOS Simulator";
84   case PlatformKind::watchOSSimulator:
85     return "watchOS Simulator";
86   }
87   llvm_unreachable("Unknown llvm.MachO.PlatformKind enum");
88 }
89 
90 } // end namespace MachO.
91 } // end namespace llvm.
92