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