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