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