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/StringSwitch.h"
11*b48e3782Sserge-sans-paille #include "llvm/ADT/Twine.h"
120116d04dSCyndy Ishida #include "llvm/Support/raw_ostream.h"
130116d04dSCyndy Ishida 
140116d04dSCyndy Ishida namespace llvm {
150116d04dSCyndy Ishida namespace MachO {
160116d04dSCyndy Ishida 
create(StringRef TargetValue)170116d04dSCyndy Ishida Expected<Target> Target::create(StringRef TargetValue) {
180116d04dSCyndy Ishida   auto Result = TargetValue.split('-');
190116d04dSCyndy Ishida   auto ArchitectureStr = Result.first;
200116d04dSCyndy Ishida   auto Architecture = getArchitectureFromName(ArchitectureStr);
210116d04dSCyndy Ishida   auto PlatformStr = Result.second;
223025c3edSJuergen Ributzka   PlatformType Platform;
233025c3edSJuergen Ributzka   Platform = StringSwitch<PlatformType>(PlatformStr)
243025c3edSJuergen Ributzka                  .Case("macos", PLATFORM_MACOS)
253025c3edSJuergen Ributzka                  .Case("ios", PLATFORM_IOS)
263025c3edSJuergen Ributzka                  .Case("tvos", PLATFORM_TVOS)
273025c3edSJuergen Ributzka                  .Case("watchos", PLATFORM_WATCHOS)
283025c3edSJuergen Ributzka                  .Case("bridgeos", PLATFORM_BRIDGEOS)
293025c3edSJuergen Ributzka                  .Case("maccatalyst", PLATFORM_MACCATALYST)
303025c3edSJuergen Ributzka                  .Case("ios-simulator", PLATFORM_IOSSIMULATOR)
313025c3edSJuergen Ributzka                  .Case("tvos-simulator", PLATFORM_TVOSSIMULATOR)
323025c3edSJuergen Ributzka                  .Case("watchos-simulator", PLATFORM_WATCHOSSIMULATOR)
333025c3edSJuergen Ributzka                  .Case("driverkit", PLATFORM_DRIVERKIT)
343025c3edSJuergen Ributzka                  .Default(PLATFORM_UNKNOWN);
350116d04dSCyndy Ishida 
363025c3edSJuergen Ributzka   if (Platform == PLATFORM_UNKNOWN) {
370116d04dSCyndy Ishida     if (PlatformStr.startswith("<") && PlatformStr.endswith(">")) {
380116d04dSCyndy Ishida       PlatformStr = PlatformStr.drop_front().drop_back();
390116d04dSCyndy Ishida       unsigned long long RawValue;
400116d04dSCyndy Ishida       if (!PlatformStr.getAsInteger(10, RawValue))
413025c3edSJuergen Ributzka         Platform = (PlatformType)RawValue;
420116d04dSCyndy Ishida     }
430116d04dSCyndy Ishida   }
440116d04dSCyndy Ishida 
450116d04dSCyndy Ishida   return Target{Architecture, Platform};
460116d04dSCyndy Ishida }
470116d04dSCyndy Ishida 
operator std::string() const480116d04dSCyndy Ishida Target::operator std::string() const {
490116d04dSCyndy Ishida   return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) + ")")
500116d04dSCyndy Ishida       .str();
510116d04dSCyndy Ishida }
520116d04dSCyndy Ishida 
operator <<(raw_ostream & OS,const Target & Target)530116d04dSCyndy Ishida raw_ostream &operator<<(raw_ostream &OS, const Target &Target) {
540116d04dSCyndy Ishida   OS << std::string(Target);
550116d04dSCyndy Ishida   return OS;
560116d04dSCyndy Ishida }
570116d04dSCyndy Ishida 
mapToPlatformSet(ArrayRef<Target> Targets)580116d04dSCyndy Ishida PlatformSet mapToPlatformSet(ArrayRef<Target> Targets) {
590116d04dSCyndy Ishida   PlatformSet Result;
600116d04dSCyndy Ishida   for (const auto &Target : Targets)
610116d04dSCyndy Ishida     Result.insert(Target.Platform);
620116d04dSCyndy Ishida   return Result;
630116d04dSCyndy Ishida }
640116d04dSCyndy Ishida 
mapToArchitectureSet(ArrayRef<Target> Targets)650116d04dSCyndy Ishida ArchitectureSet mapToArchitectureSet(ArrayRef<Target> Targets) {
660116d04dSCyndy Ishida   ArchitectureSet Result;
670116d04dSCyndy Ishida   for (const auto &Target : Targets)
680116d04dSCyndy Ishida     Result.set(Target.Arch);
690116d04dSCyndy Ishida   return Result;
700116d04dSCyndy Ishida }
710116d04dSCyndy Ishida 
getTargetTripleName(const Target & Targ)725b5ab80eSSam Powell std::string getTargetTripleName(const Target &Targ) {
735b5ab80eSSam Powell   return (getArchitectureName(Targ.Arch) + "-apple-" +
745b5ab80eSSam Powell           getOSAndEnvironmentName(Targ.Platform))
755b5ab80eSSam Powell       .str();
765b5ab80eSSam Powell }
775b5ab80eSSam Powell 
780116d04dSCyndy Ishida } // end namespace MachO.
790116d04dSCyndy Ishida } // end namespace llvm.
80