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