1*5f7ddb14SDimitry Andric //===- Target.cpp -----------------------------------------------*- C++ -*-===//
2*5f7ddb14SDimitry Andric //
3*5f7ddb14SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5f7ddb14SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*5f7ddb14SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5f7ddb14SDimitry Andric //
7*5f7ddb14SDimitry Andric //===----------------------------------------------------------------------===//
8*5f7ddb14SDimitry Andric 
9*5f7ddb14SDimitry Andric #include "llvm/TextAPI/Target.h"
10*5f7ddb14SDimitry Andric #include "llvm/ADT/SmallString.h"
11*5f7ddb14SDimitry Andric #include "llvm/ADT/SmallVector.h"
12*5f7ddb14SDimitry Andric #include "llvm/ADT/StringExtras.h"
13*5f7ddb14SDimitry Andric #include "llvm/ADT/StringSwitch.h"
14*5f7ddb14SDimitry Andric #include "llvm/Support/Format.h"
15*5f7ddb14SDimitry Andric #include "llvm/Support/raw_ostream.h"
16*5f7ddb14SDimitry Andric 
17*5f7ddb14SDimitry Andric namespace llvm {
18*5f7ddb14SDimitry Andric namespace MachO {
19*5f7ddb14SDimitry Andric 
create(StringRef TargetValue)20*5f7ddb14SDimitry Andric Expected<Target> Target::create(StringRef TargetValue) {
21*5f7ddb14SDimitry Andric   auto Result = TargetValue.split('-');
22*5f7ddb14SDimitry Andric   auto ArchitectureStr = Result.first;
23*5f7ddb14SDimitry Andric   auto Architecture = getArchitectureFromName(ArchitectureStr);
24*5f7ddb14SDimitry Andric   auto PlatformStr = Result.second;
25*5f7ddb14SDimitry Andric   PlatformKind Platform;
26*5f7ddb14SDimitry Andric   Platform = StringSwitch<PlatformKind>(PlatformStr)
27*5f7ddb14SDimitry Andric                  .Case("macos", PlatformKind::macOS)
28*5f7ddb14SDimitry Andric                  .Case("ios", PlatformKind::iOS)
29*5f7ddb14SDimitry Andric                  .Case("tvos", PlatformKind::tvOS)
30*5f7ddb14SDimitry Andric                  .Case("watchos", PlatformKind::watchOS)
31*5f7ddb14SDimitry Andric                  .Case("bridgeos", PlatformKind::bridgeOS)
32*5f7ddb14SDimitry Andric                  .Case("maccatalyst", PlatformKind::macCatalyst)
33*5f7ddb14SDimitry Andric                  .Case("ios-simulator", PlatformKind::iOSSimulator)
34*5f7ddb14SDimitry Andric                  .Case("tvos-simulator", PlatformKind::tvOSSimulator)
35*5f7ddb14SDimitry Andric                  .Case("watchos-simulator", PlatformKind::watchOSSimulator)
36*5f7ddb14SDimitry Andric                  .Case("driverkit", PlatformKind::driverKit)
37*5f7ddb14SDimitry Andric                  .Default(PlatformKind::unknown);
38*5f7ddb14SDimitry Andric 
39*5f7ddb14SDimitry Andric   if (Platform == PlatformKind::unknown) {
40*5f7ddb14SDimitry Andric     if (PlatformStr.startswith("<") && PlatformStr.endswith(">")) {
41*5f7ddb14SDimitry Andric       PlatformStr = PlatformStr.drop_front().drop_back();
42*5f7ddb14SDimitry Andric       unsigned long long RawValue;
43*5f7ddb14SDimitry Andric       if (!PlatformStr.getAsInteger(10, RawValue))
44*5f7ddb14SDimitry Andric         Platform = (PlatformKind)RawValue;
45*5f7ddb14SDimitry Andric     }
46*5f7ddb14SDimitry Andric   }
47*5f7ddb14SDimitry Andric 
48*5f7ddb14SDimitry Andric   return Target{Architecture, Platform};
49*5f7ddb14SDimitry Andric }
50*5f7ddb14SDimitry Andric 
operator std::string() const51*5f7ddb14SDimitry Andric Target::operator std::string() const {
52*5f7ddb14SDimitry Andric   return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) + ")")
53*5f7ddb14SDimitry Andric       .str();
54*5f7ddb14SDimitry Andric }
55*5f7ddb14SDimitry Andric 
operator <<(raw_ostream & OS,const Target & Target)56*5f7ddb14SDimitry Andric raw_ostream &operator<<(raw_ostream &OS, const Target &Target) {
57*5f7ddb14SDimitry Andric   OS << std::string(Target);
58*5f7ddb14SDimitry Andric   return OS;
59*5f7ddb14SDimitry Andric }
60*5f7ddb14SDimitry Andric 
mapToPlatformSet(ArrayRef<Target> Targets)61*5f7ddb14SDimitry Andric PlatformSet mapToPlatformSet(ArrayRef<Target> Targets) {
62*5f7ddb14SDimitry Andric   PlatformSet Result;
63*5f7ddb14SDimitry Andric   for (const auto &Target : Targets)
64*5f7ddb14SDimitry Andric     Result.insert(Target.Platform);
65*5f7ddb14SDimitry Andric   return Result;
66*5f7ddb14SDimitry Andric }
67*5f7ddb14SDimitry Andric 
mapToArchitectureSet(ArrayRef<Target> Targets)68*5f7ddb14SDimitry Andric ArchitectureSet mapToArchitectureSet(ArrayRef<Target> Targets) {
69*5f7ddb14SDimitry Andric   ArchitectureSet Result;
70*5f7ddb14SDimitry Andric   for (const auto &Target : Targets)
71*5f7ddb14SDimitry Andric     Result.set(Target.Arch);
72*5f7ddb14SDimitry Andric   return Result;
73*5f7ddb14SDimitry Andric }
74*5f7ddb14SDimitry Andric 
getTargetTripleName(const Target & Targ)75*5f7ddb14SDimitry Andric std::string getTargetTripleName(const Target &Targ) {
76*5f7ddb14SDimitry Andric   return (getArchitectureName(Targ.Arch) + "-apple-" +
77*5f7ddb14SDimitry Andric           getOSAndEnvironmentName(Targ.Platform))
78*5f7ddb14SDimitry Andric       .str();
79*5f7ddb14SDimitry Andric }
80*5f7ddb14SDimitry Andric 
81*5f7ddb14SDimitry Andric } // end namespace MachO.
82*5f7ddb14SDimitry Andric } // end namespace llvm.
83