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"
11b48e3782Sserge-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)
24bde2e698SJuergen Ributzka #define PLATFORM(platform, id, name, build_name, target, tapi_target, \
25bde2e698SJuergen Ributzka marketing) \
26bde2e698SJuergen Ributzka .Case(#tapi_target, PLATFORM_##platform)
27bde2e698SJuergen Ributzka #include "llvm/BinaryFormat/MachO.def"
283025c3edSJuergen Ributzka .Default(PLATFORM_UNKNOWN);
290116d04dSCyndy Ishida
303025c3edSJuergen Ributzka if (Platform == PLATFORM_UNKNOWN) {
31*586ecdf2SKazu Hirata if (PlatformStr.starts_with("<") && PlatformStr.ends_with(">")) {
320116d04dSCyndy Ishida PlatformStr = PlatformStr.drop_front().drop_back();
330116d04dSCyndy Ishida unsigned long long RawValue;
340116d04dSCyndy Ishida if (!PlatformStr.getAsInteger(10, RawValue))
353025c3edSJuergen Ributzka Platform = (PlatformType)RawValue;
360116d04dSCyndy Ishida }
370116d04dSCyndy Ishida }
380116d04dSCyndy Ishida
390116d04dSCyndy Ishida return Target{Architecture, Platform};
400116d04dSCyndy Ishida }
410116d04dSCyndy Ishida
operator std::string() const420116d04dSCyndy Ishida Target::operator std::string() const {
43b70d87bcSCyndy Ishida auto Version = MinDeployment.empty() ? "" : MinDeployment.getAsString();
44b70d87bcSCyndy Ishida
45b70d87bcSCyndy Ishida return (getArchitectureName(Arch) + " (" + getPlatformName(Platform) +
46b70d87bcSCyndy Ishida Version + ")")
470116d04dSCyndy Ishida .str();
480116d04dSCyndy Ishida }
490116d04dSCyndy Ishida
operator <<(raw_ostream & OS,const Target & Target)500116d04dSCyndy Ishida raw_ostream &operator<<(raw_ostream &OS, const Target &Target) {
510116d04dSCyndy Ishida OS << std::string(Target);
520116d04dSCyndy Ishida return OS;
530116d04dSCyndy Ishida }
540116d04dSCyndy Ishida
mapToPlatformVersionSet(ArrayRef<Target> Targets)557de8cd61SCyndy Ishida PlatformVersionSet mapToPlatformVersionSet(ArrayRef<Target> Targets) {
567de8cd61SCyndy Ishida PlatformVersionSet Result;
577de8cd61SCyndy Ishida for (const auto &Target : Targets)
587de8cd61SCyndy Ishida Result.insert({Target.Platform, Target.MinDeployment});
597de8cd61SCyndy Ishida return Result;
607de8cd61SCyndy Ishida }
617de8cd61SCyndy Ishida
mapToPlatformSet(ArrayRef<Target> Targets)620116d04dSCyndy Ishida PlatformSet mapToPlatformSet(ArrayRef<Target> Targets) {
630116d04dSCyndy Ishida PlatformSet Result;
640116d04dSCyndy Ishida for (const auto &Target : Targets)
650116d04dSCyndy Ishida Result.insert(Target.Platform);
660116d04dSCyndy Ishida return Result;
670116d04dSCyndy Ishida }
680116d04dSCyndy Ishida
mapToArchitectureSet(ArrayRef<Target> Targets)690116d04dSCyndy Ishida ArchitectureSet mapToArchitectureSet(ArrayRef<Target> Targets) {
700116d04dSCyndy Ishida ArchitectureSet Result;
710116d04dSCyndy Ishida for (const auto &Target : Targets)
720116d04dSCyndy Ishida Result.set(Target.Arch);
730116d04dSCyndy Ishida return Result;
740116d04dSCyndy Ishida }
750116d04dSCyndy Ishida
getTargetTripleName(const Target & Targ)765b5ab80eSSam Powell std::string getTargetTripleName(const Target &Targ) {
77b70d87bcSCyndy Ishida auto Version =
78b70d87bcSCyndy Ishida Targ.MinDeployment.empty() ? "" : Targ.MinDeployment.getAsString();
79b70d87bcSCyndy Ishida
805b5ab80eSSam Powell return (getArchitectureName(Targ.Arch) + "-apple-" +
81b70d87bcSCyndy Ishida getOSAndEnvironmentName(Targ.Platform, Version))
825b5ab80eSSam Powell .str();
835b5ab80eSSam Powell }
845b5ab80eSSam Powell
850116d04dSCyndy Ishida } // end namespace MachO.
860116d04dSCyndy Ishida } // end namespace llvm.
87