xref: /src/contrib/llvm-project/llvm/lib/TextAPI/Architecture.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1e6d15924SDimitry Andric //===- Architecture.cpp ---------------------------------------------------===//
2e6d15924SDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e6d15924SDimitry Andric //
7e6d15924SDimitry Andric //===----------------------------------------------------------------------===//
8e6d15924SDimitry Andric //
9e6d15924SDimitry Andric // Implements the architecture helper functions.
10e6d15924SDimitry Andric //
11e6d15924SDimitry Andric //===----------------------------------------------------------------------===//
12e6d15924SDimitry Andric 
13344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.h"
14e6d15924SDimitry Andric #include "llvm/ADT/StringSwitch.h"
15e6d15924SDimitry Andric #include "llvm/BinaryFormat/MachO.h"
166f8fc217SDimitry Andric #include "llvm/Support/ErrorHandling.h"
177fa27ce4SDimitry Andric #include "llvm/Support/raw_ostream.h"
187fa27ce4SDimitry Andric #include "llvm/TargetParser/Triple.h"
19e6d15924SDimitry Andric 
20e6d15924SDimitry Andric namespace llvm {
21e6d15924SDimitry Andric namespace MachO {
22e6d15924SDimitry Andric 
getArchitectureFromCpuType(uint32_t CPUType,uint32_t CPUSubType)23e6d15924SDimitry Andric Architecture getArchitectureFromCpuType(uint32_t CPUType, uint32_t CPUSubType) {
24cfca06d7SDimitry Andric #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
25e6d15924SDimitry Andric   if (CPUType == (Type) &&                                                     \
26e6d15924SDimitry Andric       (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) == (Subtype))                    \
27e6d15924SDimitry Andric     return AK_##Arch;
28344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.def"
29e6d15924SDimitry Andric #undef ARCHINFO
30e6d15924SDimitry Andric 
31e6d15924SDimitry Andric   return AK_unknown;
32e6d15924SDimitry Andric }
33e6d15924SDimitry Andric 
getArchitectureFromName(StringRef Name)34e6d15924SDimitry Andric Architecture getArchitectureFromName(StringRef Name) {
35e6d15924SDimitry Andric   return StringSwitch<Architecture>(Name)
36cfca06d7SDimitry Andric #define ARCHINFO(Arch, Type, Subtype, NumBits) .Case(#Arch, AK_##Arch)
37344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.def"
38e6d15924SDimitry Andric #undef ARCHINFO
39e6d15924SDimitry Andric       .Default(AK_unknown);
40e6d15924SDimitry Andric }
41e6d15924SDimitry Andric 
getArchitectureName(Architecture Arch)42e6d15924SDimitry Andric StringRef getArchitectureName(Architecture Arch) {
43e6d15924SDimitry Andric   switch (Arch) {
44cfca06d7SDimitry Andric #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
45e6d15924SDimitry Andric   case AK_##Arch:                                                              \
46e6d15924SDimitry Andric     return #Arch;
47344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.def"
48e6d15924SDimitry Andric #undef ARCHINFO
49e6d15924SDimitry Andric   case AK_unknown:
50e6d15924SDimitry Andric     return "unknown";
51e6d15924SDimitry Andric   }
52e6d15924SDimitry Andric 
53e6d15924SDimitry Andric   // Appease some compilers that cannot figure out that this is a fully covered
54e6d15924SDimitry Andric   // switch statement.
55e6d15924SDimitry Andric   return "unknown";
56e6d15924SDimitry Andric }
57e6d15924SDimitry Andric 
getCPUTypeFromArchitecture(Architecture Arch)58e6d15924SDimitry Andric std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch) {
59e6d15924SDimitry Andric   switch (Arch) {
60cfca06d7SDimitry Andric #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
61e6d15924SDimitry Andric   case AK_##Arch:                                                              \
62e6d15924SDimitry Andric     return std::make_pair(Type, Subtype);
63344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.def"
64e6d15924SDimitry Andric #undef ARCHINFO
65e6d15924SDimitry Andric   case AK_unknown:
66e6d15924SDimitry Andric     return std::make_pair(0, 0);
67e6d15924SDimitry Andric   }
68e6d15924SDimitry Andric 
69e6d15924SDimitry Andric   // Appease some compilers that cannot figure out that this is a fully covered
70e6d15924SDimitry Andric   // switch statement.
71e6d15924SDimitry Andric   return std::make_pair(0, 0);
72e6d15924SDimitry Andric }
73e6d15924SDimitry Andric 
mapToArchitecture(const Triple & Target)741d5ae102SDimitry Andric Architecture mapToArchitecture(const Triple &Target) {
751d5ae102SDimitry Andric   return getArchitectureFromName(Target.getArchName());
761d5ae102SDimitry Andric }
771d5ae102SDimitry Andric 
is64Bit(Architecture Arch)78cfca06d7SDimitry Andric bool is64Bit(Architecture Arch) {
79cfca06d7SDimitry Andric   switch (Arch) {
80cfca06d7SDimitry Andric #define ARCHINFO(Arch, Type, Subtype, NumBits)                                 \
81cfca06d7SDimitry Andric   case AK_##Arch:                                                              \
82cfca06d7SDimitry Andric     return NumBits == 64;
83344a3780SDimitry Andric #include "llvm/TextAPI/Architecture.def"
84cfca06d7SDimitry Andric #undef ARCHINFO
85cfca06d7SDimitry Andric   case AK_unknown:
86cfca06d7SDimitry Andric     return false;
87cfca06d7SDimitry Andric   }
88cfca06d7SDimitry Andric 
89cfca06d7SDimitry Andric   llvm_unreachable("Fully handled switch case above.");
90cfca06d7SDimitry Andric }
91cfca06d7SDimitry Andric 
operator <<(raw_ostream & OS,Architecture Arch)92e6d15924SDimitry Andric raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) {
93e6d15924SDimitry Andric   OS << getArchitectureName(Arch);
94e6d15924SDimitry Andric   return OS;
95e6d15924SDimitry Andric }
96e6d15924SDimitry Andric 
97e6d15924SDimitry Andric } // end namespace MachO.
98e6d15924SDimitry Andric } // end namespace llvm.
99