xref: /llvm-project/llvm/lib/TextAPI/Target.cpp (revision 586ecdf205aa8b3d162da6f955170a6736656615)
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