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; 25*3025c3edSJuergen Ributzka PlatformType Platform; 26*3025c3edSJuergen Ributzka Platform = StringSwitch<PlatformType>(PlatformStr) 27*3025c3edSJuergen Ributzka .Case("macos", PLATFORM_MACOS) 28*3025c3edSJuergen Ributzka .Case("ios", PLATFORM_IOS) 29*3025c3edSJuergen Ributzka .Case("tvos", PLATFORM_TVOS) 30*3025c3edSJuergen Ributzka .Case("watchos", PLATFORM_WATCHOS) 31*3025c3edSJuergen Ributzka .Case("bridgeos", PLATFORM_BRIDGEOS) 32*3025c3edSJuergen Ributzka .Case("maccatalyst", PLATFORM_MACCATALYST) 33*3025c3edSJuergen Ributzka .Case("ios-simulator", PLATFORM_IOSSIMULATOR) 34*3025c3edSJuergen Ributzka .Case("tvos-simulator", PLATFORM_TVOSSIMULATOR) 35*3025c3edSJuergen Ributzka .Case("watchos-simulator", PLATFORM_WATCHOSSIMULATOR) 36*3025c3edSJuergen Ributzka .Case("driverkit", PLATFORM_DRIVERKIT) 37*3025c3edSJuergen Ributzka .Default(PLATFORM_UNKNOWN); 380116d04dSCyndy Ishida 39*3025c3edSJuergen Ributzka if (Platform == PLATFORM_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)) 44*3025c3edSJuergen Ributzka Platform = (PlatformType)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 755b5ab80eSSam Powell std::string getTargetTripleName(const Target &Targ) { 765b5ab80eSSam Powell return (getArchitectureName(Targ.Arch) + "-apple-" + 775b5ab80eSSam Powell getOSAndEnvironmentName(Targ.Platform)) 785b5ab80eSSam Powell .str(); 795b5ab80eSSam Powell } 805b5ab80eSSam Powell 810116d04dSCyndy Ishida } // end namespace MachO. 820116d04dSCyndy Ishida } // end namespace llvm. 83