blob: 699fb5f4587adb7e4fd28178bfcd71d1ed51321d [file] [log] [blame]
Juergen Ributzka32cb5942019-03-22 22:46:52 +00001//===- 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/MachO/Architecture.h"
14#include "llvm/ADT/StringSwitch.h"
15#include "llvm/BinaryFormat/MachO.h"
16
17namespace llvm {
18namespace MachO {
19
20Architecture getArchitectureFromCpuType(uint32_t CPUType, uint32_t CPUSubType) {
Cyndy Ishidabc408362019-09-11 21:35:28 +000021#define ARCHINFO(Arch, Type, Subtype) \
Juergen Ributzka32cb5942019-03-22 22:46:52 +000022 if (CPUType == (Type) && \
23 (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) == (Subtype)) \
Juergen Ributzka875565e2019-04-04 22:56:50 +000024 return AK_##Arch;
Juergen Ributzka32cb5942019-03-22 22:46:52 +000025#include "llvm/TextAPI/MachO/Architecture.def"
26#undef ARCHINFO
27
Juergen Ributzka875565e2019-04-04 22:56:50 +000028 return AK_unknown;
Juergen Ributzka32cb5942019-03-22 22:46:52 +000029}
30
31Architecture getArchitectureFromName(StringRef Name) {
32 return StringSwitch<Architecture>(Name)
Cyndy Ishidabc408362019-09-11 21:35:28 +000033#define ARCHINFO(Arch, Type, Subtype) .Case(#Arch, AK_##Arch)
Juergen Ributzka32cb5942019-03-22 22:46:52 +000034#include "llvm/TextAPI/MachO/Architecture.def"
35#undef ARCHINFO
Juergen Ributzka875565e2019-04-04 22:56:50 +000036 .Default(AK_unknown);
Juergen Ributzka32cb5942019-03-22 22:46:52 +000037}
38
39StringRef getArchitectureName(Architecture Arch) {
40 switch (Arch) {
Cyndy Ishidabc408362019-09-11 21:35:28 +000041#define ARCHINFO(Arch, Type, Subtype) \
Juergen Ributzka875565e2019-04-04 22:56:50 +000042 case AK_##Arch: \
Juergen Ributzka32cb5942019-03-22 22:46:52 +000043 return #Arch;
44#include "llvm/TextAPI/MachO/Architecture.def"
45#undef ARCHINFO
Juergen Ributzka875565e2019-04-04 22:56:50 +000046 case AK_unknown:
Juergen Ributzka32cb5942019-03-22 22:46:52 +000047 return "unknown";
48 }
49
50 // Appease some compilers that cannot figure out that this is a fully covered
51 // switch statement.
52 return "unknown";
53}
54
55std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch) {
56 switch (Arch) {
Cyndy Ishidabc408362019-09-11 21:35:28 +000057#define ARCHINFO(Arch, Type, Subtype) \
Juergen Ributzka875565e2019-04-04 22:56:50 +000058 case AK_##Arch: \
Juergen Ributzka32cb5942019-03-22 22:46:52 +000059 return std::make_pair(Type, Subtype);
60#include "llvm/TextAPI/MachO/Architecture.def"
61#undef ARCHINFO
Juergen Ributzka875565e2019-04-04 22:56:50 +000062 case AK_unknown:
Juergen Ributzka32cb5942019-03-22 22:46:52 +000063 return std::make_pair(0, 0);
64 }
65
66 // Appease some compilers that cannot figure out that this is a fully covered
67 // switch statement.
68 return std::make_pair(0, 0);
69}
70
Cyndy Ishida81669d52019-09-20 14:32:34 +000071Architecture mapToArchitecture(const Triple &Target) {
72 return getArchitectureFromName(Target.getArchName());
73}
74
Juergen Ributzka32cb5942019-03-22 22:46:52 +000075raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) {
76 OS << getArchitectureName(Arch);
77 return OS;
78}
79
80} // end namespace MachO.
81} // end namespace llvm.