ArchSpec.cpp revision 5741df7a8ef5234b85c6308a623b839b6049421b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ArchSpec.cpp --------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ArchSpec.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224c4cc1585f6f7539771be2a8fa2e7ef7ccf08dEli Friedman#include <stdio.h> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton#include "llvm/Support/ELF.h" 17b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson#include "llvm/Support/Host.h" 18cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton#include "llvm/Support/MachO.h" 195741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton#include "lldb/Core/RegularExpression.h" 20395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Host/Endian.h" 21395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Host/Host.h" 22f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Target/Platform.h" 23cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#define ARCH_SPEC_SEPARATOR_CHAR '-' 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonnamespace lldb_private { 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton struct CoreDefinition 32940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 33940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ByteOrder default_byte_order; 34940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t addr_byte_size; 35889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t min_opcode_byte_size; 36889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t max_opcode_byte_size; 37940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::Triple::ArchType machine; 38940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchSpec::Core core; 39940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const char *name; 40940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton }; 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 43cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 44940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// This core information can be looked using the ArchSpec::Core as the index 45940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const CoreDefinition g_core_definitions[ArchSpec::kNumCores] = 46cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton{ 47889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_generic , "arm" }, 48889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4 , "armv4" }, 49889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4t , "armv4t" }, 50889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5 , "armv5" }, 51a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5e , "armv5e" }, 52889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5t , "armv5t" }, 53889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv6 , "armv6" }, 54889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7 , "armv7" }, 55889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7f , "armv7f" }, 56889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7k , "armv7k" }, 57889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7s , "armv7s" }, 58889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_xscale , "xscale" }, 59a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumb , "thumb" }, 60a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv4t , "thumbv4t" }, 61a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv5 , "thumbv5" }, 62a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv5e , "thumbv5e" }, 63a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv6 , "thumbv6" }, 64a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7 , "thumbv7" }, 65a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7f , "thumbv7f" }, 66a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7k , "thumbv7k" }, 67a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7s , "thumbv7s" }, 68a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton 69940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 70889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_generic , "ppc" }, 71889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc601 , "ppc601" }, 72889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc602 , "ppc602" }, 73889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603 , "ppc603" }, 74889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603e , "ppc603e" }, 75889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603ev , "ppc603ev" }, 76889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604 , "ppc604" }, 77889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604e , "ppc604e" }, 78889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc620 , "ppc620" }, 79889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc750 , "ppc750" }, 80889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7400 , "ppc7400" }, 81889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7450 , "ppc7450" }, 82889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc970 , "ppc970" }, 83940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 84889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_generic , "ppc64" }, 85889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_ppc970_64 , "ppc970-64" }, 86940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 87889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc , ArchSpec::eCore_sparc_generic , "sparc" }, 88889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9, ArchSpec::eCore_sparc9_generic , "sparcv9" }, 89940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 905e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i386 , "i386" }, 915e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486 , "i486" }, 925e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486sx , "i486sx" }, 93940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 945e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64 , ArchSpec::eCore_x86_64_x86_64 , "x86_64" } 95cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton}; 96cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 97940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstruct ArchDefinitionEntry 98940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 99940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchSpec::Core core; 100940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu; 101940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t sub; 102940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 103cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 104940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstruct ArchDefinition 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 106940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchitectureType type; 107940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton size_t num_entries; 108940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries; 109940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu_mask; 110940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t sub_mask; 111940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const char *name; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1155e342f50b42b265d8568e1c926328858e74b2c0aGreg Claytonuint32_t 1165e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonArchSpec::AutoComplete (const char *name, StringList &matches) 1175e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{ 1185e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton uint32_t i; 1195e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (name && name[0]) 1205e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1215e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton for (i = 0; i < ArchSpec::kNumCores; ++i) 1225e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1235e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (NameMatches(g_core_definitions[i].name, eNameMatchStartsWith, name)) 1245e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString (g_core_definitions[i].name); 1255e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1265e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1275e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton else 1285e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1295e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton for (i = 0; i < ArchSpec::kNumCores; ++i) 1305e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString (g_core_definitions[i].name); 1315e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1325e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return matches.GetSize(); 1335e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton} 1345e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 1355e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 1365e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 137940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#define CPU_ANY (UINT32_MAX) 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 140940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// A table that gets searched linearly for matches. This table is used to 141940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// convert cpu type and subtypes to architecture names, and to convert 142940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// architecture names to cpu types and subtypes. The ordering is important and 143940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// allows the precedence to be set when the table is built. 144940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry g_macho_arch_entries[] = 145940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 146940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , CPU_ANY }, 147940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , 0 }, 148940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_armv4 , llvm::MachO::CPUTypeARM , 5 }, 149a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_arm_armv4t , llvm::MachO::CPUTypeARM , 5 }, 150940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_armv6 , llvm::MachO::CPUTypeARM , 6 }, 151940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_armv5 , llvm::MachO::CPUTypeARM , 7 }, 152a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_arm_armv5e , llvm::MachO::CPUTypeARM , 7 }, 153a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_arm_armv5t , llvm::MachO::CPUTypeARM , 7 }, 154940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_xscale , llvm::MachO::CPUTypeARM , 8 }, 155940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_armv7 , llvm::MachO::CPUTypeARM , 9 }, 156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { ArchSpec::eCore_arm_armv7f , llvm::MachO::CPUTypeARM , 10 }, 157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { ArchSpec::eCore_arm_armv7k , llvm::MachO::CPUTypeARM , 12 }, 158b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { ArchSpec::eCore_arm_armv7s , llvm::MachO::CPUTypeARM , 11 }, 159a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumb , llvm::MachO::CPUTypeARM , 0 }, 160a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv4t , llvm::MachO::CPUTypeARM , 5 }, 161a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv5 , llvm::MachO::CPUTypeARM , 7 }, 162a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv5e , llvm::MachO::CPUTypeARM , 7 }, 163a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv6 , llvm::MachO::CPUTypeARM , 6 }, 164a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv7 , llvm::MachO::CPUTypeARM , 9 }, 165a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv7f , llvm::MachO::CPUTypeARM , 10 }, 166a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv7k , llvm::MachO::CPUTypeARM , 12 }, 167a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { ArchSpec::eCore_thumbv7s , llvm::MachO::CPUTypeARM , 11 }, 168940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , CPU_ANY }, 169940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , 0 }, 170940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc601 , llvm::MachO::CPUTypePowerPC , 1 }, 171940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc602 , llvm::MachO::CPUTypePowerPC , 2 }, 172940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc603 , llvm::MachO::CPUTypePowerPC , 3 }, 173940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc603e , llvm::MachO::CPUTypePowerPC , 4 }, 174940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc603ev , llvm::MachO::CPUTypePowerPC , 5 }, 175940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc604 , llvm::MachO::CPUTypePowerPC , 6 }, 176940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc604e , llvm::MachO::CPUTypePowerPC , 7 }, 177940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc620 , llvm::MachO::CPUTypePowerPC , 8 }, 178940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc750 , llvm::MachO::CPUTypePowerPC , 9 }, 179940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc7400 , llvm::MachO::CPUTypePowerPC , 10 }, 180940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc7450 , llvm::MachO::CPUTypePowerPC , 11 }, 181940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_ppc970 , llvm::MachO::CPUTypePowerPC , 100 }, 182940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc64_generic , llvm::MachO::CPUTypePowerPC64 , 0 }, 183940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc64_ppc970_64 , llvm::MachO::CPUTypePowerPC64 , 100 }, 184940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , 3 }, 185940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i486 , llvm::MachO::CPUTypeI386 , 4 }, 186940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i486sx , llvm::MachO::CPUTypeI386 , 0x84 }, 187940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , CPU_ANY }, 188940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , 3 }, 189f733b9376ed5e84dadcfe0c76f6d8bc128f4a90fJason Molenda { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , 4 }, 190940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , CPU_ANY } 191940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 192940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition g_macho_arch_def = { 193940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eArchTypeMachO, 194940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_macho_arch_entries)/sizeof(g_macho_arch_entries[0]), 195940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton g_macho_arch_entries, 196940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton UINT32_MAX, // CPU type mask 197940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 0x00FFFFFFu, // CPU subtype mask 198940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton "mach-o" 199940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 200cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 201940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 202940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// A table that gets searched linearly for matches. This table is used to 203940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// convert cpu type and subtypes to architecture names, and to convert 204940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// architecture names to cpu types and subtypes. The ordering is important and 205940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// allows the precedence to be set when the table is built. 206940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry g_elf_arch_entries[] = 207940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 208940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_sparc_generic , llvm::ELF::EM_SPARC , LLDB_INVALID_CPUTYPE }, // Sparc 209940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::ELF::EM_386 , LLDB_INVALID_CPUTYPE }, // Intel 80386 210940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_32_i486 , llvm::ELF::EM_486 , LLDB_INVALID_CPUTYPE }, // Intel 486 (deprecated) 211940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc_generic , llvm::ELF::EM_PPC , LLDB_INVALID_CPUTYPE }, // PowerPC 212940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_ppc64_generic , llvm::ELF::EM_PPC64 , LLDB_INVALID_CPUTYPE }, // PowerPC64 213940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_arm_generic , llvm::ELF::EM_ARM , LLDB_INVALID_CPUTYPE }, // ARM 214940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_sparc9_generic , llvm::ELF::EM_SPARCV9, LLDB_INVALID_CPUTYPE }, // SPARC V9 215940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::ELF::EM_X86_64 , LLDB_INVALID_CPUTYPE }, // AMD64 216cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton}; 217cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 218940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition g_elf_arch_def = { 219940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eArchTypeELF, 220940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_elf_arch_entries)/sizeof(g_elf_arch_entries[0]), 221940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton g_elf_arch_entries, 222940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton UINT32_MAX, // CPU type mask 223940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton UINT32_MAX, // CPU subtype mask 224940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton "elf", 225940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 226cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 227940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 228940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Table of all ArchDefinitions 229940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition *g_arch_definitions[] = { 230940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton &g_macho_arch_def, 231940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton &g_elf_arch_def, 232940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 234940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const size_t k_num_arch_definitions = 235940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_arch_definitions) / sizeof(g_arch_definitions[0]); 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 237940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 238940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Static helper functions. 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 240940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 241940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get the architecture definition for a given object type. 242940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition * 243940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinition (ArchitectureType arch_type) 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 245940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (unsigned int i = 0; i < k_num_arch_definitions; ++i) 246940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 247940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinition *def = g_arch_definitions[i]; 248940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def->type == arch_type) 249940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return def; 250940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 251940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get an architecture definition by name. 255940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const CoreDefinition * 256940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindCoreDefinition (llvm::StringRef name) 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 258940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (unsigned int i = 0; i < ArchSpec::kNumCores; ++i) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 260940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (name.equals_lower(g_core_definitions[i].name)) 261940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &g_core_definitions[i]; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 263940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic inline const CoreDefinition * 267940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindCoreDefinition (ArchSpec::Core core) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 269940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core >= 0 && core < ArchSpec::kNumCores) 270940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &g_core_definitions[core]; 271940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get a definition entry by cpu type and subtype. 275940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry * 276940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinitionEntry (const ArchDefinition *def, uint32_t cpu, uint32_t sub) 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 278940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def == NULL) 279cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton return NULL; 280cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 281940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const uint32_t cpu_mask = def->cpu_mask; 282940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const uint32_t sub_mask = def->sub_mask; 283940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries = def->entries; 284940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (size_t i = 0; i < def->num_entries; ++i) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if ((entries[i].cpu == (cpu_mask & cpu)) && 287940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton (entries[i].sub == (sub_mask & sub))) 288940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &entries[i]; 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 290940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry * 294940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinitionEntry (const ArchDefinition *def, ArchSpec::Core core) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def == NULL) 297940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 298940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 299940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries = def->entries; 300940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (size_t i = 0; i < def->num_entries; ++i) 301cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton { 302940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (entries[i].core == core) 303940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &entries[i]; 304cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton } 305940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 309940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Constructors and destructors. 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::ArchSpec() : 312940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 313940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 314940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 318f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg ClaytonArchSpec::ArchSpec (const char *triple_cstr, Platform *platform) : 319940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 320940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 321940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 322cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton{ 323940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_cstr) 324f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton SetTriple(triple_cstr, platform); 325cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton} 326cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 327b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 328b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonArchSpec::ArchSpec (const char *triple_cstr) : 329b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple (), 330b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_core (kCore_invalid), 331b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_byte_order (eByteOrderInvalid) 332b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 333b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_cstr) 334b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple(triple_cstr); 335b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 336b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 337940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::ArchSpec(const llvm::Triple &triple) : 338940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 339940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 340940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 342940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton SetTriple(triple); 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 345b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonArchSpec::ArchSpec (ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) : 346940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 347940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 348940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 350940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton SetArchitecture (arch_type, cpu, subtype); 351940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 353940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::~ArchSpec() 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 355940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 358940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Assignment and initialization. 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 360940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonconst ArchSpec& 361940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::operator= (const ArchSpec& rhs) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 363940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (this != &rhs) 364940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 365940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = rhs.m_triple; 366940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = rhs.m_core; 367940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = rhs.m_byte_order; 368940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 369940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return *this; 370940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonvoid 373940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::Clear() 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 375940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(); 376940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = kCore_invalid; 377940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = eByteOrderInvalid; 378940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 380940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 381940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Predicates. 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 385940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetArchitectureName () const 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 387940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 388940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 389940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->name; 390940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return "unknown"; 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 393940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonuint32_t 394940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachOCPUType () const 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 396940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 397940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 399940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); 400940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 402940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return arch_def->cpu; 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 405940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return LLDB_INVALID_CPUTYPE; 406940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 408940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonuint32_t 409940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachOCPUSubType () const 410940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 411940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 412940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 414940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); 415940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41758e26e0935138225477fd61283215ceff2068899Greg Clayton return arch_def->sub; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 420940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return LLDB_INVALID_CPUTYPE; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 423940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonllvm::Triple::ArchType 424940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachine () const 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 426940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 427940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 428940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->machine; 429940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 430940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return llvm::Triple::UnknownArch; 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerArchSpec::GetAddressByteSize() const 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 436940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 437940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 438940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->addr_byte_size; 439cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton return 0; 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 442940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonByteOrder 443940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetDefaultEndian () const 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 445940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 446940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 447940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->default_byte_order; 448940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return eByteOrderInvalid; 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 451940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonlldb::ByteOrder 452940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetByteOrder () const 453395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 454940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (m_byte_order == eByteOrderInvalid) 455940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return GetDefaultEndian(); 456940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_byte_order; 457395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 458395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 459940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 460940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Mutators. 461940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 462940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonbool 463940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::SetTriple (const llvm::Triple &triple) 464395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 465940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = triple; 466395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 467940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::StringRef arch_name (m_triple.getArchName()); 468940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (arch_name); 469940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 470395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 471940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = core_def->core; 472f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // Set the byte order to the default byte order for an architecture. 473f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // This can be modified if needed for cases when cores handle both 474f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // big and little endian 475f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_byte_order = core_def->default_byte_order; 476395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 477395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton else 478395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 479940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Clear(); 480395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 481395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 482940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 483940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 484395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 487b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonArchSpec::SetTriple (const char *triple_cstr) 488b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 489b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_cstr && triple_cstr[0]) 490b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 4915741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (isdigit(triple_cstr[0])) 4925741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 4935741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton // Accept "12-10" or "12.10" as cpu type/subtype 4945741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton char *end = NULL; 4955741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton uint32_t cpu = ::strtoul (triple_cstr, &end, 0); 4965741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (cpu != 0 && end && ((*end == '-') || (*end == '.'))) 4975741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 4985741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton uint32_t sub = ::strtoul (end + 1, &end, 0); 4995741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (sub != 0 && end && ((*end == '-') || (*end == '.') || (*end == '\0'))) 5005741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5015741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (SetArchitecture (eArchTypeMachO, cpu, sub)) 5025741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5035741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (*end == '-') 5045741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5055741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton llvm::StringRef vendor_os (end + 1); 5065741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton size_t dash_pos = vendor_os.find('-'); 5075741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (dash_pos != llvm::StringRef::npos) 5085741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5095741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton llvm::StringRef vendor_str(vendor_os.substr(0, dash_pos)); 5105741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton m_triple.setVendorName(vendor_str); 5115741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton const size_t vendor_start_pos = dash_pos+1; 5125741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton dash_pos = vendor_os.find(vendor_start_pos, '-'); 5135741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (dash_pos == llvm::StringRef::npos) 5145741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5155741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton if (vendor_start_pos < vendor_os.size()) 5165741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton m_triple.setOSName(vendor_os.substr(vendor_start_pos)); 5175741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5185741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton else 5195741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5205741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton m_triple.setOSName(vendor_os.substr(vendor_start_pos, dash_pos - vendor_start_pos)); 5215741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5225741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5235741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5245741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton return true; 5255741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5265741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5275741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5285741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 529b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton llvm::StringRef triple_stref (triple_cstr); 530b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_stref.startswith (LLDB_ARCH_DEFAULT)) 531b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 532b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // Special case for the current host default architectures... 533b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_stref.equals (LLDB_ARCH_DEFAULT_32BIT)) 534b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 535b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT_64BIT)) 536b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); 537b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT)) 538b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 539b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 540b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 541b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 542b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton std::string normalized_triple_sstr (llvm::Triple::normalize(triple_stref)); 543b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton triple_stref = normalized_triple_sstr; 544b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple (llvm::Triple (triple_stref)); 545b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 546b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 547b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 548b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton Clear(); 549b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return IsValid(); 550b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 551b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 552b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytonbool 553f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg ClaytonArchSpec::SetTriple (const char *triple_cstr, Platform *platform) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 555e0207162ff57a8026395b21f67829c232f0d4479Greg Clayton if (triple_cstr && triple_cstr[0]) 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 557940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::StringRef triple_stref (triple_cstr); 558940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_stref.startswith (LLDB_ARCH_DEFAULT)) 559395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 560395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // Special case for the current host default architectures... 561940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_stref.equals (LLDB_ARCH_DEFAULT_32BIT)) 562395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 563940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT_64BIT)) 564395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); 565940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT)) 566395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 567395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 568940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 570b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec raw_arch (triple_cstr); 571b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 572940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton std::string normalized_triple_sstr (llvm::Triple::normalize(triple_stref)); 573940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton triple_stref = normalized_triple_sstr; 574f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton llvm::Triple normalized_triple (triple_stref); 575f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 576f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool os_specified = normalized_triple.getOSName().size() > 0; 577f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool vendor_specified = normalized_triple.getVendorName().size() > 0; 578f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool env_specified = normalized_triple.getEnvironmentName().size() > 0; 579f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 580f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // If we got an arch only, then default the vendor, os, environment 581f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // to match the platform if one is supplied 582f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (!(os_specified || vendor_specified || env_specified)) 583f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 584f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (platform) 585f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 586f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // If we were given a platform, use the platform's system 587f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // architecture. If this is not available (might not be 588f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // connected) use the first supported architecture. 589b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec compatible_arch; 590b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform->IsCompatibleArchitecture (raw_arch, &compatible_arch)) 591f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 592b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch.IsValid()) 593b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 594b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const llvm::Triple &compatible_triple = compatible_arch.GetTriple(); 595b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 596b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setVendor(compatible_triple.getVendor()); 597b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!os_specified) 598b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setOS(compatible_triple.getOS()); 599b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!env_specified && compatible_triple.getEnvironmentName().size()) 600b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setEnvironment(compatible_triple.getEnvironment()); 601b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 602f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 603b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 604f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 605b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = raw_arch; 606b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return IsValid(); 607f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 608f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 609f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton else 610f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 611f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // No platform specified, fall back to the host system for 612f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // the default vendor, os, and environment. 6137537dce6163b914357d14b8526e204e88345832fSean Callanan llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple()); 614b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 615b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setVendor(host_triple.getVendor()); 616b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 617b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setOS(host_triple.getOS()); 618b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!env_specified && host_triple.getEnvironmentName().size()) 619b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setEnvironment(host_triple.getEnvironment()); 620f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 621f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 622f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton SetTriple (normalized_triple); 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 624940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 625940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 626940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Clear(); 627940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 628940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 630940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonbool 631b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonArchSpec::SetArchitecture (ArchitectureType arch_type, uint32_t cpu, uint32_t sub) 632940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 633940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = kCore_invalid; 634940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton bool update_triple = true; 635940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinition *arch_def = FindArchDefinition(arch_type); 636940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 637940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 638940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def_entry = FindArchDefinitionEntry (arch_def, cpu, sub); 639940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def_entry) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 641940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (arch_def_entry->core); 642940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 644940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = core_def->core; 645940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton update_triple = false; 6466a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Always use the architecture name because it might be more descriptive 6476a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // than the architecture enum ("armv7" -> llvm::Triple::arm). 6486a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_triple.setArchName(llvm::StringRef(core_def->name)); 649940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_type == eArchTypeMachO) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 651940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setVendor (llvm::Triple::Apple); 652b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 653b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (core_def->machine) 654b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 655b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::arm: 656b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::thumb: 657b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple.setOS (llvm::Triple::IOS); 658b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 659b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 660b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::x86: 661b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::x86_64: 662b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 663b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple.setOS (llvm::Triple::MacOSX); 664b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 665b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 667940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 669940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setVendor (llvm::Triple::UnknownVendor); 670940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setOS (llvm::Triple::UnknownOS); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6726a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Fall back onto setting the machine type if the arch by name failed... 6736a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_triple.getArch () == llvm::Triple::UnknownArch) 6746a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_triple.setArch (core_def->machine); 675cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton } 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 678940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton CoreUpdated(update_triple); 679940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 682889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonuint32_t 683889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonArchSpec::GetMinimumOpcodeByteSize() const 684889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton{ 685889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 686889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (core_def) 687889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return core_def->min_opcode_byte_size; 688889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return 0; 689889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton} 690889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 691889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonuint32_t 692889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonArchSpec::GetMaximumOpcodeByteSize() const 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 694889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 695889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (core_def) 696889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return core_def->max_opcode_byte_size; 697889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return 0; 698940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 699940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 700940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 701940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Helper methods. 702940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 703940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonvoid 704940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::CoreUpdated (bool update_triple) 705940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 706940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 707940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 709940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (update_triple) 710940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(core_def->name, "unknown", "unknown"); 711940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = core_def->default_byte_order; 712940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 713940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 714940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 715940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (update_triple) 716940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(); 717940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = eByteOrderInvalid; 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 721940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 722940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Operators. 723940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 724b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytonstatic bool 725b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytoncores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_inverse) 726b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 727b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (core1) 728b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 729b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv4: 730b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 731b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumb) 732b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 733b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 734b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 735b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv4t: 736b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 737b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv4t) 738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 739b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 740b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 741b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv5: 742b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 743b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv5) 744b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 745b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 746b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 747b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv5t: 748b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv5e: 749b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 750b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv5e) 751b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 752b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 753b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 754b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv6: 755b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 756b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv6) 757b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 758b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 759b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 760b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv7: 761b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 762b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv7) 763b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 764b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 765b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 766b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv7f: 767b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 768b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv7f) 769b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 770b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 771b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 772b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv7k: 773b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 774b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv7k) 775b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 776b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 777b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 778b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_arm_armv7s: 779b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 780b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_thumbv7s) 781b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 782b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 783b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 784b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumb: 785b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 786b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv4) 787b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 788b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 789b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 790b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv4t: 791b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 792b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv4t) 793b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 794b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 795b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 796b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv5: 797b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 798b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv5) 799b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 800b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 801b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 802b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv5e: 803b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 804b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv5t || core2 == ArchSpec::eCore_arm_armv5e) 805b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 806b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 807b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 808b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv6: 809b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 810b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv6) 811b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 812b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 813b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 814b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv7: 815b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 816b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv7) 817b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 818b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 819b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 820b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv7f: 821b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 822b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv7f) 823b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 824b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 825b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 826b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv7k: 827b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 828b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv7k) 829b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 830b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 831b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// 832b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// case ArchSpec::eCore_thumbv7s: 833b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// try_inverse = false; 834b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// if (core2 == ArchSpec::eCore_arm_armv7s) 835b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// return true; 836b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton// break; 837b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 838b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_any: 839b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 840b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 841b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_arm_any: 842b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last) 843b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 844b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 >= ArchSpec::kCore_thumb_first && core2 <= ArchSpec::kCore_thumb_last) 845b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 846b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 == ArchSpec::kCore_arm_any) 847b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 848b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 849b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 850b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_x86_32_any: 851b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_x86_32_first && core2 <= ArchSpec::kCore_x86_32_last) || (core2 == ArchSpec::kCore_x86_32_any)) 852b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 853b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 854b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 855b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_ppc_any: 856b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_ppc_first && core2 <= ArchSpec::kCore_ppc_last) || (core2 == ArchSpec::kCore_ppc_any)) 857b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 858b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 859b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 860b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_ppc64_any: 861b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_ppc64_first && core2 <= ArchSpec::kCore_ppc64_last) || (core2 == ArchSpec::kCore_ppc64_any)) 862b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 863b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 864b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 865b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 866b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 867b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 868b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (try_inverse) 869b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return cores_match (core2, core1, false); 870b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return false; 871b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 872b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator== (const ArchSpec& lhs, const ArchSpec& rhs) 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87665ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham if (lhs.GetByteOrder() != rhs.GetByteOrder()) 87765ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham return false; 87865ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham 879940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core lhs_core = lhs.GetCore (); 880940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core rhs_core = rhs.GetCore (); 881940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 882b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // Check if the cores match, or check a little closer watching for wildcard 883b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // and equivalent cores 884b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const bool core_match = (lhs_core == rhs_core) || cores_match (lhs_core, rhs_core, true); 88565ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham 886b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core_match) 887940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 88865ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham const llvm::Triple &lhs_triple = lhs.GetTriple(); 88965ac966aeaf5e5a02fbf469fedf4fe01c3f5e199Jim Ingham const llvm::Triple &rhs_triple = rhs.GetTriple(); 8906a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton 8916a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor(); 8926a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor(); 8936a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_vendor != rhs_triple_vendor) 8946a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 895b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified(); 896b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const bool lhs_vendor_specified = lhs.TripleVendorWasSpecified(); 897b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // Both architectures had the vendor specified, so if they aren't 898b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // equal then we return false 899b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (rhs_vendor_specified && lhs_vendor_specified) 900b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return false; 901b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 9026a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Only fail if both vendor types are not unknown 9036a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_vendor != llvm::Triple::UnknownVendor && 9046a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton rhs_triple_vendor != llvm::Triple::UnknownVendor) 9056a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton return false; 9066a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 9076a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton 9086a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS(); 9096a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS(); 9106a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_os != rhs_triple_os) 9116a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 912b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const bool rhs_os_specified = rhs.TripleOSWasSpecified(); 913b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const bool lhs_os_specified = lhs.TripleOSWasSpecified(); 914b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // Both architectures had the OS specified, so if they aren't 915b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // equal then we return false 916b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (rhs_os_specified && lhs_os_specified) 917b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return false; 9186a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Only fail if both os types are not unknown 9196a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_os != llvm::Triple::UnknownOS && 9206a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton rhs_triple_os != llvm::Triple::UnknownOS) 9216a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton return false; 9226a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 9236a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton 9246a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::EnvironmentType lhs_triple_env = lhs_triple.getEnvironment(); 9256a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton const llvm::Triple::EnvironmentType rhs_triple_env = rhs_triple.getEnvironment(); 9266a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton 9276a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_env != rhs_triple_env) 9286a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton { 9296a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Only fail if both environment types are not unknown 9306a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (lhs_triple_env != llvm::Triple::UnknownEnvironment && 9316a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton rhs_triple_env != llvm::Triple::UnknownEnvironment) 9326a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton return false; 9336a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton } 9346a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton return true; 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 936b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return false; 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator!= (const ArchSpec& lhs, const ArchSpec& rhs) 94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return !(lhs == rhs); 94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator<(const ArchSpec& lhs, const ArchSpec& rhs) 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 948940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core lhs_core = lhs.GetCore (); 949940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core rhs_core = rhs.GetCore (); 950940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return lhs_core < rhs_core; 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 952