99 lines · cpp
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-exception6//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, Name, 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 ARCHINFO30 31 return AK_unknown;32}33 34Architecture getArchitectureFromName(StringRef Name) {35 return StringSwitch<Architecture>(Name)36#define ARCHINFO(Arch, Name, Type, Subtype, NumBits) .Case(#Name, AK_##Arch)37#include "llvm/TextAPI/Architecture.def"38#undef ARCHINFO39 .Default(AK_unknown);40}41 42StringRef getArchitectureName(Architecture Arch) {43 switch (Arch) {44#define ARCHINFO(Arch, Name, Type, Subtype, NumBits) \45 case AK_##Arch: \46 return #Name;47#include "llvm/TextAPI/Architecture.def"48#undef ARCHINFO49 case AK_unknown:50 return "unknown";51 }52 53 // Appease some compilers that cannot figure out that this is a fully covered54 // switch statement.55 return "unknown";56}57 58std::pair<uint32_t, uint32_t> getCPUTypeFromArchitecture(Architecture Arch) {59 switch (Arch) {60#define ARCHINFO(Arch, Name, Type, Subtype, NumBits) \61 case AK_##Arch: \62 return std::make_pair(Type, Subtype);63#include "llvm/TextAPI/Architecture.def"64#undef ARCHINFO65 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 covered70 // 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, Name, Type, Subtype, NumBits) \81 case AK_##Arch: \82 return NumBits == 64;83#include "llvm/TextAPI/Architecture.def"84#undef ARCHINFO85 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