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