xref: /llvm-project/llvm/lib/TextAPI/Architecture.cpp (revision 62c7f035b4392c1933550eead6ddab35122720bc)
10116d04dSCyndy Ishida //===- Architecture.cpp ---------------------------------------------------===//
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 // Implements the architecture helper functions.
100116d04dSCyndy Ishida //
110116d04dSCyndy Ishida //===----------------------------------------------------------------------===//
120116d04dSCyndy Ishida 
130116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.h"
140116d04dSCyndy Ishida #include "llvm/ADT/StringSwitch.h"
150116d04dSCyndy Ishida #include "llvm/BinaryFormat/MachO.h"
16b48e3782Sserge-sans-paille #include "llvm/Support/ErrorHandling.h"
17*62c7f035SArchibald Elliott #include "llvm/Support/raw_ostream.h"
18*62c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h"
190116d04dSCyndy Ishida 
200116d04dSCyndy Ishida namespace llvm {
210116d04dSCyndy Ishida namespace MachO {
220116d04dSCyndy Ishida 
getArchitectureFromCpuType(uint32_t CPUType,uint32_t CPUSubType)230116d04dSCyndy Ishida Architecture getArchitectureFromCpuType(uint32_t CPUType, uint32_t CPUSubType) {
240116d04dSCyndy Ishida #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
250116d04dSCyndy Ishida   if (CPUType == (Type) &&                                                     \
260116d04dSCyndy Ishida       (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) == (Subtype))                    \
270116d04dSCyndy Ishida     return AK_##Arch;
280116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.def"
290116d04dSCyndy Ishida #undef ARCHINFO
300116d04dSCyndy Ishida 
310116d04dSCyndy Ishida   return AK_unknown;
320116d04dSCyndy Ishida }
330116d04dSCyndy Ishida 
getArchitectureFromName(StringRef Name)340116d04dSCyndy Ishida Architecture getArchitectureFromName(StringRef Name) {
350116d04dSCyndy Ishida   return StringSwitch<Architecture>(Name)
360116d04dSCyndy Ishida #define ARCHINFO(Arch, Type, Subtype, NumBits) .Case(#Arch, AK_##Arch)
370116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.def"
380116d04dSCyndy Ishida #undef ARCHINFO
390116d04dSCyndy Ishida       .Default(AK_unknown);
400116d04dSCyndy Ishida }
410116d04dSCyndy Ishida 
getArchitectureName(Architecture Arch)420116d04dSCyndy Ishida StringRef getArchitectureName(Architecture Arch) {
430116d04dSCyndy Ishida   switch (Arch) {
440116d04dSCyndy Ishida #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
450116d04dSCyndy Ishida   case AK_##Arch:                                                              \
460116d04dSCyndy Ishida     return #Arch;
470116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.def"
480116d04dSCyndy Ishida #undef ARCHINFO
490116d04dSCyndy Ishida   case AK_unknown:
500116d04dSCyndy Ishida     return "unknown";
510116d04dSCyndy Ishida   }
520116d04dSCyndy Ishida 
530116d04dSCyndy Ishida   // Appease some compilers that cannot figure out that this is a fully covered
540116d04dSCyndy Ishida   // switch statement.
550116d04dSCyndy Ishida   return "unknown";
560116d04dSCyndy Ishida }
570116d04dSCyndy Ishida 
getCPUTypeFromArchitecture(Architecture Arch)580116d04dSCyndy Ishida std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch) {
590116d04dSCyndy Ishida   switch (Arch) {
600116d04dSCyndy Ishida #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
610116d04dSCyndy Ishida   case AK_##Arch:                                                              \
620116d04dSCyndy Ishida     return std::make_pair(Type, Subtype);
630116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.def"
640116d04dSCyndy Ishida #undef ARCHINFO
650116d04dSCyndy Ishida   case AK_unknown:
660116d04dSCyndy Ishida     return std::make_pair(0, 0);
670116d04dSCyndy Ishida   }
680116d04dSCyndy Ishida 
690116d04dSCyndy Ishida   // Appease some compilers that cannot figure out that this is a fully covered
700116d04dSCyndy Ishida   // switch statement.
710116d04dSCyndy Ishida   return std::make_pair(0, 0);
720116d04dSCyndy Ishida }
730116d04dSCyndy Ishida 
mapToArchitecture(const Triple & Target)740116d04dSCyndy Ishida Architecture mapToArchitecture(const Triple &Target) {
750116d04dSCyndy Ishida   return getArchitectureFromName(Target.getArchName());
760116d04dSCyndy Ishida }
770116d04dSCyndy Ishida 
is64Bit(Architecture Arch)780116d04dSCyndy Ishida bool is64Bit(Architecture Arch) {
790116d04dSCyndy Ishida   switch (Arch) {
800116d04dSCyndy Ishida #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
810116d04dSCyndy Ishida   case AK_##Arch:                                                              \
820116d04dSCyndy Ishida     return NumBits == 64;
830116d04dSCyndy Ishida #include "llvm/TextAPI/Architecture.def"
840116d04dSCyndy Ishida #undef ARCHINFO
850116d04dSCyndy Ishida   case AK_unknown:
860116d04dSCyndy Ishida     return false;
870116d04dSCyndy Ishida   }
880116d04dSCyndy Ishida 
890116d04dSCyndy Ishida   llvm_unreachable("Fully handled switch case above.");
900116d04dSCyndy Ishida }
910116d04dSCyndy Ishida 
operator <<(raw_ostream & OS,Architecture Arch)920116d04dSCyndy Ishida raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) {
930116d04dSCyndy Ishida   OS << getArchitectureName(Arch);
940116d04dSCyndy Ishida   return OS;
950116d04dSCyndy Ishida }
960116d04dSCyndy Ishida 
970116d04dSCyndy Ishida } // end namespace MachO.
980116d04dSCyndy Ishida } // end namespace llvm.
99