1fe6060f1SDimitry Andric //===- llvm/TextAPI/Platform.cpp - Platform ---------------------*- C++ -*-===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric //
9fe6060f1SDimitry Andric // Implementations of Platform Helper functions.
10fe6060f1SDimitry Andric //
11fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
12fe6060f1SDimitry Andric
13fe6060f1SDimitry Andric #include "llvm/TextAPI/Platform.h"
14fe6060f1SDimitry Andric #include "llvm/ADT/ArrayRef.h"
15fe6060f1SDimitry Andric #include "llvm/ADT/StringSwitch.h"
1606c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
17fe6060f1SDimitry Andric
18fe6060f1SDimitry Andric namespace llvm {
19fe6060f1SDimitry Andric namespace MachO {
20fe6060f1SDimitry Andric
mapToPlatformType(PlatformType Platform,bool WantSim)2104eeddc0SDimitry Andric PlatformType mapToPlatformType(PlatformType Platform, bool WantSim) {
22fe6060f1SDimitry Andric switch (Platform) {
23fe6060f1SDimitry Andric default:
24fe6060f1SDimitry Andric return Platform;
2504eeddc0SDimitry Andric case PLATFORM_IOS:
2604eeddc0SDimitry Andric return WantSim ? PLATFORM_IOSSIMULATOR : PLATFORM_IOS;
2704eeddc0SDimitry Andric case PLATFORM_TVOS:
2804eeddc0SDimitry Andric return WantSim ? PLATFORM_TVOSSIMULATOR : PLATFORM_TVOS;
2904eeddc0SDimitry Andric case PLATFORM_WATCHOS:
3004eeddc0SDimitry Andric return WantSim ? PLATFORM_WATCHOSSIMULATOR : PLATFORM_WATCHOS;
31fe6060f1SDimitry Andric }
32fe6060f1SDimitry Andric }
33fe6060f1SDimitry Andric
mapToPlatformType(const Triple & Target)3404eeddc0SDimitry Andric PlatformType mapToPlatformType(const Triple &Target) {
35fe6060f1SDimitry Andric switch (Target.getOS()) {
36fe6060f1SDimitry Andric default:
3704eeddc0SDimitry Andric return PLATFORM_UNKNOWN;
38fe6060f1SDimitry Andric case Triple::MacOSX:
3904eeddc0SDimitry Andric return PLATFORM_MACOS;
40fe6060f1SDimitry Andric case Triple::IOS:
41fe6060f1SDimitry Andric if (Target.isSimulatorEnvironment())
4204eeddc0SDimitry Andric return PLATFORM_IOSSIMULATOR;
43fe6060f1SDimitry Andric if (Target.getEnvironment() == Triple::MacABI)
4404eeddc0SDimitry Andric return PLATFORM_MACCATALYST;
4504eeddc0SDimitry Andric return PLATFORM_IOS;
46fe6060f1SDimitry Andric case Triple::TvOS:
4704eeddc0SDimitry Andric return Target.isSimulatorEnvironment() ? PLATFORM_TVOSSIMULATOR
4804eeddc0SDimitry Andric : PLATFORM_TVOS;
49fe6060f1SDimitry Andric case Triple::WatchOS:
5004eeddc0SDimitry Andric return Target.isSimulatorEnvironment() ? PLATFORM_WATCHOSSIMULATOR
5104eeddc0SDimitry Andric : PLATFORM_WATCHOS;
52fe6060f1SDimitry Andric // TODO: add bridgeOS & driverKit once in llvm::Triple
53fe6060f1SDimitry Andric }
54fe6060f1SDimitry Andric }
55fe6060f1SDimitry Andric
mapToPlatformSet(ArrayRef<Triple> Targets)56fe6060f1SDimitry Andric PlatformSet mapToPlatformSet(ArrayRef<Triple> Targets) {
57fe6060f1SDimitry Andric PlatformSet Result;
58fe6060f1SDimitry Andric for (const auto &Target : Targets)
5904eeddc0SDimitry Andric Result.insert(mapToPlatformType(Target));
60fe6060f1SDimitry Andric return Result;
61fe6060f1SDimitry Andric }
62fe6060f1SDimitry Andric
getPlatformName(PlatformType Platform)6304eeddc0SDimitry Andric StringRef getPlatformName(PlatformType Platform) {
64fe6060f1SDimitry Andric switch (Platform) {
655f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target, \
665f757f3fSDimitry Andric marketing) \
675f757f3fSDimitry Andric case PLATFORM_##platform: \
685f757f3fSDimitry Andric return #marketing;
695f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
70fe6060f1SDimitry Andric }
7104eeddc0SDimitry Andric llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
72fe6060f1SDimitry Andric }
73fe6060f1SDimitry Andric
getPlatformFromName(StringRef Name)7404eeddc0SDimitry Andric PlatformType getPlatformFromName(StringRef Name) {
7504eeddc0SDimitry Andric return StringSwitch<PlatformType>(Name)
7606c3fb27SDimitry Andric .Case("osx", PLATFORM_MACOS)
775f757f3fSDimitry Andric #define PLATFORM(platform, id, name, build_name, target, tapi_target, \
785f757f3fSDimitry Andric marketing) \
795f757f3fSDimitry Andric .Case(#target, PLATFORM_##platform)
805f757f3fSDimitry Andric #include "llvm/BinaryFormat/MachO.def"
8104eeddc0SDimitry Andric .Default(PLATFORM_UNKNOWN);
82fe6060f1SDimitry Andric }
83fe6060f1SDimitry Andric
getOSAndEnvironmentName(PlatformType Platform,std::string Version)8404eeddc0SDimitry Andric std::string getOSAndEnvironmentName(PlatformType Platform,
85fe6060f1SDimitry Andric std::string Version) {
86fe6060f1SDimitry Andric switch (Platform) {
8704eeddc0SDimitry Andric case PLATFORM_UNKNOWN:
88fe6060f1SDimitry Andric return "darwin" + Version;
8904eeddc0SDimitry Andric case PLATFORM_MACOS:
90fe6060f1SDimitry Andric return "macos" + Version;
9104eeddc0SDimitry Andric case PLATFORM_IOS:
92fe6060f1SDimitry Andric return "ios" + Version;
9304eeddc0SDimitry Andric case PLATFORM_TVOS:
94fe6060f1SDimitry Andric return "tvos" + Version;
9504eeddc0SDimitry Andric case PLATFORM_WATCHOS:
96fe6060f1SDimitry Andric return "watchos" + Version;
9704eeddc0SDimitry Andric case PLATFORM_BRIDGEOS:
98fe6060f1SDimitry Andric return "bridgeos" + Version;
9904eeddc0SDimitry Andric case PLATFORM_MACCATALYST:
100fe6060f1SDimitry Andric return "ios" + Version + "-macabi";
10104eeddc0SDimitry Andric case PLATFORM_IOSSIMULATOR:
102fe6060f1SDimitry Andric return "ios" + Version + "-simulator";
10304eeddc0SDimitry Andric case PLATFORM_TVOSSIMULATOR:
104fe6060f1SDimitry Andric return "tvos" + Version + "-simulator";
10504eeddc0SDimitry Andric case PLATFORM_WATCHOSSIMULATOR:
106fe6060f1SDimitry Andric return "watchos" + Version + "-simulator";
10704eeddc0SDimitry Andric case PLATFORM_DRIVERKIT:
108fe6060f1SDimitry Andric return "driverkit" + Version;
109*7a6dacacSDimitry Andric case PLATFORM_XROS:
110*7a6dacacSDimitry Andric return "xros" + Version;
111*7a6dacacSDimitry Andric case PLATFORM_XROS_SIMULATOR:
112*7a6dacacSDimitry Andric return "xros" + Version + "-simulator";
113fe6060f1SDimitry Andric }
11404eeddc0SDimitry Andric llvm_unreachable("Unknown llvm::MachO::PlatformType enum");
115fe6060f1SDimitry Andric }
116fe6060f1SDimitry Andric
mapToSupportedOSVersion(const Triple & Triple)11706c3fb27SDimitry Andric VersionTuple mapToSupportedOSVersion(const Triple &Triple) {
11806c3fb27SDimitry Andric const VersionTuple MinSupportedOS = Triple.getMinimumSupportedOSVersion();
11906c3fb27SDimitry Andric if (MinSupportedOS > Triple.getOSVersion())
12006c3fb27SDimitry Andric return MinSupportedOS;
12106c3fb27SDimitry Andric return Triple.getOSVersion();
12206c3fb27SDimitry Andric }
12306c3fb27SDimitry Andric
124fe6060f1SDimitry Andric } // end namespace MachO.
125fe6060f1SDimitry Andric } // end namespace llvm.
126