10116d04dSCyndy Ishida //===- Target.cpp -----------------------------------------------*- C++ -*-===//
20116d04dSCyndy Ishida //
30116d04dSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40116d04dSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
50116d04dSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60116d04dSCyndy Ishida //
70116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
80116d04dSCyndy Ishida 
90116d04dSCyndy Ishida #include "llvm/TextAPI/Target.h"
100116d04dSCyndy Ishida #include "llvm/ADT/SmallString.h"
110116d04dSCyndy Ishida #include "llvm/ADT/SmallVector.h"
120116d04dSCyndy Ishida #include "llvm/ADT/StringExtras.h"
130116d04dSCyndy Ishida #include "llvm/ADT/StringSwitch.h"
140116d04dSCyndy Ishida #include "llvm/Support/Format.h"
150116d04dSCyndy Ishida #include "llvm/Support/raw_ostream.h"
160116d04dSCyndy Ishida 
170116d04dSCyndy Ishida namespace llvm {
180116d04dSCyndy Ishida namespace MachO {
190116d04dSCyndy Ishida 
200116d04dSCyndy Ishida Expected<Target> Target::create(StringRef TargetValue) {
210116d04dSCyndy Ishida   auto Result = TargetValue.split('-');
220116d04dSCyndy Ishida   auto ArchitectureStr = Result.first;
230116d04dSCyndy Ishida   auto Architecture = getArchitectureFromName(ArchitectureStr);
240116d04dSCyndy Ishida   auto PlatformStr = Result.second;
250116d04dSCyndy Ishida   PlatformKind Platform;
260116d04dSCyndy Ishida   Platform = StringSwitch<PlatformKind>(PlatformStr)
270116d04dSCyndy Ishida                  .Case("macos", PlatformKind::macOS)
280116d04dSCyndy Ishida                  .Case("ios", PlatformKind::iOS)
290116d04dSCyndy Ishida                  .Case("tvos", PlatformKind::tvOS)
300116d04dSCyndy Ishida                  .Case("watchos", PlatformKind::watchOS)
310116d04dSCyndy Ishida                  .Case("bridgeos", PlatformKind::bridgeOS)
320116d04dSCyndy Ishida                  .Case("maccatalyst", PlatformKind::macCatalyst)
330116d04dSCyndy Ishida                  .Case("ios-simulator", PlatformKind::iOSSimulator)
340116d04dSCyndy Ishida                  .Case("tvos-simulator", PlatformKind::tvOSSimulator)
350116d04dSCyndy Ishida                  .Case("watchos-simulator", PlatformKind::watchOSSimulator)
360116d04dSCyndy Ishida                  .Case("driverkit", PlatformKind::driverKit)
370116d04dSCyndy Ishida                  .Default(PlatformKind::unknown);
380116d04dSCyndy Ishida 
390116d04dSCyndy Ishida   if (Platform == PlatformKind::unknown) {
400116d04dSCyndy Ishida     if (PlatformStr.startswith("<") && PlatformStr.endswith(">")) {
410116d04dSCyndy Ishida       PlatformStr = PlatformStr.drop_front().drop_back();
420116d04dSCyndy Ishida       unsigned long long RawValue;
430116d04dSCyndy Ishida       if (!PlatformStr.getAsInteger(10, RawValue))
440116d04dSCyndy Ishida         Platform = (PlatformKind)RawValue;
450116d04dSCyndy Ishida     }
460116d04dSCyndy Ishida   }
470116d04dSCyndy Ishida 
480116d04dSCyndy Ishida   return Target{Architecture, Platform};
490116d04dSCyndy Ishida }
500116d04dSCyndy Ishida 
510116d04dSCyndy Ishida Target::operator std::string() const {
520116d04dSCyndy Ishida   return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) + ")")
530116d04dSCyndy Ishida       .str();
540116d04dSCyndy Ishida }
550116d04dSCyndy Ishida 
560116d04dSCyndy Ishida raw_ostream &operator<<(raw_ostream &OS, const Target &Target) {
570116d04dSCyndy Ishida   OS << std::string(Target);
580116d04dSCyndy Ishida   return OS;
590116d04dSCyndy Ishida }
600116d04dSCyndy Ishida 
610116d04dSCyndy Ishida PlatformSet mapToPlatformSet(ArrayRef<Target> Targets) {
620116d04dSCyndy Ishida   PlatformSet Result;
630116d04dSCyndy Ishida   for (const auto &Target : Targets)
640116d04dSCyndy Ishida     Result.insert(Target.Platform);
650116d04dSCyndy Ishida   return Result;
660116d04dSCyndy Ishida }
670116d04dSCyndy Ishida 
680116d04dSCyndy Ishida ArchitectureSet mapToArchitectureSet(ArrayRef<Target> Targets) {
690116d04dSCyndy Ishida   ArchitectureSet Result;
700116d04dSCyndy Ishida   for (const auto &Target : Targets)
710116d04dSCyndy Ishida     Result.set(Target.Arch);
720116d04dSCyndy Ishida   return Result;
730116d04dSCyndy Ishida }
740116d04dSCyndy Ishida 
75*5b5ab80eSSam Powell std::string getTargetTripleName(const Target &Targ) {
76*5b5ab80eSSam Powell   return (getArchitectureName(Targ.Arch) + "-apple-" +
77*5b5ab80eSSam Powell           getOSAndEnvironmentName(Targ.Platform))
78*5b5ab80eSSam Powell       .str();
79*5b5ab80eSSam Powell }
80*5b5ab80eSSam Powell 
810116d04dSCyndy Ishida } // end namespace MachO.
820116d04dSCyndy Ishida } // end namespace llvm.
83