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