brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 3b53067 Raw
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