99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- 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<Architecture>(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<uint32_t, uint32_t> 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.
 |