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