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> 133b6bd69f18d130f78ec5350682f04bd603afbc23Jason Molenda#include <errno.h> 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton#include "llvm/Support/ELF.h" 18b7af465a97de8d110074f0c814d65ce4416ca9abStephen Wilson#include "llvm/Support/Host.h" 19cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton#include "llvm/Support/MachO.h" 205741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton#include "lldb/Core/RegularExpression.h" 21395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Host/Endian.h" 22395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Host/Host.h" 23f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton#include "lldb/Target/Platform.h" 24cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#define ARCH_SPEC_SEPARATOR_CHAR '-' 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 306e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 316e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molendastatic bool cores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_inverse, bool enforce_exact_match); 326e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 33940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonnamespace lldb_private { 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton struct CoreDefinition 36940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 37940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ByteOrder default_byte_order; 38940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t addr_byte_size; 39889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t min_opcode_byte_size; 40889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton uint32_t max_opcode_byte_size; 41940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::Triple::ArchType machine; 42940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchSpec::Core core; 43940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const char *name; 44940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton }; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 47cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 48940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// This core information can be looked using the ArchSpec::Core as the index 49940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const CoreDefinition g_core_definitions[ArchSpec::kNumCores] = 50cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton{ 51889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_generic , "arm" }, 52889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4 , "armv4" }, 53889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv4t , "armv4t" }, 54889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5 , "armv5" }, 55a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5e , "armv5e" }, 56889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv5t , "armv5t" }, 57889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv6 , "armv6" }, 58889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7 , "armv7" }, 59889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7f , "armv7f" }, 60889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7s , "armv7s" }, 612099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7k , "armv7k" }, 622099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7m , "armv7m" }, 632099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_armv7em , "armv7em" }, 64889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::arm , ArchSpec::eCore_arm_xscale , "xscale" }, 65a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumb , "thumb" }, 66a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv4t , "thumbv4t" }, 67a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv5 , "thumbv5" }, 68a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv5e , "thumbv5e" }, 69a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv6 , "thumbv6" }, 70a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7 , "thumbv7" }, 71a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7f , "thumbv7f" }, 72a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7s , "thumbv7s" }, 732099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7k , "thumbv7k" }, 742099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7m , "thumbv7m" }, 752099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { eByteOrderLittle, 4, 2, 4, llvm::Triple::thumb , ArchSpec::eCore_thumbv7em , "thumbv7em" }, 76a5fd1761e694de335770b29fb66ce8794b0f34f9Greg Clayton 77940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 78889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_generic , "ppc" }, 79889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc601 , "ppc601" }, 80889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc602 , "ppc602" }, 81889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603 , "ppc603" }, 82889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603e , "ppc603e" }, 83889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc603ev , "ppc603ev" }, 84889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604 , "ppc604" }, 85889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc604e , "ppc604e" }, 86889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc620 , "ppc620" }, 87889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc750 , "ppc750" }, 88889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7400 , "ppc7400" }, 89889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc7450 , "ppc7450" }, 90889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::ppc , ArchSpec::eCore_ppc_ppc970 , "ppc970" }, 91940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 92889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_generic , "ppc64" }, 93889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::ppc64 , ArchSpec::eCore_ppc64_ppc970_64 , "ppc970-64" }, 94940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 95889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 4, 4, 4, llvm::Triple::sparc , ArchSpec::eCore_sparc_generic , "sparc" }, 96889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton { eByteOrderLittle, 8, 4, 4, llvm::Triple::sparcv9, ArchSpec::eCore_sparc9_generic , "sparcv9" }, 97940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 985e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i386 , "i386" }, 995e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486 , "i486" }, 1005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { eByteOrderLittle, 4, 1, 15, llvm::Triple::x86 , ArchSpec::eCore_x86_32_i486sx , "i486sx" }, 101940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 102a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { eByteOrderLittle, 8, 1, 15, llvm::Triple::x86_64 , ArchSpec::eCore_x86_64_x86_64 , "x86_64" }, 103a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { eByteOrderLittle, 4, 4, 4 , llvm::Triple::UnknownArch , ArchSpec::eCore_uknownMach32 , "unknown-mach-32" }, 104a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { eByteOrderLittle, 8, 4, 4 , llvm::Triple::UnknownArch , ArchSpec::eCore_uknownMach64 , "unknown-mach-64" } 105cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton}; 106cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 107940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstruct ArchDefinitionEntry 108940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 109940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchSpec::Core core; 110940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t cpu; 111940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton uint32_t sub; 112a53324d018afb71a1a53840c426aab47edb56383Greg Clayton uint32_t cpu_mask; 113a53324d018afb71a1a53840c426aab47edb56383Greg Clayton uint32_t sub_mask; 114940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 115cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 116940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstruct ArchDefinition 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 118940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton ArchitectureType type; 119940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton size_t num_entries; 120940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries; 121940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const char *name; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 1265e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonArchSpec::AutoComplete (const char *name, StringList &matches) 1275e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{ 1285e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton uint32_t i; 1295e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (name && name[0]) 1305e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1315e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton for (i = 0; i < ArchSpec::kNumCores; ++i) 1325e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1335e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (NameMatches(g_core_definitions[i].name, eNameMatchStartsWith, name)) 1345e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString (g_core_definitions[i].name); 1355e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1365e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1375e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton else 1385e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton { 1395e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton for (i = 0; i < ArchSpec::kNumCores; ++i) 1405e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton matches.AppendString (g_core_definitions[i].name); 1415e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton } 1425e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return matches.GetSize(); 1435e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton} 1445e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 1455e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 1465e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 147940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#define CPU_ANY (UINT32_MAX) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 150940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// A table that gets searched linearly for matches. This table is used to 151940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// convert cpu type and subtypes to architecture names, and to convert 152940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// architecture names to cpu types and subtypes. The ordering is important and 153940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// allows the precedence to be set when the table is built. 154a53324d018afb71a1a53840c426aab47edb56383Greg Clayton#define SUBTYPE_MASK 0x00FFFFFFu 155940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry g_macho_arch_entries[] = 156940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 157a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , CPU_ANY, UINT32_MAX , UINT32_MAX }, 158a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_generic , llvm::MachO::CPUTypeARM , 0 , UINT32_MAX , SUBTYPE_MASK }, 159a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv4 , llvm::MachO::CPUTypeARM , 5 , UINT32_MAX , SUBTYPE_MASK }, 160a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv4t , llvm::MachO::CPUTypeARM , 5 , UINT32_MAX , SUBTYPE_MASK }, 161a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv6 , llvm::MachO::CPUTypeARM , 6 , UINT32_MAX , SUBTYPE_MASK }, 162a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv5 , llvm::MachO::CPUTypeARM , 7 , UINT32_MAX , SUBTYPE_MASK }, 163a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv5e , llvm::MachO::CPUTypeARM , 7 , UINT32_MAX , SUBTYPE_MASK }, 164a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv5t , llvm::MachO::CPUTypeARM , 7 , UINT32_MAX , SUBTYPE_MASK }, 165a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_xscale , llvm::MachO::CPUTypeARM , 8 , UINT32_MAX , SUBTYPE_MASK }, 166a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv7 , llvm::MachO::CPUTypeARM , 9 , UINT32_MAX , SUBTYPE_MASK }, 167a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv7f , llvm::MachO::CPUTypeARM , 10 , UINT32_MAX , SUBTYPE_MASK }, 168a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_armv7s , llvm::MachO::CPUTypeARM , 11 , UINT32_MAX , SUBTYPE_MASK }, 1692099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_arm_armv7k , llvm::MachO::CPUTypeARM , 12 , UINT32_MAX , SUBTYPE_MASK }, 1702099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_arm_armv7m , llvm::MachO::CPUTypeARM , 15 , UINT32_MAX , SUBTYPE_MASK }, 1712099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_arm_armv7em , llvm::MachO::CPUTypeARM , 16 , UINT32_MAX , SUBTYPE_MASK }, 172a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumb , llvm::MachO::CPUTypeARM , 0 , UINT32_MAX , SUBTYPE_MASK }, 173a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv4t , llvm::MachO::CPUTypeARM , 5 , UINT32_MAX , SUBTYPE_MASK }, 174a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv5 , llvm::MachO::CPUTypeARM , 7 , UINT32_MAX , SUBTYPE_MASK }, 175a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv5e , llvm::MachO::CPUTypeARM , 7 , UINT32_MAX , SUBTYPE_MASK }, 176a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv6 , llvm::MachO::CPUTypeARM , 6 , UINT32_MAX , SUBTYPE_MASK }, 177a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv7 , llvm::MachO::CPUTypeARM , 9 , UINT32_MAX , SUBTYPE_MASK }, 178a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv7f , llvm::MachO::CPUTypeARM , 10 , UINT32_MAX , SUBTYPE_MASK }, 179a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_thumbv7s , llvm::MachO::CPUTypeARM , 11 , UINT32_MAX , SUBTYPE_MASK }, 1802099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_thumbv7k , llvm::MachO::CPUTypeARM , 12 , UINT32_MAX , SUBTYPE_MASK }, 1812099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_thumbv7m , llvm::MachO::CPUTypeARM , 15 , UINT32_MAX , SUBTYPE_MASK }, 1822099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda { ArchSpec::eCore_thumbv7em , llvm::MachO::CPUTypeARM , 16 , UINT32_MAX , SUBTYPE_MASK }, 183a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , CPU_ANY, UINT32_MAX , UINT32_MAX }, 184a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_generic , llvm::MachO::CPUTypePowerPC , 0 , UINT32_MAX , SUBTYPE_MASK }, 185a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc601 , llvm::MachO::CPUTypePowerPC , 1 , UINT32_MAX , SUBTYPE_MASK }, 186a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc602 , llvm::MachO::CPUTypePowerPC , 2 , UINT32_MAX , SUBTYPE_MASK }, 187a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc603 , llvm::MachO::CPUTypePowerPC , 3 , UINT32_MAX , SUBTYPE_MASK }, 188a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc603e , llvm::MachO::CPUTypePowerPC , 4 , UINT32_MAX , SUBTYPE_MASK }, 189a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc603ev , llvm::MachO::CPUTypePowerPC , 5 , UINT32_MAX , SUBTYPE_MASK }, 190a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc604 , llvm::MachO::CPUTypePowerPC , 6 , UINT32_MAX , SUBTYPE_MASK }, 191a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc604e , llvm::MachO::CPUTypePowerPC , 7 , UINT32_MAX , SUBTYPE_MASK }, 192a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc620 , llvm::MachO::CPUTypePowerPC , 8 , UINT32_MAX , SUBTYPE_MASK }, 193a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc750 , llvm::MachO::CPUTypePowerPC , 9 , UINT32_MAX , SUBTYPE_MASK }, 194a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc7400 , llvm::MachO::CPUTypePowerPC , 10 , UINT32_MAX , SUBTYPE_MASK }, 195a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc7450 , llvm::MachO::CPUTypePowerPC , 11 , UINT32_MAX , SUBTYPE_MASK }, 196a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_ppc970 , llvm::MachO::CPUTypePowerPC , 100 , UINT32_MAX , SUBTYPE_MASK }, 197a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc64_generic , llvm::MachO::CPUTypePowerPC64 , 0 , UINT32_MAX , SUBTYPE_MASK }, 198a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc64_ppc970_64 , llvm::MachO::CPUTypePowerPC64 , 100 , UINT32_MAX , SUBTYPE_MASK }, 199a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , 3 , UINT32_MAX , SUBTYPE_MASK }, 200a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i486 , llvm::MachO::CPUTypeI386 , 4 , UINT32_MAX , SUBTYPE_MASK }, 201a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i486sx , llvm::MachO::CPUTypeI386 , 0x84 , UINT32_MAX , SUBTYPE_MASK }, 202a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::MachO::CPUTypeI386 , CPU_ANY, UINT32_MAX , UINT32_MAX }, 203a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , 3 , UINT32_MAX , SUBTYPE_MASK }, 204a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , 4 , UINT32_MAX , SUBTYPE_MASK }, 205a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::MachO::CPUTypeX86_64 , CPU_ANY, UINT32_MAX , UINT32_MAX }, 206a53324d018afb71a1a53840c426aab47edb56383Greg Clayton // Catch any unknown mach architectures so we can always use the object and symbol mach-o files 207a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_uknownMach32 , 0 , 0 , 0xFF000000u, 0x00000000u }, 208a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_uknownMach64 , llvm::MachO::CPUArchABI64 , 0 , 0xFF000000u, 0x00000000u } 209940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 210940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition g_macho_arch_def = { 211940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eArchTypeMachO, 212940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_macho_arch_entries)/sizeof(g_macho_arch_entries[0]), 213940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton g_macho_arch_entries, 214940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton "mach-o" 215940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 216cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 217940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 218940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// A table that gets searched linearly for matches. This table is used to 219940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// convert cpu type and subtypes to architecture names, and to convert 220940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// architecture names to cpu types and subtypes. The ordering is important and 221940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// allows the precedence to be set when the table is built. 222940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry g_elf_arch_entries[] = 223940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 224a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_sparc_generic , llvm::ELF::EM_SPARC , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // Sparc 225a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i386 , llvm::ELF::EM_386 , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // Intel 80386 226a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_32_i486 , llvm::ELF::EM_486 , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // Intel 486 (deprecated) 227a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc_generic , llvm::ELF::EM_PPC , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // PowerPC 228a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_ppc64_generic , llvm::ELF::EM_PPC64 , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // PowerPC64 229a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_arm_generic , llvm::ELF::EM_ARM , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // ARM 230a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_sparc9_generic , llvm::ELF::EM_SPARCV9, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu }, // SPARC V9 231a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { ArchSpec::eCore_x86_64_x86_64 , llvm::ELF::EM_X86_64 , LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu } // AMD64 232cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton}; 233cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 234940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition g_elf_arch_def = { 235940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton eArchTypeELF, 236940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_elf_arch_entries)/sizeof(g_elf_arch_entries[0]), 237940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton g_elf_arch_entries, 238940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton "elf", 239940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 240cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 241940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 242940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Table of all ArchDefinitions 243940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition *g_arch_definitions[] = { 244940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton &g_macho_arch_def, 245a53324d018afb71a1a53840c426aab47edb56383Greg Clayton &g_elf_arch_def 246940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton}; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const size_t k_num_arch_definitions = 249940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton sizeof(g_arch_definitions) / sizeof(g_arch_definitions[0]); 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 251940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 252940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Static helper functions. 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 254940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 255940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get the architecture definition for a given object type. 256940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinition * 257940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinition (ArchitectureType arch_type) 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 259940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (unsigned int i = 0; i < k_num_arch_definitions; ++i) 260940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 261940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinition *def = g_arch_definitions[i]; 262940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def->type == arch_type) 263940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return def; 264940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 265940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get an architecture definition by name. 269940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const CoreDefinition * 270940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindCoreDefinition (llvm::StringRef name) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 272940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (unsigned int i = 0; i < ArchSpec::kNumCores; ++i) 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 274940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (name.equals_lower(g_core_definitions[i].name)) 275940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &g_core_definitions[i]; 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic inline const CoreDefinition * 281940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindCoreDefinition (ArchSpec::Core core) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 283940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core >= 0 && core < ArchSpec::kNumCores) 284940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &g_core_definitions[core]; 285940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 288940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Get a definition entry by cpu type and subtype. 289940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry * 290940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinitionEntry (const ArchDefinition *def, uint32_t cpu, uint32_t sub) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 292940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def == NULL) 293cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton return NULL; 294cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 295940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries = def->entries; 296940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (size_t i = 0; i < def->num_entries; ++i) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 298a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (entries[i].cpu == (cpu & entries[i].cpu_mask)) 299a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (entries[i].sub == (sub & entries[i].sub_mask)) 300a53324d018afb71a1a53840c426aab47edb56383Greg Clayton return &entries[i]; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 305940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonstatic const ArchDefinitionEntry * 306940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonFindArchDefinitionEntry (const ArchDefinition *def, ArchSpec::Core core) 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 308940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (def == NULL) 309940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 310940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 311940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *entries = def->entries; 312940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton for (size_t i = 0; i < def->num_entries; ++i) 313cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton { 314940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (entries[i].core == core) 315940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return &entries[i]; 316cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton } 317940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return NULL; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 321940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Constructors and destructors. 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::ArchSpec() : 324940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 325940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 326940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 330f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg ClaytonArchSpec::ArchSpec (const char *triple_cstr, Platform *platform) : 331940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 332940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 333940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 334cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton{ 335940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_cstr) 336f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton SetTriple(triple_cstr, platform); 337cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton} 338cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton 339b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 340b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonArchSpec::ArchSpec (const char *triple_cstr) : 341b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple (), 342b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_core (kCore_invalid), 343b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_byte_order (eByteOrderInvalid) 344b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 345b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_cstr) 346b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple(triple_cstr); 347b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 348b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 349940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::ArchSpec(const llvm::Triple &triple) : 350940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 351940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 352940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 354940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton SetTriple(triple); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 357b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonArchSpec::ArchSpec (ArchitectureType arch_type, uint32_t cpu, uint32_t subtype) : 358940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple (), 359940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core (kCore_invalid), 360940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order (eByteOrderInvalid) 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 362940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton SetArchitecture (arch_type, cpu, subtype); 363940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 365940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::~ArchSpec() 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 367940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 369940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 370940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Assignment and initialization. 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonconst ArchSpec& 373940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::operator= (const ArchSpec& rhs) 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 375940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (this != &rhs) 376940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 377940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = rhs.m_triple; 378940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = rhs.m_core; 379940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = rhs.m_byte_order; 380940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 381940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return *this; 382940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 384940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonvoid 385940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::Clear() 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 387940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(); 388940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = kCore_invalid; 389940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = eByteOrderInvalid; 390940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 392940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 393940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Predicates. 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 397940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetArchitectureName () const 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 399940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 400940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 401940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->name; 402940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return "unknown"; 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 405940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonuint32_t 406940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachOCPUType () const 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 408940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 409940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 411940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); 412940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 414940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return arch_def->cpu; 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 417940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return LLDB_INVALID_CPUTYPE; 418940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 420940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonuint32_t 421940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachOCPUSubType () const 422940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 423940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 424940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 426940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def = FindArchDefinitionEntry (&g_macho_arch_def, core_def->core); 427940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42958e26e0935138225477fd61283215ceff2068899Greg Clayton return arch_def->sub; 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 432940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return LLDB_INVALID_CPUTYPE; 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 435940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonllvm::Triple::ArchType 436940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetMachine () const 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 438940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 439940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 440940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->machine; 441940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 442940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return llvm::Triple::UnknownArch; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerArchSpec::GetAddressByteSize() const 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 448940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 449940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 450940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->addr_byte_size; 451cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton return 0; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 454940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonByteOrder 455940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetDefaultEndian () const 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 457940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 458940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 459940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return core_def->default_byte_order; 460940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return eByteOrderInvalid; 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonlldb::ByteOrder 464940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::GetByteOrder () const 465395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 466940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (m_byte_order == eByteOrderInvalid) 467940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return GetDefaultEndian(); 468940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return m_byte_order; 469395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 470395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 471940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 472940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Mutators. 473940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 474940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonbool 475940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::SetTriple (const llvm::Triple &triple) 476395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{ 477940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = triple; 478395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 479940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::StringRef arch_name (m_triple.getArchName()); 480940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (arch_name); 481940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 482395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 483940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = core_def->core; 484f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // Set the byte order to the default byte order for an architecture. 485f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // This can be modified if needed for cases when cores handle both 486f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // big and little endian 487f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_byte_order = core_def->default_byte_order; 488395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 489395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton else 490395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 491940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Clear(); 492395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 493395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 494940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 495940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 496395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton} 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 498a53324d018afb71a1a53840c426aab47edb56383Greg Claytonstatic bool 499a53324d018afb71a1a53840c426aab47edb56383Greg ClaytonParseMachCPUDashSubtypeTriple (const char *triple_cstr, ArchSpec &arch) 500b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 501a53324d018afb71a1a53840c426aab47edb56383Greg Clayton // Accept "12-10" or "12.10" as cpu type/subtype 502a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (isdigit(triple_cstr[0])) 503b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 504a53324d018afb71a1a53840c426aab47edb56383Greg Clayton char *end = NULL; 505a53324d018afb71a1a53840c426aab47edb56383Greg Clayton errno = 0; 50636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t cpu = (uint32_t)::strtoul (triple_cstr, &end, 0); 507a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (errno == 0 && cpu != 0 && end && ((*end == '-') || (*end == '.'))) 5085741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 5093b6bd69f18d130f78ec5350682f04bd603afbc23Jason Molenda errno = 0; 51036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t sub = (uint32_t)::strtoul (end + 1, &end, 0); 511a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (errno == 0 && end && ((*end == '-') || (*end == '.') || (*end == '\0'))) 5125741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 513a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (arch.SetArchitecture (eArchTypeMachO, cpu, sub)) 5145741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 515a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (*end == '-') 5165741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 517a53324d018afb71a1a53840c426aab47edb56383Greg Clayton llvm::StringRef vendor_os (end + 1); 518a53324d018afb71a1a53840c426aab47edb56383Greg Clayton size_t dash_pos = vendor_os.find('-'); 519a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (dash_pos != llvm::StringRef::npos) 5205741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 521a53324d018afb71a1a53840c426aab47edb56383Greg Clayton llvm::StringRef vendor_str(vendor_os.substr(0, dash_pos)); 522a53324d018afb71a1a53840c426aab47edb56383Greg Clayton arch.GetTriple().setVendorName(vendor_str); 523a53324d018afb71a1a53840c426aab47edb56383Greg Clayton const size_t vendor_start_pos = dash_pos+1; 52436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton dash_pos = vendor_os.find('-', vendor_start_pos); 525a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (dash_pos == llvm::StringRef::npos) 5265741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton { 527a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (vendor_start_pos < vendor_os.size()) 528a53324d018afb71a1a53840c426aab47edb56383Greg Clayton arch.GetTriple().setOSName(vendor_os.substr(vendor_start_pos)); 529a53324d018afb71a1a53840c426aab47edb56383Greg Clayton } 530a53324d018afb71a1a53840c426aab47edb56383Greg Clayton else 531a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { 532a53324d018afb71a1a53840c426aab47edb56383Greg Clayton arch.GetTriple().setOSName(vendor_os.substr(vendor_start_pos, dash_pos - vendor_start_pos)); 5335741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5345741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5355741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 536a53324d018afb71a1a53840c426aab47edb56383Greg Clayton return true; 5375741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5385741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 5395741df7a8ef5234b85c6308a623b839b6049421bGreg Clayton } 540a53324d018afb71a1a53840c426aab47edb56383Greg Clayton } 541a53324d018afb71a1a53840c426aab47edb56383Greg Clayton return false; 542a53324d018afb71a1a53840c426aab47edb56383Greg Clayton} 543a53324d018afb71a1a53840c426aab47edb56383Greg Claytonbool 544a53324d018afb71a1a53840c426aab47edb56383Greg ClaytonArchSpec::SetTriple (const char *triple_cstr) 545a53324d018afb71a1a53840c426aab47edb56383Greg Clayton{ 546a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (triple_cstr && triple_cstr[0]) 547a53324d018afb71a1a53840c426aab47edb56383Greg Clayton { 548a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (ParseMachCPUDashSubtypeTriple (triple_cstr, *this)) 549a53324d018afb71a1a53840c426aab47edb56383Greg Clayton return true; 550a53324d018afb71a1a53840c426aab47edb56383Greg Clayton 551b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton llvm::StringRef triple_stref (triple_cstr); 552b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_stref.startswith (LLDB_ARCH_DEFAULT)) 553b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 554b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton // Special case for the current host default architectures... 555b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_stref.equals (LLDB_ARCH_DEFAULT_32BIT)) 556b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 557b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT_64BIT)) 558b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); 559b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT)) 560b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 561b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 562b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 563b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 564b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton std::string normalized_triple_sstr (llvm::Triple::normalize(triple_stref)); 565b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton triple_stref = normalized_triple_sstr; 566b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton SetTriple (llvm::Triple (triple_stref)); 567b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 568b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 569b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 570b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton Clear(); 571b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return IsValid(); 572b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 573b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 574b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytonbool 575f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg ClaytonArchSpec::SetTriple (const char *triple_cstr, Platform *platform) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 577e0207162ff57a8026395b21f67829c232f0d4479Greg Clayton if (triple_cstr && triple_cstr[0]) 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 579a53324d018afb71a1a53840c426aab47edb56383Greg Clayton if (ParseMachCPUDashSubtypeTriple (triple_cstr, *this)) 580a53324d018afb71a1a53840c426aab47edb56383Greg Clayton return true; 581a53324d018afb71a1a53840c426aab47edb56383Greg Clayton 582940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton llvm::StringRef triple_stref (triple_cstr); 583940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_stref.startswith (LLDB_ARCH_DEFAULT)) 584395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 585395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // Special case for the current host default architectures... 586940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (triple_stref.equals (LLDB_ARCH_DEFAULT_32BIT)) 587395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 588940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT_64BIT)) 589395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); 590940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else if (triple_stref.equals (LLDB_ARCH_DEFAULT)) 591395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 592395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 593940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 595b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec raw_arch (triple_cstr); 596b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 597940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton std::string normalized_triple_sstr (llvm::Triple::normalize(triple_stref)); 598940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton triple_stref = normalized_triple_sstr; 599f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton llvm::Triple normalized_triple (triple_stref); 600f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 601f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool os_specified = normalized_triple.getOSName().size() > 0; 602f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool vendor_specified = normalized_triple.getVendorName().size() > 0; 603f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton const bool env_specified = normalized_triple.getEnvironmentName().size() > 0; 604f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 605f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // If we got an arch only, then default the vendor, os, environment 606f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // to match the platform if one is supplied 607f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (!(os_specified || vendor_specified || env_specified)) 608f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 609f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (platform) 610f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 611f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // If we were given a platform, use the platform's system 612f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // architecture. If this is not available (might not be 613f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // connected) use the first supported architecture. 614b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec compatible_arch; 615aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (platform->IsCompatibleArchitecture (raw_arch, false, &compatible_arch)) 616f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 617b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch.IsValid()) 618b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 619b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton const llvm::Triple &compatible_triple = compatible_arch.GetTriple(); 620b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 621b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setVendor(compatible_triple.getVendor()); 622b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!os_specified) 623b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setOS(compatible_triple.getOS()); 624b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!env_specified && compatible_triple.getEnvironmentName().size()) 625b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setEnvironment(compatible_triple.getEnvironment()); 626b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 627f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 628b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton else 629f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 630b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *this = raw_arch; 631b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return IsValid(); 632f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 633f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 634f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton else 635f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 636f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // No platform specified, fall back to the host system for 637f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // the default vendor, os, and environment. 6387537dce6163b914357d14b8526e204e88345832fSean Callanan llvm::Triple host_triple(llvm::sys::getDefaultTargetTriple()); 639b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 640b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setVendor(host_triple.getVendor()); 641b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!vendor_specified) 642b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setOS(host_triple.getOS()); 643b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (!env_specified && host_triple.getEnvironmentName().size()) 644b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton normalized_triple.setEnvironment(host_triple.getEnvironment()); 645f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 646f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 647f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton SetTriple (normalized_triple); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 649940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 650940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 651940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton Clear(); 652940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 653940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 655940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonbool 656b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonArchSpec::SetArchitecture (ArchitectureType arch_type, uint32_t cpu, uint32_t sub) 657940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 658940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = kCore_invalid; 659940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton bool update_triple = true; 660940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinition *arch_def = FindArchDefinition(arch_type); 661940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def) 662940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 663940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchDefinitionEntry *arch_def_entry = FindArchDefinitionEntry (arch_def, cpu, sub); 664940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_def_entry) 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 666940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (arch_def_entry->core); 667940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 669940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_core = core_def->core; 670940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton update_triple = false; 6716a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Always use the architecture name because it might be more descriptive 6726a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // than the architecture enum ("armv7" -> llvm::Triple::arm). 6736a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_triple.setArchName(llvm::StringRef(core_def->name)); 674940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (arch_type == eArchTypeMachO) 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 676940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setVendor (llvm::Triple::Apple); 677b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 678b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (core_def->machine) 679b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 680b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::arm: 681b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::thumb: 682b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple.setOS (llvm::Triple::IOS); 683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 684b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 685b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::x86: 686b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::x86_64: 687b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 688b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton m_triple.setOS (llvm::Triple::MacOSX); 689b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 692940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 694940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setVendor (llvm::Triple::UnknownVendor); 695940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple.setOS (llvm::Triple::UnknownOS); 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6976a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton // Fall back onto setting the machine type if the arch by name failed... 6986a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton if (m_triple.getArch () == llvm::Triple::UnknownArch) 6996a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton m_triple.setArch (core_def->machine); 700cf0150574a0a97049efe2dce2cc0aa433705feb3Greg Clayton } 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 703940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton CoreUpdated(update_triple); 704940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return IsValid(); 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 707889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonuint32_t 708889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonArchSpec::GetMinimumOpcodeByteSize() const 709889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton{ 710889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 711889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (core_def) 712889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return core_def->min_opcode_byte_size; 713889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return 0; 714889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton} 715889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton 716889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Claytonuint32_t 717889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg ClaytonArchSpec::GetMaximumOpcodeByteSize() const 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 719889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 720889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton if (core_def) 721889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return core_def->max_opcode_byte_size; 722889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton return 0; 723940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton} 724940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 7256e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molendabool 7266e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason MolendaArchSpec::IsExactMatch (const ArchSpec& rhs) const 7276e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda{ 72840e278caddf5442776f9408f20d757cc85fe630aSean Callanan return IsEqualTo (rhs, true); 7296e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda} 7306e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7316e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molendabool 7326e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason MolendaArchSpec::IsCompatibleMatch (const ArchSpec& rhs) const 7336e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda{ 73440e278caddf5442776f9408f20d757cc85fe630aSean Callanan return IsEqualTo (rhs, false); 7356e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda} 7366e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7376e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molendabool 73840e278caddf5442776f9408f20d757cc85fe630aSean CallananArchSpec::IsEqualTo (const ArchSpec& rhs, bool exact_match) const 7396e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda{ 7406e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (GetByteOrder() != rhs.GetByteOrder()) 7416e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return false; 7426e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7436e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const ArchSpec::Core lhs_core = GetCore (); 7446e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const ArchSpec::Core rhs_core = rhs.GetCore (); 7456e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7466e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const bool core_match = cores_match (lhs_core, rhs_core, true, exact_match); 7476e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7486e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (core_match) 7496e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda { 7506e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple &lhs_triple = GetTriple(); 7516e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple &rhs_triple = rhs.GetTriple(); 7526e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7536e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::VendorType lhs_triple_vendor = lhs_triple.getVendor(); 7546e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::VendorType rhs_triple_vendor = rhs_triple.getVendor(); 7556e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_vendor != rhs_triple_vendor) 7566e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda { 75740e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (exact_match) 75840e278caddf5442776f9408f20d757cc85fe630aSean Callanan { 75940e278caddf5442776f9408f20d757cc85fe630aSean Callanan const bool rhs_vendor_specified = rhs.TripleVendorWasSpecified(); 76040e278caddf5442776f9408f20d757cc85fe630aSean Callanan const bool lhs_vendor_specified = TripleVendorWasSpecified(); 76140e278caddf5442776f9408f20d757cc85fe630aSean Callanan // Both architectures had the vendor specified, so if they aren't 76240e278caddf5442776f9408f20d757cc85fe630aSean Callanan // equal then we return false 76340e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (rhs_vendor_specified && lhs_vendor_specified) 76440e278caddf5442776f9408f20d757cc85fe630aSean Callanan return false; 76540e278caddf5442776f9408f20d757cc85fe630aSean Callanan } 7666e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7676e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda // Only fail if both vendor types are not unknown 7686e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_vendor != llvm::Triple::UnknownVendor && 7696e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda rhs_triple_vendor != llvm::Triple::UnknownVendor) 7706e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return false; 7716e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda } 7726e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7736e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::OSType lhs_triple_os = lhs_triple.getOS(); 7746e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::OSType rhs_triple_os = rhs_triple.getOS(); 7756e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_os != rhs_triple_os) 7766e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda { 77740e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (exact_match) 77840e278caddf5442776f9408f20d757cc85fe630aSean Callanan { 77940e278caddf5442776f9408f20d757cc85fe630aSean Callanan const bool rhs_os_specified = rhs.TripleOSWasSpecified(); 78040e278caddf5442776f9408f20d757cc85fe630aSean Callanan const bool lhs_os_specified = TripleOSWasSpecified(); 78140e278caddf5442776f9408f20d757cc85fe630aSean Callanan // Both architectures had the OS specified, so if they aren't 78240e278caddf5442776f9408f20d757cc85fe630aSean Callanan // equal then we return false 78340e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (rhs_os_specified && lhs_os_specified) 78440e278caddf5442776f9408f20d757cc85fe630aSean Callanan return false; 78540e278caddf5442776f9408f20d757cc85fe630aSean Callanan } 7866e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda // Only fail if both os types are not unknown 7876e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_os != llvm::Triple::UnknownOS && 7886e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda rhs_triple_os != llvm::Triple::UnknownOS) 7896e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return false; 7906e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda } 7916e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7926e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::EnvironmentType lhs_triple_env = lhs_triple.getEnvironment(); 7936e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda const llvm::Triple::EnvironmentType rhs_triple_env = rhs_triple.getEnvironment(); 7946e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 7956e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_env != rhs_triple_env) 7966e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda { 7976e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda // Only fail if both environment types are not unknown 7986e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (lhs_triple_env != llvm::Triple::UnknownEnvironment && 7996e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda rhs_triple_env != llvm::Triple::UnknownEnvironment) 8006e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return false; 8016e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda } 8026e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return true; 8036e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda } 8046e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return false; 8056e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda} 8066e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 807940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 808940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Helper methods. 809940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 810940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Claytonvoid 811940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg ClaytonArchSpec::CoreUpdated (bool update_triple) 812940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton{ 813940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const CoreDefinition *core_def = FindCoreDefinition (m_core); 814940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (core_def) 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 816940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (update_triple) 817940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(core_def->name, "unknown", "unknown"); 818940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = core_def->default_byte_order; 819940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton } 820940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton else 821940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton { 822940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton if (update_triple) 823940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_triple = llvm::Triple(); 824940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton m_byte_order = eByteOrderInvalid; 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 828940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton//===----------------------------------------------------------------------===// 829940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton// Operators. 830940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton 831b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Claytonstatic bool 8326e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molendacores_match (const ArchSpec::Core core1, const ArchSpec::Core core2, bool try_inverse, bool enforce_exact_match) 833b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton{ 8346e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (core1 == core2) 8356e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return true; 8366e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda 837b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (core1) 838b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 839b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_any: 840b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 841b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 842b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_arm_any: 843b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 >= ArchSpec::kCore_arm_first && core2 <= ArchSpec::kCore_arm_last) 844b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 845b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 >= ArchSpec::kCore_thumb_first && core2 <= ArchSpec::kCore_thumb_last) 846b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 847b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (core2 == ArchSpec::kCore_arm_any) 848b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 849b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 850b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 851b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_x86_32_any: 852b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_x86_32_first && core2 <= ArchSpec::kCore_x86_32_last) || (core2 == ArchSpec::kCore_x86_32_any)) 853b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 854b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 855b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 856b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_ppc_any: 857b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_ppc_first && core2 <= ArchSpec::kCore_ppc_last) || (core2 == ArchSpec::kCore_ppc_any)) 858b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 859b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 860b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 861b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case ArchSpec::kCore_ppc64_any: 862b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if ((core2 >= ArchSpec::kCore_ppc64_first && core2 <= ArchSpec::kCore_ppc64_last) || (core2 == ArchSpec::kCore_ppc64_any)) 863b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 864b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 865b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 8662099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda case ArchSpec::eCore_arm_armv7m: 8672099b6a42713fedae3b86b2ae5dbc2ff6ec6f175Jason Molenda case ArchSpec::eCore_arm_armv7em: 8686a994034b8135945915b421140e484b5c9614cbbJohnny Chen case ArchSpec::eCore_arm_armv7f: 8696a994034b8135945915b421140e484b5c9614cbbJohnny Chen case ArchSpec::eCore_arm_armv7k: 8706a994034b8135945915b421140e484b5c9614cbbJohnny Chen case ArchSpec::eCore_arm_armv7s: 8716e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (!enforce_exact_match) 8726e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda { 8736e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda try_inverse = false; 8746e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda if (core2 == ArchSpec::eCore_arm_armv7) 8756e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return true; 8766e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda } 8776a994034b8135945915b421140e484b5c9614cbbJohnny Chen break; 8786a994034b8135945915b421140e484b5c9614cbbJohnny Chen 879b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 880b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 881b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 882b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (try_inverse) 8836e3f97b4bbb9ed2918215d2247067fff949d1aa4Jason Molenda return cores_match (core2, core1, false, enforce_exact_match); 884b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return false; 885b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton} 886b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerlldb_private::operator<(const ArchSpec& lhs, const ArchSpec& rhs) 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 890940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core lhs_core = lhs.GetCore (); 891940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton const ArchSpec::Core rhs_core = rhs.GetCore (); 892940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton return lhs_core < rhs_core; 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 894