//===- Architecture.cpp ---------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Implements the architecture helper functions. // //===----------------------------------------------------------------------===// #include "llvm/TextAPI/Architecture.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Triple.h" #include "llvm/BinaryFormat/MachO.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/ErrorHandling.h" namespace llvm { namespace MachO { Architecture getArchitectureFromCpuType(uint32_t CPUType, uint32_t CPUSubType) { #define ARCHINFO(Arch, Type, Subtype, NumBits) \ if (CPUType == (Type) && \ (CPUSubType & ~MachO::CPU_SUBTYPE_MASK) == (Subtype)) \ return AK_##Arch; #include "llvm/TextAPI/Architecture.def" #undef ARCHINFO return AK_unknown; } Architecture getArchitectureFromName(StringRef Name) { return StringSwitch(Name) #define ARCHINFO(Arch, Type, Subtype, NumBits) .Case(#Arch, AK_##Arch) #include "llvm/TextAPI/Architecture.def" #undef ARCHINFO .Default(AK_unknown); } StringRef getArchitectureName(Architecture Arch) { switch (Arch) { #define ARCHINFO(Arch, Type, Subtype, NumBits) \ case AK_##Arch: \ return #Arch; #include "llvm/TextAPI/Architecture.def" #undef ARCHINFO case AK_unknown: return "unknown"; } // Appease some compilers that cannot figure out that this is a fully covered // switch statement. return "unknown"; } std::pair getCPUTypeFromArchitecture(Architecture Arch) { switch (Arch) { #define ARCHINFO(Arch, Type, Subtype, NumBits) \ case AK_##Arch: \ return std::make_pair(Type, Subtype); #include "llvm/TextAPI/Architecture.def" #undef ARCHINFO case AK_unknown: return std::make_pair(0, 0); } // Appease some compilers that cannot figure out that this is a fully covered // switch statement. return std::make_pair(0, 0); } Architecture mapToArchitecture(const Triple &Target) { return getArchitectureFromName(Target.getArchName()); } bool is64Bit(Architecture Arch) { switch (Arch) { #define ARCHINFO(Arch, Type, Subtype, NumBits) \ case AK_##Arch: \ return NumBits == 64; #include "llvm/TextAPI/Architecture.def" #undef ARCHINFO case AK_unknown: return false; } llvm_unreachable("Fully handled switch case above."); } raw_ostream &operator<<(raw_ostream &OS, Architecture Arch) { OS << getArchitectureName(Arch); return OS; } } // end namespace MachO. } // end namespace llvm.