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