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