Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1 | //===-- ArchSpec.cpp --------------------------------------------*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "lldb/Core/ArchSpec.h" |
| 11 | |
Eli Friedman | 50fac2f | 2010-06-11 04:26:08 +0000 | [diff] [blame] | 12 | #include <stdio.h> |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 13 | |
| 14 | #include <string> |
| 15 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 16 | #include "llvm/Support/ELF.h" |
| 17 | #include "llvm/Support/MachO.h" |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 18 | #include "lldb/Host/Endian.h" |
| 19 | #include "lldb/Host/Host.h" |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 20 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 21 | using namespace lldb; |
| 22 | using namespace lldb_private; |
| 23 | |
| 24 | #define ARCH_SPEC_SEPARATOR_CHAR '-' |
| 25 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 26 | |
| 27 | //---------------------------------------------------------------------- |
| 28 | // A structure that describes all of the information we want to know |
| 29 | // about each architecture. |
| 30 | //---------------------------------------------------------------------- |
| 31 | struct ArchDefinition |
| 32 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 33 | ByteOrder byte_order; |
| 34 | uint32_t addr_byte_size; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 35 | uint32_t cpu; |
| 36 | uint32_t sub; |
| 37 | const char *name; |
| 38 | }; |
| 39 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 40 | |
| 41 | static const char *g_arch_type_strings[] = |
| 42 | { |
| 43 | "invalid", |
| 44 | "mach-o", |
| 45 | "elf" |
| 46 | }; |
| 47 | |
| 48 | #define CPU_ANY (UINT32_MAX) |
| 49 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 50 | //---------------------------------------------------------------------- |
| 51 | // A table that gets searched linearly for matches. This table is used |
| 52 | // to convert cpu type and subtypes to architecture names, and to |
| 53 | // convert architecture names to cpu types and subtypes. The ordering |
| 54 | // is important and allows the precedence to be set when the table is |
| 55 | // built. |
| 56 | //---------------------------------------------------------------------- |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 57 | static ArchDefinition g_mach_arch_defs[] = |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 58 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 59 | { eByteOrderInvalid, 0, CPU_ANY, CPU_ANY , "all" }, |
| 60 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, CPU_ANY , "arm" }, |
| 61 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 0 , "arm" }, |
| 62 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 5 , "armv4" }, |
| 63 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 6 , "armv6" }, |
| 64 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 7 , "armv5" }, |
| 65 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 8 , "xscale" }, |
| 66 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeARM, 9 , "armv7" }, |
| 67 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, CPU_ANY , "ppc" }, |
| 68 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 0 , "ppc" }, |
| 69 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 1 , "ppc601" }, |
| 70 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 2 , "ppc602" }, |
| 71 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 3 , "ppc603" }, |
| 72 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 4 , "ppc603e" }, |
| 73 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 5 , "ppc603ev" }, |
| 74 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 6 , "ppc604" }, |
| 75 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 7 , "ppc604e" }, |
| 76 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 8 , "ppc620" }, |
| 77 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 9 , "ppc750" }, |
| 78 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 10 , "ppc7400" }, |
| 79 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 11 , "ppc7450" }, |
| 80 | { eByteOrderBig, 4, llvm::MachO::CPUTypePowerPC, 100 , "ppc970" }, |
| 81 | { eByteOrderBig, 8, llvm::MachO::CPUTypePowerPC64, 0 , "ppc64" }, |
| 82 | { eByteOrderBig, 8, llvm::MachO::CPUTypePowerPC64, 100 , "ppc970-64" }, |
| 83 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 3 , "i386" }, |
| 84 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 4 , "i486" }, |
| 85 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, 0x84 , "i486sx" }, |
| 86 | { eByteOrderLittle, 4, llvm::MachO::CPUTypeI386, CPU_ANY , "i386" }, |
| 87 | { eByteOrderLittle, 8, llvm::MachO::CPUTypeX86_64, 3 , "x86_64" }, |
| 88 | { eByteOrderLittle, 8, llvm::MachO::CPUTypeX86_64, CPU_ANY , "x86_64" }, |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 89 | }; |
| 90 | |
| 91 | //---------------------------------------------------------------------- |
| 92 | // Figure out how many architecture definitions we have |
| 93 | //---------------------------------------------------------------------- |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 94 | const size_t k_num_mach_arch_defs = sizeof(g_mach_arch_defs)/sizeof(ArchDefinition); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 95 | |
| 96 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 97 | |
| 98 | //---------------------------------------------------------------------- |
| 99 | // A table that gets searched linearly for matches. This table is used |
| 100 | // to convert cpu type and subtypes to architecture names, and to |
| 101 | // convert architecture names to cpu types and subtypes. The ordering |
| 102 | // is important and allows the precedence to be set when the table is |
| 103 | // built. |
| 104 | //---------------------------------------------------------------------- |
| 105 | static ArchDefinition g_elf_arch_defs[] = |
| 106 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 107 | { eByteOrderInvalid, 0, llvm::ELF::EM_M32 , 0, "m32" }, // AT&T WE 32100 |
| 108 | { eByteOrderBig, 4, llvm::ELF::EM_SPARC , 0, "sparc" }, // Sparc |
| 109 | { eByteOrderLittle, 4, llvm::ELF::EM_386 , 0, "i386" }, // Intel 80386 |
| 110 | { eByteOrderBig, 4, llvm::ELF::EM_68K , 0, "68k" }, // Motorola 68000 |
| 111 | { eByteOrderBig, 4, llvm::ELF::EM_88K , 0, "88k" }, // Motorola 88000 |
| 112 | { eByteOrderLittle, 4, llvm::ELF::EM_486 , 0, "i486" }, // Intel 486 (deprecated) |
| 113 | { eByteOrderLittle, 4, llvm::ELF::EM_860 , 0, "860" }, // Intel 80860 |
| 114 | { eByteOrderBig, 4, llvm::ELF::EM_MIPS , 0, "rs3000" }, // MIPS RS3000 |
| 115 | { eByteOrderBig, 4, llvm::ELF::EM_PPC , 0, "ppc" }, // PowerPC |
| 116 | { eByteOrderBig, 8, 21 , 0, "ppc64" }, // PowerPC64 |
| 117 | { eByteOrderLittle, 4, llvm::ELF::EM_ARM , 0, "arm" }, // ARM |
| 118 | { eByteOrderLittle, 4, llvm::ELF::EM_ALPHA , 0, "alpha" }, // DEC Alpha |
| 119 | { eByteOrderLittle, 4, llvm::ELF::EM_SPARCV9, 0, "sparc9" }, // SPARC V9 |
| 120 | { eByteOrderLittle, 8, llvm::ELF::EM_X86_64 , 0, "x86_64" }, // AMD64 |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 121 | }; |
| 122 | |
| 123 | //---------------------------------------------------------------------- |
| 124 | // Figure out how many architecture definitions we have |
| 125 | //---------------------------------------------------------------------- |
| 126 | const size_t k_num_elf_arch_defs = sizeof(g_elf_arch_defs)/sizeof(ArchDefinition); |
| 127 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 128 | //---------------------------------------------------------------------- |
| 129 | // Default constructor |
| 130 | //---------------------------------------------------------------------- |
| 131 | ArchSpec::ArchSpec() : |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 132 | m_type (eArchTypeMachO), // Use the most complete arch definition which will always be translatable to any other ArchitectureType values |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 133 | m_cpu (LLDB_INVALID_CPUTYPE), |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 134 | m_sub (0), |
| 135 | m_triple (), |
| 136 | m_byte_order (lldb::endian::InlHostByteOrder()), |
| 137 | m_addr_byte_size (0) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 138 | { |
| 139 | } |
| 140 | |
| 141 | //---------------------------------------------------------------------- |
| 142 | // Constructor that initializes the object with supplied cpu and |
| 143 | // subtypes. |
| 144 | //---------------------------------------------------------------------- |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 145 | ArchSpec::ArchSpec (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) : |
| 146 | m_type (arch_type), |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 147 | m_cpu (cpu), |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 148 | m_sub (sub), |
| 149 | m_triple (), |
| 150 | m_byte_order (lldb::endian::InlHostByteOrder()), |
| 151 | m_addr_byte_size (0) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 152 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 153 | if (m_type == eArchTypeMachO) |
| 154 | MachOArchUpdated (); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 155 | } |
| 156 | |
| 157 | //---------------------------------------------------------------------- |
| 158 | // Constructor that initializes the object with supplied |
| 159 | // architecture name. There are also predefined values in |
| 160 | // Defines.h: |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 161 | // LLDB_ARCH_DEFAULT |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 162 | // The arch the current system defaults to when a program is |
| 163 | // launched without any extra attributes or settings. |
| 164 | // |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 165 | // LLDB_ARCH_DEFAULT_32BIT |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 166 | // The 32 bit arch the current system defaults to (if any) |
| 167 | // |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 168 | // LLDB_ARCH_DEFAULT_32BIT |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 169 | // The 64 bit arch the current system defaults to (if any) |
| 170 | //---------------------------------------------------------------------- |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 171 | ArchSpec::ArchSpec (const char *arch_name) : |
| 172 | m_type (eArchTypeMachO), // Use the most complete arch definition which will always be translatable to any other ArchitectureType values |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 173 | m_cpu (LLDB_INVALID_CPUTYPE), |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 174 | m_sub (0), |
| 175 | m_triple (), |
| 176 | m_byte_order (lldb::endian::InlHostByteOrder()), |
| 177 | m_addr_byte_size (0) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 178 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 179 | SetArch (arch_name); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 180 | } |
| 181 | |
| 182 | //---------------------------------------------------------------------- |
| 183 | // Destructor |
| 184 | //---------------------------------------------------------------------- |
| 185 | ArchSpec::~ArchSpec() |
| 186 | { |
| 187 | } |
| 188 | |
| 189 | //---------------------------------------------------------------------- |
| 190 | // Assignment operator |
| 191 | //---------------------------------------------------------------------- |
| 192 | const ArchSpec& |
| 193 | ArchSpec::operator= (const ArchSpec& rhs) |
| 194 | { |
| 195 | if (this != &rhs) |
| 196 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 197 | m_type = rhs.m_type; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 198 | m_cpu = rhs.m_cpu; |
| 199 | m_sub = rhs.m_sub; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 200 | m_triple = rhs.m_triple; |
| 201 | m_byte_order = rhs.m_byte_order; |
| 202 | m_addr_byte_size = rhs.m_addr_byte_size; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 203 | } |
| 204 | return *this; |
| 205 | } |
| 206 | |
| 207 | //---------------------------------------------------------------------- |
| 208 | // Get a C string representation of the current architecture |
| 209 | //---------------------------------------------------------------------- |
| 210 | const char * |
| 211 | ArchSpec::AsCString() const |
| 212 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 213 | return ArchSpec::AsCString(m_type, m_cpu, m_sub); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 214 | } |
| 215 | |
| 216 | //---------------------------------------------------------------------- |
| 217 | // Class function to get a C string representation given a CPU type |
| 218 | // and subtype. |
| 219 | //---------------------------------------------------------------------- |
| 220 | const char * |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 221 | ArchSpec::AsCString (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 222 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 223 | if (arch_type >= kNumArchTypes) |
| 224 | return NULL; |
| 225 | |
| 226 | switch (arch_type) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 227 | { |
Greg Clayton | c982c76 | 2010-07-09 20:39:50 +0000 | [diff] [blame] | 228 | case kNumArchTypes: |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 229 | case eArchTypeInvalid: |
| 230 | break; |
| 231 | |
| 232 | case eArchTypeMachO: |
| 233 | for (uint32_t i=0; i<k_num_mach_arch_defs; i++) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 234 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 235 | if (cpu == g_mach_arch_defs[i].cpu) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 236 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 237 | if (sub == g_mach_arch_defs[i].sub) |
| 238 | return g_mach_arch_defs[i].name; |
| 239 | else if (sub != CPU_ANY && sub != LLDB_INVALID_CPUTYPE) |
| 240 | { |
| 241 | if ((sub & 0x00ffffff) == g_mach_arch_defs[i].sub) |
| 242 | return g_mach_arch_defs[i].name; |
| 243 | } |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 244 | } |
| 245 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 246 | break; |
| 247 | |
| 248 | case eArchTypeELF: |
| 249 | for (uint32_t i=0; i<k_num_elf_arch_defs; i++) |
| 250 | { |
| 251 | if (cpu == g_elf_arch_defs[i].cpu) |
| 252 | { |
| 253 | if (sub == g_elf_arch_defs[i].sub) |
| 254 | return g_elf_arch_defs[i].name; |
| 255 | } |
| 256 | } |
| 257 | break; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 258 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 259 | |
| 260 | const char *arch_type_cstr = g_arch_type_strings[arch_type]; |
| 261 | |
| 262 | static char s_cpu_hex_str[128]; |
| 263 | ::snprintf(s_cpu_hex_str, |
| 264 | sizeof(s_cpu_hex_str), |
| 265 | "%s%c%u%c%u", |
| 266 | arch_type_cstr, |
| 267 | ARCH_SPEC_SEPARATOR_CHAR, |
| 268 | cpu, |
| 269 | ARCH_SPEC_SEPARATOR_CHAR, |
| 270 | sub); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 271 | return s_cpu_hex_str; |
| 272 | } |
| 273 | |
| 274 | //---------------------------------------------------------------------- |
| 275 | // Clears the object contents back to a default invalid state. |
| 276 | //---------------------------------------------------------------------- |
| 277 | void |
| 278 | ArchSpec::Clear() |
| 279 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 280 | m_type = eArchTypeInvalid; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 281 | m_cpu = LLDB_INVALID_CPUTYPE; |
| 282 | m_sub = 0; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 283 | m_triple = llvm::Triple(); |
| 284 | m_byte_order = lldb::endian::InlHostByteOrder(); |
| 285 | m_addr_byte_size = 0; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 286 | } |
| 287 | |
| 288 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 289 | |
| 290 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 291 | //---------------------------------------------------------------------- |
| 292 | // CPU subtype get accessor. |
| 293 | //---------------------------------------------------------------------- |
| 294 | uint32_t |
| 295 | ArchSpec::GetCPUSubtype() const |
| 296 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 297 | if (m_type == eArchTypeMachO) |
| 298 | { |
| 299 | if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) |
| 300 | return m_sub; |
| 301 | return m_sub & 0xffffff; |
| 302 | } |
| 303 | return 0; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 304 | } |
| 305 | |
| 306 | |
| 307 | //---------------------------------------------------------------------- |
| 308 | // CPU type get accessor. |
| 309 | //---------------------------------------------------------------------- |
| 310 | uint32_t |
| 311 | ArchSpec::GetCPUType() const |
| 312 | { |
| 313 | return m_cpu; |
| 314 | } |
| 315 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 316 | //---------------------------------------------------------------------- |
| 317 | // This function is designed to abstract us from having to know any |
| 318 | // details about the current m_type, m_cpu, and m_sub values and |
| 319 | // translate the result into a generic CPU type so LLDB core code can |
| 320 | // detect any CPUs that it supports. |
| 321 | //---------------------------------------------------------------------- |
| 322 | ArchSpec::CPU |
| 323 | ArchSpec::GetGenericCPUType () const |
| 324 | { |
| 325 | switch (m_type) |
| 326 | { |
Greg Clayton | c982c76 | 2010-07-09 20:39:50 +0000 | [diff] [blame] | 327 | case kNumArchTypes: |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 328 | case eArchTypeInvalid: |
| 329 | break; |
| 330 | |
| 331 | case eArchTypeMachO: |
| 332 | switch (m_cpu) |
| 333 | { |
| 334 | case llvm::MachO::CPUTypeARM: return eCPU_arm; |
| 335 | case llvm::MachO::CPUTypeI386: return eCPU_i386; |
| 336 | case llvm::MachO::CPUTypeX86_64: return eCPU_x86_64; |
| 337 | case llvm::MachO::CPUTypePowerPC: return eCPU_ppc; |
| 338 | case llvm::MachO::CPUTypePowerPC64: return eCPU_ppc64; |
| 339 | case llvm::MachO::CPUTypeSPARC: return eCPU_sparc; |
| 340 | } |
| 341 | break; |
| 342 | |
| 343 | case eArchTypeELF: |
| 344 | switch (m_cpu) |
| 345 | { |
| 346 | case llvm::ELF::EM_ARM: return eCPU_arm; |
| 347 | case llvm::ELF::EM_386: return eCPU_i386; |
| 348 | case llvm::ELF::EM_X86_64: return eCPU_x86_64; |
| 349 | case llvm::ELF::EM_PPC: return eCPU_ppc; |
| 350 | case 21: return eCPU_ppc64; |
| 351 | case llvm::ELF::EM_SPARC: return eCPU_sparc; |
| 352 | } |
| 353 | break; |
| 354 | } |
| 355 | |
| 356 | return eCPU_Unknown; |
| 357 | } |
| 358 | |
| 359 | |
| 360 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 361 | |
| 362 | //---------------------------------------------------------------------- |
| 363 | // Feature flags get accessor. |
| 364 | //---------------------------------------------------------------------- |
| 365 | uint32_t |
| 366 | ArchSpec::GetFeatureFlags() const |
| 367 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 368 | if (m_type == eArchTypeMachO) |
| 369 | { |
| 370 | if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) |
| 371 | return 0; |
| 372 | return m_sub & 0xff000000; |
| 373 | } |
| 374 | return 0; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 375 | } |
| 376 | |
| 377 | |
| 378 | static const char * g_i386_dwarf_reg_names[] = |
| 379 | { |
| 380 | "eax", |
| 381 | "ecx", |
| 382 | "edx", |
| 383 | "ebx", |
| 384 | "esp", |
| 385 | "ebp", |
| 386 | "esi", |
| 387 | "edi", |
| 388 | "eip", |
| 389 | "eflags" |
| 390 | }; |
| 391 | |
| 392 | static const char * g_i386_gcc_reg_names[] = |
| 393 | { |
| 394 | "eax", |
| 395 | "ecx", |
| 396 | "edx", |
| 397 | "ebx", |
| 398 | "ebp", |
| 399 | "esp", |
| 400 | "esi", |
| 401 | "edi", |
| 402 | "eip", |
| 403 | "eflags" |
| 404 | }; |
| 405 | |
| 406 | static const char * g_x86_64_dwarf_and_gcc_reg_names[] = { |
| 407 | "rax", |
| 408 | "rdx", |
| 409 | "rcx", |
| 410 | "rbx", |
| 411 | "rsi", |
| 412 | "rdi", |
| 413 | "rbp", |
| 414 | "rsp", |
| 415 | "r8", |
| 416 | "r9", |
| 417 | "r10", |
| 418 | "r11", |
| 419 | "r12", |
| 420 | "r13", |
| 421 | "r14", |
| 422 | "r15", |
| 423 | "rip" |
| 424 | }; |
| 425 | |
| 426 | // Values take from: |
| 427 | // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040a/IHI0040A_aadwarf.pdf |
| 428 | |
| 429 | enum |
| 430 | { |
| 431 | eRegNumARM_DWARF_r0 = 0, |
| 432 | eRegNumARM_DWARF_r1 = 1, |
| 433 | eRegNumARM_DWARF_r2 = 2, |
| 434 | eRegNumARM_DWARF_r3 = 3, |
| 435 | eRegNumARM_DWARF_r4 = 4, |
| 436 | eRegNumARM_DWARF_r5 = 5, |
| 437 | eRegNumARM_DWARF_r6 = 6, |
| 438 | eRegNumARM_DWARF_r7 = 7, |
| 439 | eRegNumARM_DWARF_r8 = 8, |
| 440 | eRegNumARM_DWARF_r9 = 9, |
| 441 | eRegNumARM_DWARF_r10 = 10, |
| 442 | eRegNumARM_DWARF_r11 = 11, |
| 443 | eRegNumARM_DWARF_r12 = 12, |
| 444 | eRegNumARM_DWARF_r13 = 13, // SP |
| 445 | eRegNumARM_DWARF_r14 = 14, // LR |
| 446 | eRegNumARM_DWARF_r15 = 15, // PC |
| 447 | |
| 448 | eRegNumARM_DWARF_f0_obsolete= 16, |
| 449 | eRegNumARM_DWARF_f1_obsolete, |
| 450 | eRegNumARM_DWARF_f2_obsolete, |
| 451 | eRegNumARM_DWARF_f3_obsolete, |
| 452 | eRegNumARM_DWARF_f4_obsolete, |
| 453 | eRegNumARM_DWARF_f5_obsolete, |
| 454 | eRegNumARM_DWARF_f6_obsolete, |
| 455 | eRegNumARM_DWARF_f7_obsolete, |
| 456 | |
| 457 | eRegNumARM_DWARF_s0_obsolete = 16, |
| 458 | eRegNumARM_DWARF_s1_obsolete, |
| 459 | eRegNumARM_DWARF_s2_obsolete, |
| 460 | eRegNumARM_DWARF_s3_obsolete, |
| 461 | eRegNumARM_DWARF_s4_obsolete, |
| 462 | eRegNumARM_DWARF_s5_obsolete, |
| 463 | eRegNumARM_DWARF_s6_obsolete, |
| 464 | eRegNumARM_DWARF_s7_obsolete, |
| 465 | eRegNumARM_DWARF_s8_obsolete, |
| 466 | eRegNumARM_DWARF_s9_obsolete, |
| 467 | eRegNumARM_DWARF_s10_obsolete, |
| 468 | eRegNumARM_DWARF_s11_obsolete, |
| 469 | eRegNumARM_DWARF_s12_obsolete, |
| 470 | eRegNumARM_DWARF_s13_obsolete, |
| 471 | eRegNumARM_DWARF_s14_obsolete, |
| 472 | eRegNumARM_DWARF_s15_obsolete, |
| 473 | eRegNumARM_DWARF_s16_obsolete, |
| 474 | eRegNumARM_DWARF_s17_obsolete, |
| 475 | eRegNumARM_DWARF_s18_obsolete, |
| 476 | eRegNumARM_DWARF_s19_obsolete, |
| 477 | eRegNumARM_DWARF_s20_obsolete, |
| 478 | eRegNumARM_DWARF_s21_obsolete, |
| 479 | eRegNumARM_DWARF_s22_obsolete, |
| 480 | eRegNumARM_DWARF_s23_obsolete, |
| 481 | eRegNumARM_DWARF_s24_obsolete, |
| 482 | eRegNumARM_DWARF_s25_obsolete, |
| 483 | eRegNumARM_DWARF_s26_obsolete, |
| 484 | eRegNumARM_DWARF_s27_obsolete, |
| 485 | eRegNumARM_DWARF_s28_obsolete, |
| 486 | eRegNumARM_DWARF_s29_obsolete, |
| 487 | eRegNumARM_DWARF_s30_obsolete, |
| 488 | eRegNumARM_DWARF_s31_obsolete, |
| 489 | |
| 490 | eRegNumARM_DWARF_s0 = 64, |
| 491 | eRegNumARM_DWARF_s1, |
| 492 | eRegNumARM_DWARF_s2, |
| 493 | eRegNumARM_DWARF_s3, |
| 494 | eRegNumARM_DWARF_s4, |
| 495 | eRegNumARM_DWARF_s5, |
| 496 | eRegNumARM_DWARF_s6, |
| 497 | eRegNumARM_DWARF_s7, |
| 498 | eRegNumARM_DWARF_s8, |
| 499 | eRegNumARM_DWARF_s9, |
| 500 | eRegNumARM_DWARF_s10, |
| 501 | eRegNumARM_DWARF_s11, |
| 502 | eRegNumARM_DWARF_s12, |
| 503 | eRegNumARM_DWARF_s13, |
| 504 | eRegNumARM_DWARF_s14, |
| 505 | eRegNumARM_DWARF_s15, |
| 506 | eRegNumARM_DWARF_s16, |
| 507 | eRegNumARM_DWARF_s17, |
| 508 | eRegNumARM_DWARF_s18, |
| 509 | eRegNumARM_DWARF_s19, |
| 510 | eRegNumARM_DWARF_s20, |
| 511 | eRegNumARM_DWARF_s21, |
| 512 | eRegNumARM_DWARF_s22, |
| 513 | eRegNumARM_DWARF_s23, |
| 514 | eRegNumARM_DWARF_s24, |
| 515 | eRegNumARM_DWARF_s25, |
| 516 | eRegNumARM_DWARF_s26, |
| 517 | eRegNumARM_DWARF_s27, |
| 518 | eRegNumARM_DWARF_s28, |
| 519 | eRegNumARM_DWARF_s29, |
| 520 | eRegNumARM_DWARF_s30, |
| 521 | eRegNumARM_DWARF_s31, |
| 522 | |
| 523 | eRegNumARM_DWARF_f0 = 96, |
| 524 | eRegNumARM_DWARF_f1, |
| 525 | eRegNumARM_DWARF_f2, |
| 526 | eRegNumARM_DWARF_f3, |
| 527 | eRegNumARM_DWARF_f4, |
| 528 | eRegNumARM_DWARF_f5, |
| 529 | eRegNumARM_DWARF_f6, |
| 530 | eRegNumARM_DWARF_f7, |
| 531 | |
| 532 | eRegNumARM_DWARF_ACC0 = 104, |
| 533 | eRegNumARM_DWARF_ACC1, |
| 534 | eRegNumARM_DWARF_ACC2, |
| 535 | eRegNumARM_DWARF_ACC3, |
| 536 | eRegNumARM_DWARF_ACC4, |
| 537 | eRegNumARM_DWARF_ACC5, |
| 538 | eRegNumARM_DWARF_ACC6, |
| 539 | eRegNumARM_DWARF_ACC7, |
| 540 | |
| 541 | eRegNumARM_DWARF_wCGR0 = 104, // These overlap with ACC0-ACC7 |
| 542 | eRegNumARM_DWARF_wCGR1, |
| 543 | eRegNumARM_DWARF_wCGR2, |
| 544 | eRegNumARM_DWARF_wCGR3, |
| 545 | eRegNumARM_DWARF_wCGR4, |
| 546 | eRegNumARM_DWARF_wCGR5, |
| 547 | eRegNumARM_DWARF_wCGR6, |
| 548 | eRegNumARM_DWARF_wCGR7, |
| 549 | |
| 550 | eRegNumARM_DWARF_wR0 = 112, |
| 551 | eRegNumARM_DWARF_wR1, |
| 552 | eRegNumARM_DWARF_wR2, |
| 553 | eRegNumARM_DWARF_wR3, |
| 554 | eRegNumARM_DWARF_wR4, |
| 555 | eRegNumARM_DWARF_wR5, |
| 556 | eRegNumARM_DWARF_wR6, |
| 557 | eRegNumARM_DWARF_wR7, |
| 558 | eRegNumARM_DWARF_wR8, |
| 559 | eRegNumARM_DWARF_wR9, |
| 560 | eRegNumARM_DWARF_wR10, |
| 561 | eRegNumARM_DWARF_wR11, |
| 562 | eRegNumARM_DWARF_wR12, |
| 563 | eRegNumARM_DWARF_wR13, |
| 564 | eRegNumARM_DWARF_wR14, |
| 565 | eRegNumARM_DWARF_wR15, |
| 566 | |
| 567 | eRegNumARM_DWARF_spsr = 128, |
| 568 | eRegNumARM_DWARF_spsr_fiq, |
| 569 | eRegNumARM_DWARF_spsr_irq, |
| 570 | eRegNumARM_DWARF_spsr_abt, |
| 571 | eRegNumARM_DWARF_spsr_und, |
| 572 | eRegNumARM_DWARF_spsr_svc, |
| 573 | |
| 574 | eRegNumARM_DWARF_r8_usr = 144, |
| 575 | eRegNumARM_DWARF_r9_usr, |
| 576 | eRegNumARM_DWARF_r10_usr, |
| 577 | eRegNumARM_DWARF_r11_usr, |
| 578 | eRegNumARM_DWARF_r12_usr, |
| 579 | eRegNumARM_DWARF_r13_usr, |
| 580 | eRegNumARM_DWARF_r14_usr, |
| 581 | |
| 582 | eRegNumARM_DWARF_r8_fiq = 151, |
| 583 | eRegNumARM_DWARF_r9_fiq, |
| 584 | eRegNumARM_DWARF_r10_fiq, |
| 585 | eRegNumARM_DWARF_r11_fiq, |
| 586 | eRegNumARM_DWARF_r12_fiq, |
| 587 | eRegNumARM_DWARF_r13_fiq, |
| 588 | eRegNumARM_DWARF_r14_fiq, |
| 589 | |
| 590 | eRegNumARM_DWARF_r13_irq, |
| 591 | eRegNumARM_DWARF_r14_irq, |
| 592 | |
| 593 | eRegNumARM_DWARF_r13_abt, |
| 594 | eRegNumARM_DWARF_r14_abt, |
| 595 | |
| 596 | eRegNumARM_DWARF_r13_und, |
| 597 | eRegNumARM_DWARF_r14_und, |
| 598 | |
| 599 | eRegNumARM_DWARF_r13_svc, |
| 600 | eRegNumARM_DWARF_r14_svc, |
| 601 | |
| 602 | eRegNumARM_DWARF_wC0 = 192, |
| 603 | eRegNumARM_DWARF_wC1, |
| 604 | eRegNumARM_DWARF_wC2, |
| 605 | eRegNumARM_DWARF_wC3, |
| 606 | eRegNumARM_DWARF_wC4, |
| 607 | eRegNumARM_DWARF_wC5, |
| 608 | eRegNumARM_DWARF_wC6, |
| 609 | eRegNumARM_DWARF_wC7, |
| 610 | |
| 611 | eRegNumARM_DWARF_d0 = 256, // VFP-v3/NEON D0-D31 (32 64 bit registers) |
| 612 | eRegNumARM_DWARF_d1, |
| 613 | eRegNumARM_DWARF_d2, |
| 614 | eRegNumARM_DWARF_d3, |
| 615 | eRegNumARM_DWARF_d4, |
| 616 | eRegNumARM_DWARF_d5, |
| 617 | eRegNumARM_DWARF_d6, |
| 618 | eRegNumARM_DWARF_d7, |
| 619 | eRegNumARM_DWARF_d8, |
| 620 | eRegNumARM_DWARF_d9, |
| 621 | eRegNumARM_DWARF_d10, |
| 622 | eRegNumARM_DWARF_d11, |
| 623 | eRegNumARM_DWARF_d12, |
| 624 | eRegNumARM_DWARF_d13, |
| 625 | eRegNumARM_DWARF_d14, |
| 626 | eRegNumARM_DWARF_d15, |
| 627 | eRegNumARM_DWARF_d16, |
| 628 | eRegNumARM_DWARF_d17, |
| 629 | eRegNumARM_DWARF_d18, |
| 630 | eRegNumARM_DWARF_d19, |
| 631 | eRegNumARM_DWARF_d20, |
| 632 | eRegNumARM_DWARF_d21, |
| 633 | eRegNumARM_DWARF_d22, |
| 634 | eRegNumARM_DWARF_d23, |
| 635 | eRegNumARM_DWARF_d24, |
| 636 | eRegNumARM_DWARF_d25, |
| 637 | eRegNumARM_DWARF_d26, |
| 638 | eRegNumARM_DWARF_d27, |
| 639 | eRegNumARM_DWARF_d28, |
| 640 | eRegNumARM_DWARF_d29, |
| 641 | eRegNumARM_DWARF_d30, |
| 642 | eRegNumARM_DWARF_d31 |
| 643 | }; |
| 644 | |
| 645 | // Register numbering definitions for 32 and 64 bit ppc for RegisterNumberingType::Dwarf |
| 646 | enum |
| 647 | { |
| 648 | eRegNumPPC_DWARF_r0 = 0, |
| 649 | eRegNumPPC_DWARF_r1 = 1, |
| 650 | eRegNumPPC_DWARF_r2 = 2, |
| 651 | eRegNumPPC_DWARF_r3 = 3, |
| 652 | eRegNumPPC_DWARF_r4 = 4, |
| 653 | eRegNumPPC_DWARF_r5 = 5, |
| 654 | eRegNumPPC_DWARF_r6 = 6, |
| 655 | eRegNumPPC_DWARF_r7 = 7, |
| 656 | eRegNumPPC_DWARF_r8 = 8, |
| 657 | eRegNumPPC_DWARF_r9 = 9, |
| 658 | eRegNumPPC_DWARF_r10 = 10, |
| 659 | eRegNumPPC_DWARF_r11 = 11, |
| 660 | eRegNumPPC_DWARF_r12 = 12, |
| 661 | eRegNumPPC_DWARF_r13 = 13, |
| 662 | eRegNumPPC_DWARF_r14 = 14, |
| 663 | eRegNumPPC_DWARF_r15 = 15, |
| 664 | eRegNumPPC_DWARF_r16 = 16, |
| 665 | eRegNumPPC_DWARF_r17 = 17, |
| 666 | eRegNumPPC_DWARF_r18 = 18, |
| 667 | eRegNumPPC_DWARF_r19 = 19, |
| 668 | eRegNumPPC_DWARF_r20 = 20, |
| 669 | eRegNumPPC_DWARF_r21 = 21, |
| 670 | eRegNumPPC_DWARF_r22 = 22, |
| 671 | eRegNumPPC_DWARF_r23 = 23, |
| 672 | eRegNumPPC_DWARF_r24 = 24, |
| 673 | eRegNumPPC_DWARF_r25 = 25, |
| 674 | eRegNumPPC_DWARF_r26 = 26, |
| 675 | eRegNumPPC_DWARF_r27 = 27, |
| 676 | eRegNumPPC_DWARF_r28 = 28, |
| 677 | eRegNumPPC_DWARF_r29 = 29, |
| 678 | eRegNumPPC_DWARF_r30 = 30, |
| 679 | eRegNumPPC_DWARF_r31 = 31, |
| 680 | |
| 681 | eRegNumPPC_DWARF_fr0 = 32, |
| 682 | eRegNumPPC_DWARF_fr1 = 33, |
| 683 | eRegNumPPC_DWARF_fr2 = 34, |
| 684 | eRegNumPPC_DWARF_fr3 = 35, |
| 685 | eRegNumPPC_DWARF_fr4 = 36, |
| 686 | eRegNumPPC_DWARF_fr5 = 37, |
| 687 | eRegNumPPC_DWARF_fr6 = 38, |
| 688 | eRegNumPPC_DWARF_fr7 = 39, |
| 689 | eRegNumPPC_DWARF_fr8 = 40, |
| 690 | eRegNumPPC_DWARF_fr9 = 41, |
| 691 | eRegNumPPC_DWARF_fr10 = 42, |
| 692 | eRegNumPPC_DWARF_fr11 = 43, |
| 693 | eRegNumPPC_DWARF_fr12 = 44, |
| 694 | eRegNumPPC_DWARF_fr13 = 45, |
| 695 | eRegNumPPC_DWARF_fr14 = 46, |
| 696 | eRegNumPPC_DWARF_fr15 = 47, |
| 697 | eRegNumPPC_DWARF_fr16 = 48, |
| 698 | eRegNumPPC_DWARF_fr17 = 49, |
| 699 | eRegNumPPC_DWARF_fr18 = 50, |
| 700 | eRegNumPPC_DWARF_fr19 = 51, |
| 701 | eRegNumPPC_DWARF_fr20 = 52, |
| 702 | eRegNumPPC_DWARF_fr21 = 53, |
| 703 | eRegNumPPC_DWARF_fr22 = 54, |
| 704 | eRegNumPPC_DWARF_fr23 = 55, |
| 705 | eRegNumPPC_DWARF_fr24 = 56, |
| 706 | eRegNumPPC_DWARF_fr25 = 57, |
| 707 | eRegNumPPC_DWARF_fr26 = 58, |
| 708 | eRegNumPPC_DWARF_fr27 = 59, |
| 709 | eRegNumPPC_DWARF_fr28 = 60, |
| 710 | eRegNumPPC_DWARF_fr29 = 61, |
| 711 | eRegNumPPC_DWARF_fr30 = 62, |
| 712 | eRegNumPPC_DWARF_fr31 = 63, |
| 713 | |
| 714 | eRegNumPPC_DWARF_cr = 64, |
| 715 | eRegNumPPC_DWARF_fpscr = 65, |
| 716 | eRegNumPPC_DWARF_msr = 66, |
| 717 | eRegNumPPC_DWARF_vscr = 67, |
| 718 | |
| 719 | eRegNumPPC_DWARF_sr0 = 70, |
| 720 | eRegNumPPC_DWARF_sr1, |
| 721 | eRegNumPPC_DWARF_sr2, |
| 722 | eRegNumPPC_DWARF_sr3, |
| 723 | eRegNumPPC_DWARF_sr4, |
| 724 | eRegNumPPC_DWARF_sr5, |
| 725 | eRegNumPPC_DWARF_sr6, |
| 726 | eRegNumPPC_DWARF_sr7, |
| 727 | eRegNumPPC_DWARF_sr8, |
| 728 | eRegNumPPC_DWARF_sr9, |
| 729 | eRegNumPPC_DWARF_sr10, |
| 730 | eRegNumPPC_DWARF_sr11, |
| 731 | eRegNumPPC_DWARF_sr12, |
| 732 | eRegNumPPC_DWARF_sr13, |
| 733 | eRegNumPPC_DWARF_sr14, |
| 734 | eRegNumPPC_DWARF_sr15, |
| 735 | |
| 736 | |
| 737 | eRegNumPPC_DWARF_acc = 99, |
| 738 | eRegNumPPC_DWARF_mq = 100, |
| 739 | eRegNumPPC_DWARF_xer = 101, |
| 740 | eRegNumPPC_DWARF_rtcu = 104, |
| 741 | eRegNumPPC_DWARF_rtcl = 105, |
| 742 | |
| 743 | eRegNumPPC_DWARF_lr = 108, |
| 744 | eRegNumPPC_DWARF_ctr = 109, |
| 745 | |
| 746 | eRegNumPPC_DWARF_dsisr = 118, |
| 747 | eRegNumPPC_DWARF_dar = 119, |
| 748 | eRegNumPPC_DWARF_dec = 122, |
| 749 | eRegNumPPC_DWARF_sdr1 = 125, |
| 750 | eRegNumPPC_DWARF_srr0 = 126, |
| 751 | eRegNumPPC_DWARF_srr1 = 127, |
| 752 | |
| 753 | eRegNumPPC_DWARF_vrsave = 356, |
| 754 | eRegNumPPC_DWARF_sprg0 = 372, |
| 755 | eRegNumPPC_DWARF_sprg1, |
| 756 | eRegNumPPC_DWARF_sprg2, |
| 757 | eRegNumPPC_DWARF_sprg3, |
| 758 | |
| 759 | eRegNumPPC_DWARF_asr = 380, |
| 760 | eRegNumPPC_DWARF_ear = 382, |
| 761 | eRegNumPPC_DWARF_tb = 384, |
| 762 | eRegNumPPC_DWARF_tbu = 385, |
| 763 | eRegNumPPC_DWARF_pvr = 387, |
| 764 | |
| 765 | eRegNumPPC_DWARF_spefscr = 612, |
| 766 | |
| 767 | eRegNumPPC_DWARF_ibat0u = 628, |
| 768 | eRegNumPPC_DWARF_ibat0l = 629, |
| 769 | eRegNumPPC_DWARF_ibat1u = 630, |
| 770 | eRegNumPPC_DWARF_ibat1l = 631, |
| 771 | eRegNumPPC_DWARF_ibat2u = 632, |
| 772 | eRegNumPPC_DWARF_ibat2l = 633, |
| 773 | eRegNumPPC_DWARF_ibat3u = 634, |
| 774 | eRegNumPPC_DWARF_ibat3l = 635, |
| 775 | eRegNumPPC_DWARF_dbat0u = 636, |
| 776 | eRegNumPPC_DWARF_dbat0l = 637, |
| 777 | eRegNumPPC_DWARF_dbat1u = 638, |
| 778 | eRegNumPPC_DWARF_dbat1l = 639, |
| 779 | eRegNumPPC_DWARF_dbat2u = 640, |
| 780 | eRegNumPPC_DWARF_dbat2l = 641, |
| 781 | eRegNumPPC_DWARF_dbat3u = 642, |
| 782 | eRegNumPPC_DWARF_dbat3l = 643, |
| 783 | |
| 784 | eRegNumPPC_DWARF_hid0 = 1108, |
| 785 | eRegNumPPC_DWARF_hid1, |
| 786 | eRegNumPPC_DWARF_hid2, |
| 787 | eRegNumPPC_DWARF_hid3, |
| 788 | eRegNumPPC_DWARF_hid4, |
| 789 | eRegNumPPC_DWARF_hid5, |
| 790 | eRegNumPPC_DWARF_hid6, |
| 791 | eRegNumPPC_DWARF_hid7, |
| 792 | eRegNumPPC_DWARF_hid8, |
| 793 | eRegNumPPC_DWARF_hid9, |
| 794 | eRegNumPPC_DWARF_hid10, |
| 795 | eRegNumPPC_DWARF_hid11, |
| 796 | eRegNumPPC_DWARF_hid12, |
| 797 | eRegNumPPC_DWARF_hid13, |
| 798 | eRegNumPPC_DWARF_hid14, |
| 799 | eRegNumPPC_DWARF_hid15, |
| 800 | |
| 801 | eRegNumPPC_DWARF_vr0 = 1124, |
| 802 | eRegNumPPC_DWARF_vr1, |
| 803 | eRegNumPPC_DWARF_vr2, |
| 804 | eRegNumPPC_DWARF_vr3, |
| 805 | eRegNumPPC_DWARF_vr4, |
| 806 | eRegNumPPC_DWARF_vr5, |
| 807 | eRegNumPPC_DWARF_vr6, |
| 808 | eRegNumPPC_DWARF_vr7, |
| 809 | eRegNumPPC_DWARF_vr8, |
| 810 | eRegNumPPC_DWARF_vr9, |
| 811 | eRegNumPPC_DWARF_vr10, |
| 812 | eRegNumPPC_DWARF_vr11, |
| 813 | eRegNumPPC_DWARF_vr12, |
| 814 | eRegNumPPC_DWARF_vr13, |
| 815 | eRegNumPPC_DWARF_vr14, |
| 816 | eRegNumPPC_DWARF_vr15, |
| 817 | eRegNumPPC_DWARF_vr16, |
| 818 | eRegNumPPC_DWARF_vr17, |
| 819 | eRegNumPPC_DWARF_vr18, |
| 820 | eRegNumPPC_DWARF_vr19, |
| 821 | eRegNumPPC_DWARF_vr20, |
| 822 | eRegNumPPC_DWARF_vr21, |
| 823 | eRegNumPPC_DWARF_vr22, |
| 824 | eRegNumPPC_DWARF_vr23, |
| 825 | eRegNumPPC_DWARF_vr24, |
| 826 | eRegNumPPC_DWARF_vr25, |
| 827 | eRegNumPPC_DWARF_vr26, |
| 828 | eRegNumPPC_DWARF_vr27, |
| 829 | eRegNumPPC_DWARF_vr28, |
| 830 | eRegNumPPC_DWARF_vr29, |
| 831 | eRegNumPPC_DWARF_vr30, |
| 832 | eRegNumPPC_DWARF_vr31, |
| 833 | |
| 834 | eRegNumPPC_DWARF_ev0 = 1200, |
| 835 | eRegNumPPC_DWARF_ev1, |
| 836 | eRegNumPPC_DWARF_ev2, |
| 837 | eRegNumPPC_DWARF_ev3, |
| 838 | eRegNumPPC_DWARF_ev4, |
| 839 | eRegNumPPC_DWARF_ev5, |
| 840 | eRegNumPPC_DWARF_ev6, |
| 841 | eRegNumPPC_DWARF_ev7, |
| 842 | eRegNumPPC_DWARF_ev8, |
| 843 | eRegNumPPC_DWARF_ev9, |
| 844 | eRegNumPPC_DWARF_ev10, |
| 845 | eRegNumPPC_DWARF_ev11, |
| 846 | eRegNumPPC_DWARF_ev12, |
| 847 | eRegNumPPC_DWARF_ev13, |
| 848 | eRegNumPPC_DWARF_ev14, |
| 849 | eRegNumPPC_DWARF_ev15, |
| 850 | eRegNumPPC_DWARF_ev16, |
| 851 | eRegNumPPC_DWARF_ev17, |
| 852 | eRegNumPPC_DWARF_ev18, |
| 853 | eRegNumPPC_DWARF_ev19, |
| 854 | eRegNumPPC_DWARF_ev20, |
| 855 | eRegNumPPC_DWARF_ev21, |
| 856 | eRegNumPPC_DWARF_ev22, |
| 857 | eRegNumPPC_DWARF_ev23, |
| 858 | eRegNumPPC_DWARF_ev24, |
| 859 | eRegNumPPC_DWARF_ev25, |
| 860 | eRegNumPPC_DWARF_ev26, |
| 861 | eRegNumPPC_DWARF_ev27, |
| 862 | eRegNumPPC_DWARF_ev28, |
| 863 | eRegNumPPC_DWARF_ev29, |
| 864 | eRegNumPPC_DWARF_ev30, |
| 865 | eRegNumPPC_DWARF_ev31 |
| 866 | }; |
| 867 | |
| 868 | // Register numbering definitions for 32 and 64 bit ppc for RegisterNumberingType::GCC |
| 869 | enum |
| 870 | { |
| 871 | eRegNumPPC_GCC_r0 = 0, |
| 872 | eRegNumPPC_GCC_r1 = 1, |
| 873 | eRegNumPPC_GCC_r2 = 2, |
| 874 | eRegNumPPC_GCC_r3 = 3, |
| 875 | eRegNumPPC_GCC_r4 = 4, |
| 876 | eRegNumPPC_GCC_r5 = 5, |
| 877 | eRegNumPPC_GCC_r6 = 6, |
| 878 | eRegNumPPC_GCC_r7 = 7, |
| 879 | eRegNumPPC_GCC_r8 = 8, |
| 880 | eRegNumPPC_GCC_r9 = 9, |
| 881 | eRegNumPPC_GCC_r10 = 10, |
| 882 | eRegNumPPC_GCC_r11 = 11, |
| 883 | eRegNumPPC_GCC_r12 = 12, |
| 884 | eRegNumPPC_GCC_r13 = 13, |
| 885 | eRegNumPPC_GCC_r14 = 14, |
| 886 | eRegNumPPC_GCC_r15 = 15, |
| 887 | eRegNumPPC_GCC_r16 = 16, |
| 888 | eRegNumPPC_GCC_r17 = 17, |
| 889 | eRegNumPPC_GCC_r18 = 18, |
| 890 | eRegNumPPC_GCC_r19 = 19, |
| 891 | eRegNumPPC_GCC_r20 = 20, |
| 892 | eRegNumPPC_GCC_r21 = 21, |
| 893 | eRegNumPPC_GCC_r22 = 22, |
| 894 | eRegNumPPC_GCC_r23 = 23, |
| 895 | eRegNumPPC_GCC_r24 = 24, |
| 896 | eRegNumPPC_GCC_r25 = 25, |
| 897 | eRegNumPPC_GCC_r26 = 26, |
| 898 | eRegNumPPC_GCC_r27 = 27, |
| 899 | eRegNumPPC_GCC_r28 = 28, |
| 900 | eRegNumPPC_GCC_r29 = 29, |
| 901 | eRegNumPPC_GCC_r30 = 30, |
| 902 | eRegNumPPC_GCC_r31 = 31, |
| 903 | eRegNumPPC_GCC_fr0 = 32, |
| 904 | eRegNumPPC_GCC_fr1 = 33, |
| 905 | eRegNumPPC_GCC_fr2 = 34, |
| 906 | eRegNumPPC_GCC_fr3 = 35, |
| 907 | eRegNumPPC_GCC_fr4 = 36, |
| 908 | eRegNumPPC_GCC_fr5 = 37, |
| 909 | eRegNumPPC_GCC_fr6 = 38, |
| 910 | eRegNumPPC_GCC_fr7 = 39, |
| 911 | eRegNumPPC_GCC_fr8 = 40, |
| 912 | eRegNumPPC_GCC_fr9 = 41, |
| 913 | eRegNumPPC_GCC_fr10 = 42, |
| 914 | eRegNumPPC_GCC_fr11 = 43, |
| 915 | eRegNumPPC_GCC_fr12 = 44, |
| 916 | eRegNumPPC_GCC_fr13 = 45, |
| 917 | eRegNumPPC_GCC_fr14 = 46, |
| 918 | eRegNumPPC_GCC_fr15 = 47, |
| 919 | eRegNumPPC_GCC_fr16 = 48, |
| 920 | eRegNumPPC_GCC_fr17 = 49, |
| 921 | eRegNumPPC_GCC_fr18 = 50, |
| 922 | eRegNumPPC_GCC_fr19 = 51, |
| 923 | eRegNumPPC_GCC_fr20 = 52, |
| 924 | eRegNumPPC_GCC_fr21 = 53, |
| 925 | eRegNumPPC_GCC_fr22 = 54, |
| 926 | eRegNumPPC_GCC_fr23 = 55, |
| 927 | eRegNumPPC_GCC_fr24 = 56, |
| 928 | eRegNumPPC_GCC_fr25 = 57, |
| 929 | eRegNumPPC_GCC_fr26 = 58, |
| 930 | eRegNumPPC_GCC_fr27 = 59, |
| 931 | eRegNumPPC_GCC_fr28 = 60, |
| 932 | eRegNumPPC_GCC_fr29 = 61, |
| 933 | eRegNumPPC_GCC_fr30 = 62, |
| 934 | eRegNumPPC_GCC_fr31 = 63, |
| 935 | eRegNumPPC_GCC_mq = 64, |
| 936 | eRegNumPPC_GCC_lr = 65, |
| 937 | eRegNumPPC_GCC_ctr = 66, |
| 938 | eRegNumPPC_GCC_ap = 67, |
| 939 | eRegNumPPC_GCC_cr0 = 68, |
| 940 | eRegNumPPC_GCC_cr1 = 69, |
| 941 | eRegNumPPC_GCC_cr2 = 70, |
| 942 | eRegNumPPC_GCC_cr3 = 71, |
| 943 | eRegNumPPC_GCC_cr4 = 72, |
| 944 | eRegNumPPC_GCC_cr5 = 73, |
| 945 | eRegNumPPC_GCC_cr6 = 74, |
| 946 | eRegNumPPC_GCC_cr7 = 75, |
| 947 | eRegNumPPC_GCC_xer = 76, |
| 948 | eRegNumPPC_GCC_v0 = 77, |
| 949 | eRegNumPPC_GCC_v1 = 78, |
| 950 | eRegNumPPC_GCC_v2 = 79, |
| 951 | eRegNumPPC_GCC_v3 = 80, |
| 952 | eRegNumPPC_GCC_v4 = 81, |
| 953 | eRegNumPPC_GCC_v5 = 82, |
| 954 | eRegNumPPC_GCC_v6 = 83, |
| 955 | eRegNumPPC_GCC_v7 = 84, |
| 956 | eRegNumPPC_GCC_v8 = 85, |
| 957 | eRegNumPPC_GCC_v9 = 86, |
| 958 | eRegNumPPC_GCC_v10 = 87, |
| 959 | eRegNumPPC_GCC_v11 = 88, |
| 960 | eRegNumPPC_GCC_v12 = 89, |
| 961 | eRegNumPPC_GCC_v13 = 90, |
| 962 | eRegNumPPC_GCC_v14 = 91, |
| 963 | eRegNumPPC_GCC_v15 = 92, |
| 964 | eRegNumPPC_GCC_v16 = 93, |
| 965 | eRegNumPPC_GCC_v17 = 94, |
| 966 | eRegNumPPC_GCC_v18 = 95, |
| 967 | eRegNumPPC_GCC_v19 = 96, |
| 968 | eRegNumPPC_GCC_v20 = 97, |
| 969 | eRegNumPPC_GCC_v21 = 98, |
| 970 | eRegNumPPC_GCC_v22 = 99, |
| 971 | eRegNumPPC_GCC_v23 = 100, |
| 972 | eRegNumPPC_GCC_v24 = 101, |
| 973 | eRegNumPPC_GCC_v25 = 102, |
| 974 | eRegNumPPC_GCC_v26 = 103, |
| 975 | eRegNumPPC_GCC_v27 = 104, |
| 976 | eRegNumPPC_GCC_v28 = 105, |
| 977 | eRegNumPPC_GCC_v29 = 106, |
| 978 | eRegNumPPC_GCC_v30 = 107, |
| 979 | eRegNumPPC_GCC_v31 = 108, |
| 980 | eRegNumPPC_GCC_vrsave = 109, |
| 981 | eRegNumPPC_GCC_vscr = 110, |
| 982 | eRegNumPPC_GCC_spe_acc = 111, |
| 983 | eRegNumPPC_GCC_spefscr = 112, |
Greg Clayton | c982c76 | 2010-07-09 20:39:50 +0000 | [diff] [blame] | 984 | eRegNumPPC_GCC_sfp = 113 |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 985 | }; |
| 986 | |
| 987 | static const char * g_arm_gcc_reg_names[] = { |
| 988 | "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
| 989 | "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", |
| 990 | "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", |
| 991 | "cc", "sfp", "afp", |
| 992 | "mv0", "mv1", "mv2", "mv3", "mv4", "mv5", "mv6", "mv7", |
| 993 | "mv8", "mv9", "mv10", "mv11", "mv12", "mv13", "mv14", "mv15", |
| 994 | "wcgr0","wcgr1","wcgr2","wcgr3", |
| 995 | "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", |
| 996 | "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15", |
| 997 | "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", |
| 998 | "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15", |
| 999 | "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", |
| 1000 | "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31", |
| 1001 | "vfpcc" |
| 1002 | }; |
| 1003 | |
| 1004 | //---------------------------------------------------------------------- |
| 1005 | // Get register names for the current object architecture given |
| 1006 | // a register number, and a reg_kind for that register number. |
| 1007 | //---------------------------------------------------------------------- |
| 1008 | const char * |
| 1009 | ArchSpec::GetRegisterName(uint32_t reg_num, uint32_t reg_kind) const |
| 1010 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1011 | return ArchSpec::GetRegisterName(m_type, m_cpu, m_sub, reg_num, reg_kind); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1012 | } |
| 1013 | |
| 1014 | |
| 1015 | //---------------------------------------------------------------------- |
| 1016 | // Get register names for the specified CPU type and subtype given |
| 1017 | // a register number, and a reg_kind for that register number. |
| 1018 | //---------------------------------------------------------------------- |
| 1019 | const char * |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1020 | ArchSpec::GetRegisterName (ArchitectureType arch_type, uint32_t cpu, uint32_t subtype, uint32_t reg_num, uint32_t reg_kind) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1021 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1022 | if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeI386) || |
| 1023 | (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_386)) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1024 | { |
| 1025 | switch (reg_kind) |
| 1026 | { |
| 1027 | case eRegisterKindGCC: |
| 1028 | if (reg_num < sizeof(g_i386_gcc_reg_names)/sizeof(const char *)) |
| 1029 | return g_i386_gcc_reg_names[reg_num]; |
| 1030 | break; |
| 1031 | case eRegisterKindDWARF: |
| 1032 | if (reg_num < sizeof(g_i386_dwarf_reg_names)/sizeof(const char *)) |
| 1033 | return g_i386_dwarf_reg_names[reg_num]; |
| 1034 | break; |
| 1035 | default: |
| 1036 | break; |
| 1037 | } |
| 1038 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1039 | else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeX86_64) || |
| 1040 | (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_X86_64)) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1041 | { |
| 1042 | switch (reg_kind) |
| 1043 | { |
| 1044 | case eRegisterKindGCC: |
| 1045 | case eRegisterKindDWARF: |
| 1046 | if (reg_num < sizeof(g_x86_64_dwarf_and_gcc_reg_names)/sizeof(const char *)) |
| 1047 | return g_x86_64_dwarf_and_gcc_reg_names[reg_num]; |
| 1048 | break; |
| 1049 | default: |
| 1050 | break; |
| 1051 | } |
| 1052 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1053 | else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeARM) || |
| 1054 | (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_ARM)) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1055 | { |
| 1056 | switch (reg_kind) |
| 1057 | { |
| 1058 | case eRegisterKindGCC: |
| 1059 | if (reg_num < sizeof(g_arm_gcc_reg_names)/sizeof(const char *)) |
| 1060 | return g_arm_gcc_reg_names[reg_num]; |
| 1061 | break; |
| 1062 | |
| 1063 | case eRegisterKindDWARF: |
| 1064 | switch (reg_num) |
| 1065 | { |
| 1066 | case eRegNumARM_DWARF_r0: return "r0"; |
| 1067 | case eRegNumARM_DWARF_r1: return "r1"; |
| 1068 | case eRegNumARM_DWARF_r2: return "r2"; |
| 1069 | case eRegNumARM_DWARF_r3: return "r3"; |
| 1070 | case eRegNumARM_DWARF_r4: return "r4"; |
| 1071 | case eRegNumARM_DWARF_r5: return "r5"; |
| 1072 | case eRegNumARM_DWARF_r6: return "r6"; |
| 1073 | case eRegNumARM_DWARF_r7: return "r7"; |
| 1074 | case eRegNumARM_DWARF_r8: return "r8"; |
| 1075 | case eRegNumARM_DWARF_r9: return "r9"; |
| 1076 | case eRegNumARM_DWARF_r10: return "r10"; |
| 1077 | case eRegNumARM_DWARF_r11: return "r11"; |
| 1078 | case eRegNumARM_DWARF_r12: return "r12"; |
| 1079 | case eRegNumARM_DWARF_r13: return "sp"; |
| 1080 | case eRegNumARM_DWARF_r14: return "lr"; |
| 1081 | case eRegNumARM_DWARF_r15: return "pc"; |
| 1082 | case eRegNumARM_DWARF_s0_obsolete: case eRegNumARM_DWARF_s0: return "s0"; |
| 1083 | case eRegNumARM_DWARF_s1_obsolete: case eRegNumARM_DWARF_s1: return "s1"; |
| 1084 | case eRegNumARM_DWARF_s2_obsolete: case eRegNumARM_DWARF_s2: return "s2"; |
| 1085 | case eRegNumARM_DWARF_s3_obsolete: case eRegNumARM_DWARF_s3: return "s3"; |
| 1086 | case eRegNumARM_DWARF_s4_obsolete: case eRegNumARM_DWARF_s4: return "s4"; |
| 1087 | case eRegNumARM_DWARF_s5_obsolete: case eRegNumARM_DWARF_s5: return "s5"; |
| 1088 | case eRegNumARM_DWARF_s6_obsolete: case eRegNumARM_DWARF_s6: return "s6"; |
| 1089 | case eRegNumARM_DWARF_s7_obsolete: case eRegNumARM_DWARF_s7: return "s7"; |
| 1090 | case eRegNumARM_DWARF_s8_obsolete: case eRegNumARM_DWARF_s8: return "s8"; |
| 1091 | case eRegNumARM_DWARF_s9_obsolete: case eRegNumARM_DWARF_s9: return "s9"; |
| 1092 | case eRegNumARM_DWARF_s10_obsolete: case eRegNumARM_DWARF_s10: return "s10"; |
| 1093 | case eRegNumARM_DWARF_s11_obsolete: case eRegNumARM_DWARF_s11: return "s11"; |
| 1094 | case eRegNumARM_DWARF_s12_obsolete: case eRegNumARM_DWARF_s12: return "s12"; |
| 1095 | case eRegNumARM_DWARF_s13_obsolete: case eRegNumARM_DWARF_s13: return "s13"; |
| 1096 | case eRegNumARM_DWARF_s14_obsolete: case eRegNumARM_DWARF_s14: return "s14"; |
| 1097 | case eRegNumARM_DWARF_s15_obsolete: case eRegNumARM_DWARF_s15: return "s15"; |
| 1098 | case eRegNumARM_DWARF_s16_obsolete: case eRegNumARM_DWARF_s16: return "s16"; |
| 1099 | case eRegNumARM_DWARF_s17_obsolete: case eRegNumARM_DWARF_s17: return "s17"; |
| 1100 | case eRegNumARM_DWARF_s18_obsolete: case eRegNumARM_DWARF_s18: return "s18"; |
| 1101 | case eRegNumARM_DWARF_s19_obsolete: case eRegNumARM_DWARF_s19: return "s19"; |
| 1102 | case eRegNumARM_DWARF_s20_obsolete: case eRegNumARM_DWARF_s20: return "s20"; |
| 1103 | case eRegNumARM_DWARF_s21_obsolete: case eRegNumARM_DWARF_s21: return "s21"; |
| 1104 | case eRegNumARM_DWARF_s22_obsolete: case eRegNumARM_DWARF_s22: return "s22"; |
| 1105 | case eRegNumARM_DWARF_s23_obsolete: case eRegNumARM_DWARF_s23: return "s23"; |
| 1106 | case eRegNumARM_DWARF_s24_obsolete: case eRegNumARM_DWARF_s24: return "s24"; |
| 1107 | case eRegNumARM_DWARF_s25_obsolete: case eRegNumARM_DWARF_s25: return "s25"; |
| 1108 | case eRegNumARM_DWARF_s26_obsolete: case eRegNumARM_DWARF_s26: return "s26"; |
| 1109 | case eRegNumARM_DWARF_s27_obsolete: case eRegNumARM_DWARF_s27: return "s27"; |
| 1110 | case eRegNumARM_DWARF_s28_obsolete: case eRegNumARM_DWARF_s28: return "s28"; |
| 1111 | case eRegNumARM_DWARF_s29_obsolete: case eRegNumARM_DWARF_s29: return "s29"; |
| 1112 | case eRegNumARM_DWARF_s30_obsolete: case eRegNumARM_DWARF_s30: return "s30"; |
| 1113 | case eRegNumARM_DWARF_s31_obsolete: case eRegNumARM_DWARF_s31: return "s31"; |
| 1114 | case eRegNumARM_DWARF_f0: return "f0"; |
| 1115 | case eRegNumARM_DWARF_f1: return "f1"; |
| 1116 | case eRegNumARM_DWARF_f2: return "f2"; |
| 1117 | case eRegNumARM_DWARF_f3: return "f3"; |
| 1118 | case eRegNumARM_DWARF_f4: return "f4"; |
| 1119 | case eRegNumARM_DWARF_f5: return "f5"; |
| 1120 | case eRegNumARM_DWARF_f6: return "f6"; |
| 1121 | case eRegNumARM_DWARF_f7: return "f7"; |
| 1122 | case eRegNumARM_DWARF_wCGR0: return "wCGR0/ACC0"; |
| 1123 | case eRegNumARM_DWARF_wCGR1: return "wCGR1/ACC1"; |
| 1124 | case eRegNumARM_DWARF_wCGR2: return "wCGR2/ACC2"; |
| 1125 | case eRegNumARM_DWARF_wCGR3: return "wCGR3/ACC3"; |
| 1126 | case eRegNumARM_DWARF_wCGR4: return "wCGR4/ACC4"; |
| 1127 | case eRegNumARM_DWARF_wCGR5: return "wCGR5/ACC5"; |
| 1128 | case eRegNumARM_DWARF_wCGR6: return "wCGR6/ACC6"; |
| 1129 | case eRegNumARM_DWARF_wCGR7: return "wCGR7/ACC7"; |
| 1130 | case eRegNumARM_DWARF_wR0: return "wR0"; |
| 1131 | case eRegNumARM_DWARF_wR1: return "wR1"; |
| 1132 | case eRegNumARM_DWARF_wR2: return "wR2"; |
| 1133 | case eRegNumARM_DWARF_wR3: return "wR3"; |
| 1134 | case eRegNumARM_DWARF_wR4: return "wR4"; |
| 1135 | case eRegNumARM_DWARF_wR5: return "wR5"; |
| 1136 | case eRegNumARM_DWARF_wR6: return "wR6"; |
| 1137 | case eRegNumARM_DWARF_wR7: return "wR7"; |
| 1138 | case eRegNumARM_DWARF_wR8: return "wR8"; |
| 1139 | case eRegNumARM_DWARF_wR9: return "wR9"; |
| 1140 | case eRegNumARM_DWARF_wR10: return "wR10"; |
| 1141 | case eRegNumARM_DWARF_wR11: return "wR11"; |
| 1142 | case eRegNumARM_DWARF_wR12: return "wR12"; |
| 1143 | case eRegNumARM_DWARF_wR13: return "wR13"; |
| 1144 | case eRegNumARM_DWARF_wR14: return "wR14"; |
| 1145 | case eRegNumARM_DWARF_wR15: return "wR15"; |
| 1146 | case eRegNumARM_DWARF_spsr: return "spsr"; |
| 1147 | case eRegNumARM_DWARF_spsr_fiq: return "spsr_fiq"; |
| 1148 | case eRegNumARM_DWARF_spsr_irq: return "spsr_irq"; |
| 1149 | case eRegNumARM_DWARF_spsr_abt: return "spsr_abt"; |
| 1150 | case eRegNumARM_DWARF_spsr_und: return "spsr_und"; |
| 1151 | case eRegNumARM_DWARF_spsr_svc: return "spsr_svc"; |
| 1152 | case eRegNumARM_DWARF_r8_usr: return "r8_usr"; |
| 1153 | case eRegNumARM_DWARF_r9_usr: return "r9_usr"; |
| 1154 | case eRegNumARM_DWARF_r10_usr: return "r10_usr"; |
| 1155 | case eRegNumARM_DWARF_r11_usr: return "r11_usr"; |
| 1156 | case eRegNumARM_DWARF_r12_usr: return "r12_usr"; |
| 1157 | case eRegNumARM_DWARF_r13_usr: return "sp_usr"; |
| 1158 | case eRegNumARM_DWARF_r14_usr: return "lr_usr"; |
| 1159 | case eRegNumARM_DWARF_r8_fiq: return "r8_fiq"; |
| 1160 | case eRegNumARM_DWARF_r9_fiq: return "r9_fiq"; |
| 1161 | case eRegNumARM_DWARF_r10_fiq: return "r10_fiq"; |
| 1162 | case eRegNumARM_DWARF_r11_fiq: return "r11_fiq"; |
| 1163 | case eRegNumARM_DWARF_r12_fiq: return "r12_fiq"; |
| 1164 | case eRegNumARM_DWARF_r13_fiq: return "sp_fiq"; |
| 1165 | case eRegNumARM_DWARF_r14_fiq: return "lr_fiq"; |
| 1166 | case eRegNumARM_DWARF_r13_irq: return "sp_irq"; |
| 1167 | case eRegNumARM_DWARF_r14_irq: return "lr_irq"; |
| 1168 | case eRegNumARM_DWARF_r13_abt: return "sp_abt"; |
| 1169 | case eRegNumARM_DWARF_r14_abt: return "lr_abt"; |
| 1170 | case eRegNumARM_DWARF_r13_und: return "sp_und"; |
| 1171 | case eRegNumARM_DWARF_r14_und: return "lr_und"; |
| 1172 | case eRegNumARM_DWARF_r13_svc: return "sp_svc"; |
| 1173 | case eRegNumARM_DWARF_r14_svc: return "lr_svc"; |
| 1174 | case eRegNumARM_DWARF_wC0: return "wC0"; |
| 1175 | case eRegNumARM_DWARF_wC1: return "wC1"; |
| 1176 | case eRegNumARM_DWARF_wC2: return "wC2"; |
| 1177 | case eRegNumARM_DWARF_wC3: return "wC3"; |
| 1178 | case eRegNumARM_DWARF_wC4: return "wC4"; |
| 1179 | case eRegNumARM_DWARF_wC5: return "wC5"; |
| 1180 | case eRegNumARM_DWARF_wC6: return "wC6"; |
| 1181 | case eRegNumARM_DWARF_wC7: return "wC7"; |
| 1182 | case eRegNumARM_DWARF_d0: return "d0"; |
| 1183 | case eRegNumARM_DWARF_d1: return "d1"; |
| 1184 | case eRegNumARM_DWARF_d2: return "d2"; |
| 1185 | case eRegNumARM_DWARF_d3: return "d3"; |
| 1186 | case eRegNumARM_DWARF_d4: return "d4"; |
| 1187 | case eRegNumARM_DWARF_d5: return "d5"; |
| 1188 | case eRegNumARM_DWARF_d6: return "d6"; |
| 1189 | case eRegNumARM_DWARF_d7: return "d7"; |
| 1190 | case eRegNumARM_DWARF_d8: return "d8"; |
| 1191 | case eRegNumARM_DWARF_d9: return "d9"; |
| 1192 | case eRegNumARM_DWARF_d10: return "d10"; |
| 1193 | case eRegNumARM_DWARF_d11: return "d11"; |
| 1194 | case eRegNumARM_DWARF_d12: return "d12"; |
| 1195 | case eRegNumARM_DWARF_d13: return "d13"; |
| 1196 | case eRegNumARM_DWARF_d14: return "d14"; |
| 1197 | case eRegNumARM_DWARF_d15: return "d15"; |
| 1198 | case eRegNumARM_DWARF_d16: return "d16"; |
| 1199 | case eRegNumARM_DWARF_d17: return "d17"; |
| 1200 | case eRegNumARM_DWARF_d18: return "d18"; |
| 1201 | case eRegNumARM_DWARF_d19: return "d19"; |
| 1202 | case eRegNumARM_DWARF_d20: return "d20"; |
| 1203 | case eRegNumARM_DWARF_d21: return "d21"; |
| 1204 | case eRegNumARM_DWARF_d22: return "d22"; |
| 1205 | case eRegNumARM_DWARF_d23: return "d23"; |
| 1206 | case eRegNumARM_DWARF_d24: return "d24"; |
| 1207 | case eRegNumARM_DWARF_d25: return "d25"; |
| 1208 | case eRegNumARM_DWARF_d26: return "d26"; |
| 1209 | case eRegNumARM_DWARF_d27: return "d27"; |
| 1210 | case eRegNumARM_DWARF_d28: return "d28"; |
| 1211 | case eRegNumARM_DWARF_d29: return "d29"; |
| 1212 | case eRegNumARM_DWARF_d30: return "d30"; |
| 1213 | case eRegNumARM_DWARF_d31: return "d31"; |
| 1214 | } |
| 1215 | break; |
| 1216 | default: |
| 1217 | break; |
| 1218 | } |
| 1219 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1220 | else if ((arch_type == eArchTypeMachO && (cpu == llvm::MachO::CPUTypePowerPC || cpu == llvm::MachO::CPUTypePowerPC64)) || |
| 1221 | (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_PPC)) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1222 | { |
| 1223 | switch (reg_kind) |
| 1224 | { |
| 1225 | case eRegisterKindGCC: |
| 1226 | switch (reg_num) |
| 1227 | { |
| 1228 | case eRegNumPPC_GCC_r0: return "r0"; |
| 1229 | case eRegNumPPC_GCC_r1: return "r1"; |
| 1230 | case eRegNumPPC_GCC_r2: return "r2"; |
| 1231 | case eRegNumPPC_GCC_r3: return "r3"; |
| 1232 | case eRegNumPPC_GCC_r4: return "r4"; |
| 1233 | case eRegNumPPC_GCC_r5: return "r5"; |
| 1234 | case eRegNumPPC_GCC_r6: return "r6"; |
| 1235 | case eRegNumPPC_GCC_r7: return "r7"; |
| 1236 | case eRegNumPPC_GCC_r8: return "r8"; |
| 1237 | case eRegNumPPC_GCC_r9: return "r9"; |
| 1238 | case eRegNumPPC_GCC_r10: return "r10"; |
| 1239 | case eRegNumPPC_GCC_r11: return "r11"; |
| 1240 | case eRegNumPPC_GCC_r12: return "r12"; |
| 1241 | case eRegNumPPC_GCC_r13: return "r13"; |
| 1242 | case eRegNumPPC_GCC_r14: return "r14"; |
| 1243 | case eRegNumPPC_GCC_r15: return "r15"; |
| 1244 | case eRegNumPPC_GCC_r16: return "r16"; |
| 1245 | case eRegNumPPC_GCC_r17: return "r17"; |
| 1246 | case eRegNumPPC_GCC_r18: return "r18"; |
| 1247 | case eRegNumPPC_GCC_r19: return "r19"; |
| 1248 | case eRegNumPPC_GCC_r20: return "r20"; |
| 1249 | case eRegNumPPC_GCC_r21: return "r21"; |
| 1250 | case eRegNumPPC_GCC_r22: return "r22"; |
| 1251 | case eRegNumPPC_GCC_r23: return "r23"; |
| 1252 | case eRegNumPPC_GCC_r24: return "r24"; |
| 1253 | case eRegNumPPC_GCC_r25: return "r25"; |
| 1254 | case eRegNumPPC_GCC_r26: return "r26"; |
| 1255 | case eRegNumPPC_GCC_r27: return "r27"; |
| 1256 | case eRegNumPPC_GCC_r28: return "r28"; |
| 1257 | case eRegNumPPC_GCC_r29: return "r29"; |
| 1258 | case eRegNumPPC_GCC_r30: return "r30"; |
| 1259 | case eRegNumPPC_GCC_r31: return "r31"; |
| 1260 | case eRegNumPPC_GCC_fr0: return "fr0"; |
| 1261 | case eRegNumPPC_GCC_fr1: return "fr1"; |
| 1262 | case eRegNumPPC_GCC_fr2: return "fr2"; |
| 1263 | case eRegNumPPC_GCC_fr3: return "fr3"; |
| 1264 | case eRegNumPPC_GCC_fr4: return "fr4"; |
| 1265 | case eRegNumPPC_GCC_fr5: return "fr5"; |
| 1266 | case eRegNumPPC_GCC_fr6: return "fr6"; |
| 1267 | case eRegNumPPC_GCC_fr7: return "fr7"; |
| 1268 | case eRegNumPPC_GCC_fr8: return "fr8"; |
| 1269 | case eRegNumPPC_GCC_fr9: return "fr9"; |
| 1270 | case eRegNumPPC_GCC_fr10: return "fr10"; |
| 1271 | case eRegNumPPC_GCC_fr11: return "fr11"; |
| 1272 | case eRegNumPPC_GCC_fr12: return "fr12"; |
| 1273 | case eRegNumPPC_GCC_fr13: return "fr13"; |
| 1274 | case eRegNumPPC_GCC_fr14: return "fr14"; |
| 1275 | case eRegNumPPC_GCC_fr15: return "fr15"; |
| 1276 | case eRegNumPPC_GCC_fr16: return "fr16"; |
| 1277 | case eRegNumPPC_GCC_fr17: return "fr17"; |
| 1278 | case eRegNumPPC_GCC_fr18: return "fr18"; |
| 1279 | case eRegNumPPC_GCC_fr19: return "fr19"; |
| 1280 | case eRegNumPPC_GCC_fr20: return "fr20"; |
| 1281 | case eRegNumPPC_GCC_fr21: return "fr21"; |
| 1282 | case eRegNumPPC_GCC_fr22: return "fr22"; |
| 1283 | case eRegNumPPC_GCC_fr23: return "fr23"; |
| 1284 | case eRegNumPPC_GCC_fr24: return "fr24"; |
| 1285 | case eRegNumPPC_GCC_fr25: return "fr25"; |
| 1286 | case eRegNumPPC_GCC_fr26: return "fr26"; |
| 1287 | case eRegNumPPC_GCC_fr27: return "fr27"; |
| 1288 | case eRegNumPPC_GCC_fr28: return "fr28"; |
| 1289 | case eRegNumPPC_GCC_fr29: return "fr29"; |
| 1290 | case eRegNumPPC_GCC_fr30: return "fr30"; |
| 1291 | case eRegNumPPC_GCC_fr31: return "fr31"; |
| 1292 | case eRegNumPPC_GCC_mq: return "mq"; |
| 1293 | case eRegNumPPC_GCC_lr: return "lr"; |
| 1294 | case eRegNumPPC_GCC_ctr: return "ctr"; |
| 1295 | case eRegNumPPC_GCC_ap: return "ap"; |
| 1296 | case eRegNumPPC_GCC_cr0: return "cr0"; |
| 1297 | case eRegNumPPC_GCC_cr1: return "cr1"; |
| 1298 | case eRegNumPPC_GCC_cr2: return "cr2"; |
| 1299 | case eRegNumPPC_GCC_cr3: return "cr3"; |
| 1300 | case eRegNumPPC_GCC_cr4: return "cr4"; |
| 1301 | case eRegNumPPC_GCC_cr5: return "cr5"; |
| 1302 | case eRegNumPPC_GCC_cr6: return "cr6"; |
| 1303 | case eRegNumPPC_GCC_cr7: return "cr7"; |
| 1304 | case eRegNumPPC_GCC_xer: return "xer"; |
| 1305 | case eRegNumPPC_GCC_v0: return "v0"; |
| 1306 | case eRegNumPPC_GCC_v1: return "v1"; |
| 1307 | case eRegNumPPC_GCC_v2: return "v2"; |
| 1308 | case eRegNumPPC_GCC_v3: return "v3"; |
| 1309 | case eRegNumPPC_GCC_v4: return "v4"; |
| 1310 | case eRegNumPPC_GCC_v5: return "v5"; |
| 1311 | case eRegNumPPC_GCC_v6: return "v6"; |
| 1312 | case eRegNumPPC_GCC_v7: return "v7"; |
| 1313 | case eRegNumPPC_GCC_v8: return "v8"; |
| 1314 | case eRegNumPPC_GCC_v9: return "v9"; |
| 1315 | case eRegNumPPC_GCC_v10: return "v10"; |
| 1316 | case eRegNumPPC_GCC_v11: return "v11"; |
| 1317 | case eRegNumPPC_GCC_v12: return "v12"; |
| 1318 | case eRegNumPPC_GCC_v13: return "v13"; |
| 1319 | case eRegNumPPC_GCC_v14: return "v14"; |
| 1320 | case eRegNumPPC_GCC_v15: return "v15"; |
| 1321 | case eRegNumPPC_GCC_v16: return "v16"; |
| 1322 | case eRegNumPPC_GCC_v17: return "v17"; |
| 1323 | case eRegNumPPC_GCC_v18: return "v18"; |
| 1324 | case eRegNumPPC_GCC_v19: return "v19"; |
| 1325 | case eRegNumPPC_GCC_v20: return "v20"; |
| 1326 | case eRegNumPPC_GCC_v21: return "v21"; |
| 1327 | case eRegNumPPC_GCC_v22: return "v22"; |
| 1328 | case eRegNumPPC_GCC_v23: return "v23"; |
| 1329 | case eRegNumPPC_GCC_v24: return "v24"; |
| 1330 | case eRegNumPPC_GCC_v25: return "v25"; |
| 1331 | case eRegNumPPC_GCC_v26: return "v26"; |
| 1332 | case eRegNumPPC_GCC_v27: return "v27"; |
| 1333 | case eRegNumPPC_GCC_v28: return "v28"; |
| 1334 | case eRegNumPPC_GCC_v29: return "v29"; |
| 1335 | case eRegNumPPC_GCC_v30: return "v30"; |
| 1336 | case eRegNumPPC_GCC_v31: return "v31"; |
| 1337 | case eRegNumPPC_GCC_vrsave: return "vrsave"; |
| 1338 | case eRegNumPPC_GCC_vscr: return "vscr"; |
| 1339 | case eRegNumPPC_GCC_spe_acc: return "spe_acc"; |
| 1340 | case eRegNumPPC_GCC_spefscr: return "spefscr"; |
| 1341 | case eRegNumPPC_GCC_sfp: return "sfp"; |
| 1342 | default: |
| 1343 | break; |
| 1344 | } |
| 1345 | break; |
| 1346 | |
| 1347 | case eRegisterKindDWARF: |
| 1348 | switch (reg_num) |
| 1349 | { |
| 1350 | case eRegNumPPC_DWARF_r0: return "r0"; |
| 1351 | case eRegNumPPC_DWARF_r1: return "r1"; |
| 1352 | case eRegNumPPC_DWARF_r2: return "r2"; |
| 1353 | case eRegNumPPC_DWARF_r3: return "r3"; |
| 1354 | case eRegNumPPC_DWARF_r4: return "r4"; |
| 1355 | case eRegNumPPC_DWARF_r5: return "r5"; |
| 1356 | case eRegNumPPC_DWARF_r6: return "r6"; |
| 1357 | case eRegNumPPC_DWARF_r7: return "r7"; |
| 1358 | case eRegNumPPC_DWARF_r8: return "r8"; |
| 1359 | case eRegNumPPC_DWARF_r9: return "r9"; |
| 1360 | case eRegNumPPC_DWARF_r10: return "r10"; |
| 1361 | case eRegNumPPC_DWARF_r11: return "r11"; |
| 1362 | case eRegNumPPC_DWARF_r12: return "r12"; |
| 1363 | case eRegNumPPC_DWARF_r13: return "r13"; |
| 1364 | case eRegNumPPC_DWARF_r14: return "r14"; |
| 1365 | case eRegNumPPC_DWARF_r15: return "r15"; |
| 1366 | case eRegNumPPC_DWARF_r16: return "r16"; |
| 1367 | case eRegNumPPC_DWARF_r17: return "r17"; |
| 1368 | case eRegNumPPC_DWARF_r18: return "r18"; |
| 1369 | case eRegNumPPC_DWARF_r19: return "r19"; |
| 1370 | case eRegNumPPC_DWARF_r20: return "r20"; |
| 1371 | case eRegNumPPC_DWARF_r21: return "r21"; |
| 1372 | case eRegNumPPC_DWARF_r22: return "r22"; |
| 1373 | case eRegNumPPC_DWARF_r23: return "r23"; |
| 1374 | case eRegNumPPC_DWARF_r24: return "r24"; |
| 1375 | case eRegNumPPC_DWARF_r25: return "r25"; |
| 1376 | case eRegNumPPC_DWARF_r26: return "r26"; |
| 1377 | case eRegNumPPC_DWARF_r27: return "r27"; |
| 1378 | case eRegNumPPC_DWARF_r28: return "r28"; |
| 1379 | case eRegNumPPC_DWARF_r29: return "r29"; |
| 1380 | case eRegNumPPC_DWARF_r30: return "r30"; |
| 1381 | case eRegNumPPC_DWARF_r31: return "r31"; |
| 1382 | |
| 1383 | case eRegNumPPC_DWARF_fr0: return "fr0"; |
| 1384 | case eRegNumPPC_DWARF_fr1: return "fr1"; |
| 1385 | case eRegNumPPC_DWARF_fr2: return "fr2"; |
| 1386 | case eRegNumPPC_DWARF_fr3: return "fr3"; |
| 1387 | case eRegNumPPC_DWARF_fr4: return "fr4"; |
| 1388 | case eRegNumPPC_DWARF_fr5: return "fr5"; |
| 1389 | case eRegNumPPC_DWARF_fr6: return "fr6"; |
| 1390 | case eRegNumPPC_DWARF_fr7: return "fr7"; |
| 1391 | case eRegNumPPC_DWARF_fr8: return "fr8"; |
| 1392 | case eRegNumPPC_DWARF_fr9: return "fr9"; |
| 1393 | case eRegNumPPC_DWARF_fr10: return "fr10"; |
| 1394 | case eRegNumPPC_DWARF_fr11: return "fr11"; |
| 1395 | case eRegNumPPC_DWARF_fr12: return "fr12"; |
| 1396 | case eRegNumPPC_DWARF_fr13: return "fr13"; |
| 1397 | case eRegNumPPC_DWARF_fr14: return "fr14"; |
| 1398 | case eRegNumPPC_DWARF_fr15: return "fr15"; |
| 1399 | case eRegNumPPC_DWARF_fr16: return "fr16"; |
| 1400 | case eRegNumPPC_DWARF_fr17: return "fr17"; |
| 1401 | case eRegNumPPC_DWARF_fr18: return "fr18"; |
| 1402 | case eRegNumPPC_DWARF_fr19: return "fr19"; |
| 1403 | case eRegNumPPC_DWARF_fr20: return "fr20"; |
| 1404 | case eRegNumPPC_DWARF_fr21: return "fr21"; |
| 1405 | case eRegNumPPC_DWARF_fr22: return "fr22"; |
| 1406 | case eRegNumPPC_DWARF_fr23: return "fr23"; |
| 1407 | case eRegNumPPC_DWARF_fr24: return "fr24"; |
| 1408 | case eRegNumPPC_DWARF_fr25: return "fr25"; |
| 1409 | case eRegNumPPC_DWARF_fr26: return "fr26"; |
| 1410 | case eRegNumPPC_DWARF_fr27: return "fr27"; |
| 1411 | case eRegNumPPC_DWARF_fr28: return "fr28"; |
| 1412 | case eRegNumPPC_DWARF_fr29: return "fr29"; |
| 1413 | case eRegNumPPC_DWARF_fr30: return "fr30"; |
| 1414 | case eRegNumPPC_DWARF_fr31: return "fr31"; |
| 1415 | |
| 1416 | case eRegNumPPC_DWARF_cr: return "cr"; |
| 1417 | case eRegNumPPC_DWARF_fpscr: return "fpscr"; |
| 1418 | case eRegNumPPC_DWARF_msr: return "msr"; |
| 1419 | case eRegNumPPC_DWARF_vscr: return "vscr"; |
| 1420 | |
| 1421 | case eRegNumPPC_DWARF_sr0: return "sr0"; |
| 1422 | case eRegNumPPC_DWARF_sr1: return "sr1"; |
| 1423 | case eRegNumPPC_DWARF_sr2: return "sr2"; |
| 1424 | case eRegNumPPC_DWARF_sr3: return "sr3"; |
| 1425 | case eRegNumPPC_DWARF_sr4: return "sr4"; |
| 1426 | case eRegNumPPC_DWARF_sr5: return "sr5"; |
| 1427 | case eRegNumPPC_DWARF_sr6: return "sr6"; |
| 1428 | case eRegNumPPC_DWARF_sr7: return "sr7"; |
| 1429 | case eRegNumPPC_DWARF_sr8: return "sr8"; |
| 1430 | case eRegNumPPC_DWARF_sr9: return "sr9"; |
| 1431 | case eRegNumPPC_DWARF_sr10: return "sr10"; |
| 1432 | case eRegNumPPC_DWARF_sr11: return "sr11"; |
| 1433 | case eRegNumPPC_DWARF_sr12: return "sr12"; |
| 1434 | case eRegNumPPC_DWARF_sr13: return "sr13"; |
| 1435 | case eRegNumPPC_DWARF_sr14: return "sr14"; |
| 1436 | case eRegNumPPC_DWARF_sr15: return "sr15"; |
| 1437 | |
| 1438 | case eRegNumPPC_DWARF_acc: return "acc"; |
| 1439 | case eRegNumPPC_DWARF_mq: return "mq"; |
| 1440 | case eRegNumPPC_DWARF_xer: return "xer"; |
| 1441 | case eRegNumPPC_DWARF_rtcu: return "rtcu"; |
| 1442 | case eRegNumPPC_DWARF_rtcl: return "rtcl"; |
| 1443 | |
| 1444 | case eRegNumPPC_DWARF_lr: return "lr"; |
| 1445 | case eRegNumPPC_DWARF_ctr: return "ctr"; |
| 1446 | |
| 1447 | case eRegNumPPC_DWARF_dsisr: return "dsisr"; |
| 1448 | case eRegNumPPC_DWARF_dar: return "dar"; |
| 1449 | case eRegNumPPC_DWARF_dec: return "dec"; |
| 1450 | case eRegNumPPC_DWARF_sdr1: return "sdr1"; |
| 1451 | case eRegNumPPC_DWARF_srr0: return "srr0"; |
| 1452 | case eRegNumPPC_DWARF_srr1: return "srr1"; |
| 1453 | |
| 1454 | case eRegNumPPC_DWARF_vrsave: return "vrsave"; |
| 1455 | |
| 1456 | case eRegNumPPC_DWARF_sprg0: return "sprg0"; |
| 1457 | case eRegNumPPC_DWARF_sprg1: return "sprg1"; |
| 1458 | case eRegNumPPC_DWARF_sprg2: return "sprg2"; |
| 1459 | case eRegNumPPC_DWARF_sprg3: return "sprg3"; |
| 1460 | |
| 1461 | case eRegNumPPC_DWARF_asr: return "asr"; |
| 1462 | case eRegNumPPC_DWARF_ear: return "ear"; |
| 1463 | case eRegNumPPC_DWARF_tb: return "tb"; |
| 1464 | case eRegNumPPC_DWARF_tbu: return "tbu"; |
| 1465 | case eRegNumPPC_DWARF_pvr: return "pvr"; |
| 1466 | |
| 1467 | case eRegNumPPC_DWARF_spefscr: return "spefscr"; |
| 1468 | |
| 1469 | case eRegNumPPC_DWARF_ibat0u: return "ibat0u"; |
| 1470 | case eRegNumPPC_DWARF_ibat0l: return "ibat0l"; |
| 1471 | case eRegNumPPC_DWARF_ibat1u: return "ibat1u"; |
| 1472 | case eRegNumPPC_DWARF_ibat1l: return "ibat1l"; |
| 1473 | case eRegNumPPC_DWARF_ibat2u: return "ibat2u"; |
| 1474 | case eRegNumPPC_DWARF_ibat2l: return "ibat2l"; |
| 1475 | case eRegNumPPC_DWARF_ibat3u: return "ibat3u"; |
| 1476 | case eRegNumPPC_DWARF_ibat3l: return "ibat3l"; |
| 1477 | case eRegNumPPC_DWARF_dbat0u: return "dbat0u"; |
| 1478 | case eRegNumPPC_DWARF_dbat0l: return "dbat0l"; |
| 1479 | case eRegNumPPC_DWARF_dbat1u: return "dbat1u"; |
| 1480 | case eRegNumPPC_DWARF_dbat1l: return "dbat1l"; |
| 1481 | case eRegNumPPC_DWARF_dbat2u: return "dbat2u"; |
| 1482 | case eRegNumPPC_DWARF_dbat2l: return "dbat2l"; |
| 1483 | case eRegNumPPC_DWARF_dbat3u: return "dbat3u"; |
| 1484 | case eRegNumPPC_DWARF_dbat3l: return "dbat3l"; |
| 1485 | |
| 1486 | case eRegNumPPC_DWARF_hid0: return "hid0"; |
| 1487 | case eRegNumPPC_DWARF_hid1: return "hid1"; |
| 1488 | case eRegNumPPC_DWARF_hid2: return "hid2"; |
| 1489 | case eRegNumPPC_DWARF_hid3: return "hid3"; |
| 1490 | case eRegNumPPC_DWARF_hid4: return "hid4"; |
| 1491 | case eRegNumPPC_DWARF_hid5: return "hid5"; |
| 1492 | case eRegNumPPC_DWARF_hid6: return "hid6"; |
| 1493 | case eRegNumPPC_DWARF_hid7: return "hid7"; |
| 1494 | case eRegNumPPC_DWARF_hid8: return "hid8"; |
| 1495 | case eRegNumPPC_DWARF_hid9: return "hid9"; |
| 1496 | case eRegNumPPC_DWARF_hid10: return "hid10"; |
| 1497 | case eRegNumPPC_DWARF_hid11: return "hid11"; |
| 1498 | case eRegNumPPC_DWARF_hid12: return "hid12"; |
| 1499 | case eRegNumPPC_DWARF_hid13: return "hid13"; |
| 1500 | case eRegNumPPC_DWARF_hid14: return "hid14"; |
| 1501 | case eRegNumPPC_DWARF_hid15: return "hid15"; |
| 1502 | |
| 1503 | case eRegNumPPC_DWARF_vr0: return "vr0"; |
| 1504 | case eRegNumPPC_DWARF_vr1: return "vr1"; |
| 1505 | case eRegNumPPC_DWARF_vr2: return "vr2"; |
| 1506 | case eRegNumPPC_DWARF_vr3: return "vr3"; |
| 1507 | case eRegNumPPC_DWARF_vr4: return "vr4"; |
| 1508 | case eRegNumPPC_DWARF_vr5: return "vr5"; |
| 1509 | case eRegNumPPC_DWARF_vr6: return "vr6"; |
| 1510 | case eRegNumPPC_DWARF_vr7: return "vr7"; |
| 1511 | case eRegNumPPC_DWARF_vr8: return "vr8"; |
| 1512 | case eRegNumPPC_DWARF_vr9: return "vr9"; |
| 1513 | case eRegNumPPC_DWARF_vr10: return "vr10"; |
| 1514 | case eRegNumPPC_DWARF_vr11: return "vr11"; |
| 1515 | case eRegNumPPC_DWARF_vr12: return "vr12"; |
| 1516 | case eRegNumPPC_DWARF_vr13: return "vr13"; |
| 1517 | case eRegNumPPC_DWARF_vr14: return "vr14"; |
| 1518 | case eRegNumPPC_DWARF_vr15: return "vr15"; |
| 1519 | case eRegNumPPC_DWARF_vr16: return "vr16"; |
| 1520 | case eRegNumPPC_DWARF_vr17: return "vr17"; |
| 1521 | case eRegNumPPC_DWARF_vr18: return "vr18"; |
| 1522 | case eRegNumPPC_DWARF_vr19: return "vr19"; |
| 1523 | case eRegNumPPC_DWARF_vr20: return "vr20"; |
| 1524 | case eRegNumPPC_DWARF_vr21: return "vr21"; |
| 1525 | case eRegNumPPC_DWARF_vr22: return "vr22"; |
| 1526 | case eRegNumPPC_DWARF_vr23: return "vr23"; |
| 1527 | case eRegNumPPC_DWARF_vr24: return "vr24"; |
| 1528 | case eRegNumPPC_DWARF_vr25: return "vr25"; |
| 1529 | case eRegNumPPC_DWARF_vr26: return "vr26"; |
| 1530 | case eRegNumPPC_DWARF_vr27: return "vr27"; |
| 1531 | case eRegNumPPC_DWARF_vr28: return "vr28"; |
| 1532 | case eRegNumPPC_DWARF_vr29: return "vr29"; |
| 1533 | case eRegNumPPC_DWARF_vr30: return "vr30"; |
| 1534 | case eRegNumPPC_DWARF_vr31: return "vr31"; |
| 1535 | |
| 1536 | case eRegNumPPC_DWARF_ev0: return "ev0"; |
| 1537 | case eRegNumPPC_DWARF_ev1: return "ev1"; |
| 1538 | case eRegNumPPC_DWARF_ev2: return "ev2"; |
| 1539 | case eRegNumPPC_DWARF_ev3: return "ev3"; |
| 1540 | case eRegNumPPC_DWARF_ev4: return "ev4"; |
| 1541 | case eRegNumPPC_DWARF_ev5: return "ev5"; |
| 1542 | case eRegNumPPC_DWARF_ev6: return "ev6"; |
| 1543 | case eRegNumPPC_DWARF_ev7: return "ev7"; |
| 1544 | case eRegNumPPC_DWARF_ev8: return "ev8"; |
| 1545 | case eRegNumPPC_DWARF_ev9: return "ev9"; |
| 1546 | case eRegNumPPC_DWARF_ev10: return "ev10"; |
| 1547 | case eRegNumPPC_DWARF_ev11: return "ev11"; |
| 1548 | case eRegNumPPC_DWARF_ev12: return "ev12"; |
| 1549 | case eRegNumPPC_DWARF_ev13: return "ev13"; |
| 1550 | case eRegNumPPC_DWARF_ev14: return "ev14"; |
| 1551 | case eRegNumPPC_DWARF_ev15: return "ev15"; |
| 1552 | case eRegNumPPC_DWARF_ev16: return "ev16"; |
| 1553 | case eRegNumPPC_DWARF_ev17: return "ev17"; |
| 1554 | case eRegNumPPC_DWARF_ev18: return "ev18"; |
| 1555 | case eRegNumPPC_DWARF_ev19: return "ev19"; |
| 1556 | case eRegNumPPC_DWARF_ev20: return "ev20"; |
| 1557 | case eRegNumPPC_DWARF_ev21: return "ev21"; |
| 1558 | case eRegNumPPC_DWARF_ev22: return "ev22"; |
| 1559 | case eRegNumPPC_DWARF_ev23: return "ev23"; |
| 1560 | case eRegNumPPC_DWARF_ev24: return "ev24"; |
| 1561 | case eRegNumPPC_DWARF_ev25: return "ev25"; |
| 1562 | case eRegNumPPC_DWARF_ev26: return "ev26"; |
| 1563 | case eRegNumPPC_DWARF_ev27: return "ev27"; |
| 1564 | case eRegNumPPC_DWARF_ev28: return "ev28"; |
| 1565 | case eRegNumPPC_DWARF_ev29: return "ev29"; |
| 1566 | case eRegNumPPC_DWARF_ev30: return "ev30"; |
| 1567 | case eRegNumPPC_DWARF_ev31: return "ev31"; |
| 1568 | default: |
| 1569 | break; |
| 1570 | } |
| 1571 | break; |
| 1572 | default: |
| 1573 | break; |
| 1574 | } |
| 1575 | |
| 1576 | } |
| 1577 | return NULL; |
| 1578 | } |
| 1579 | |
| 1580 | //---------------------------------------------------------------------- |
| 1581 | // Returns true if this object contains a valid architecture, false |
| 1582 | // otherwise. |
| 1583 | //---------------------------------------------------------------------- |
| 1584 | bool |
| 1585 | ArchSpec::IsValid() const |
| 1586 | { |
| 1587 | return !(m_cpu == LLDB_INVALID_CPUTYPE); |
| 1588 | } |
| 1589 | |
| 1590 | //---------------------------------------------------------------------- |
| 1591 | // Returns true if this architecture is 64 bit, otherwise 32 bit is |
| 1592 | // assumed and false is returned. |
| 1593 | //---------------------------------------------------------------------- |
| 1594 | uint32_t |
| 1595 | ArchSpec::GetAddressByteSize() const |
| 1596 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1597 | if (m_addr_byte_size > 0) |
| 1598 | return m_addr_byte_size; |
| 1599 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1600 | switch (m_type) |
| 1601 | { |
Greg Clayton | c982c76 | 2010-07-09 20:39:50 +0000 | [diff] [blame] | 1602 | case kNumArchTypes: |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1603 | case eArchTypeInvalid: |
| 1604 | break; |
| 1605 | |
| 1606 | case eArchTypeMachO: |
Eli Friedman | 50fac2f | 2010-06-11 04:26:08 +0000 | [diff] [blame] | 1607 | if (GetCPUType() & llvm::MachO::CPUArchABI64) |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1608 | return 8; |
| 1609 | else |
| 1610 | return 4; |
| 1611 | break; |
| 1612 | |
| 1613 | case eArchTypeELF: |
| 1614 | switch (m_cpu) |
| 1615 | { |
| 1616 | case llvm::ELF::EM_M32: |
| 1617 | case llvm::ELF::EM_SPARC: |
| 1618 | case llvm::ELF::EM_386: |
| 1619 | case llvm::ELF::EM_68K: |
| 1620 | case llvm::ELF::EM_88K: |
| 1621 | case llvm::ELF::EM_486: |
| 1622 | case llvm::ELF::EM_860: |
| 1623 | case llvm::ELF::EM_MIPS: |
| 1624 | case llvm::ELF::EM_PPC: |
| 1625 | case llvm::ELF::EM_ARM: |
| 1626 | case llvm::ELF::EM_ALPHA: |
| 1627 | case llvm::ELF::EM_SPARCV9: |
| 1628 | return 4; |
| 1629 | case llvm::ELF::EM_X86_64: |
| 1630 | return 8; |
| 1631 | } |
| 1632 | break; |
| 1633 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1634 | return 0; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1635 | } |
| 1636 | |
| 1637 | //---------------------------------------------------------------------- |
| 1638 | // Returns the number of bytes that this object takes when an |
| 1639 | // instance exists in memory. |
| 1640 | //---------------------------------------------------------------------- |
| 1641 | size_t |
| 1642 | ArchSpec::MemorySize() const |
| 1643 | { |
| 1644 | return sizeof(ArchSpec); |
| 1645 | } |
| 1646 | |
| 1647 | bool |
| 1648 | ArchSpec::SetArchFromTargetTriple (const char *target_triple) |
| 1649 | { |
| 1650 | if (target_triple) |
| 1651 | { |
| 1652 | const char *hyphen = strchr(target_triple, '-'); |
| 1653 | if (hyphen) |
| 1654 | { |
| 1655 | std::string arch_only (target_triple, hyphen); |
| 1656 | return SetArch (arch_only.c_str()); |
| 1657 | } |
| 1658 | } |
| 1659 | return SetArch (target_triple); |
| 1660 | } |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1661 | void |
| 1662 | ArchSpec::SetMachOArch (uint32_t cpu, uint32_t sub) |
| 1663 | { |
| 1664 | m_type = lldb::eArchTypeMachO; |
| 1665 | m_cpu = cpu; |
| 1666 | m_sub = sub; |
| 1667 | MachOArchUpdated (); |
| 1668 | } |
| 1669 | |
| 1670 | void |
| 1671 | ArchSpec::MachOArchUpdated (size_t idx) |
| 1672 | { |
| 1673 | // m_type, m_cpu, and m_sub have been updated, fixup everything else |
| 1674 | if (idx >= k_num_mach_arch_defs) |
| 1675 | { |
| 1676 | for (size_t i=0; i<k_num_mach_arch_defs; i++) |
| 1677 | { |
| 1678 | if (m_cpu == g_mach_arch_defs[i].cpu) |
| 1679 | { |
| 1680 | if (m_sub == CPU_ANY || m_sub == LLDB_INVALID_CPUTYPE) |
| 1681 | { |
| 1682 | if (m_sub == g_mach_arch_defs[i].sub) |
| 1683 | { |
| 1684 | idx = i; |
| 1685 | break; |
| 1686 | } |
| 1687 | } |
| 1688 | else if ((m_sub & 0x00ffffff) == g_mach_arch_defs[i].sub) |
| 1689 | { |
| 1690 | idx = i; |
| 1691 | break; |
| 1692 | } |
| 1693 | } |
| 1694 | } |
| 1695 | } |
| 1696 | |
| 1697 | if (idx < k_num_mach_arch_defs) |
| 1698 | { |
| 1699 | m_byte_order = g_mach_arch_defs[idx].byte_order; |
| 1700 | m_addr_byte_size = g_mach_arch_defs[idx].addr_byte_size; |
| 1701 | char triple_cstr[1024]; |
| 1702 | int triple_cstr_len = ::snprintf (triple_cstr, |
| 1703 | sizeof(triple_cstr), |
| 1704 | "%s-apple-darwin", |
| 1705 | g_mach_arch_defs[idx].name); |
| 1706 | std::string triple_sstr (llvm::Triple::normalize (llvm::StringRef (triple_cstr, triple_cstr_len))); |
| 1707 | llvm::StringRef triple_sref (triple_sstr.c_str(), triple_sstr.size()); |
| 1708 | llvm::Triple triple (triple_sref); |
| 1709 | m_triple = triple; |
| 1710 | } |
| 1711 | else |
| 1712 | { |
| 1713 | assert (!"Unknown mach-o architecture"); |
| 1714 | m_byte_order = lldb::endian::InlHostByteOrder(); |
| 1715 | // We weren't able to find our CPU type in out known list of mach architectures... |
| 1716 | if (GetCPUType() & llvm::MachO::CPUArchABI64) |
| 1717 | m_addr_byte_size = 8; |
| 1718 | else |
| 1719 | m_addr_byte_size = 4; |
| 1720 | m_triple = llvm::Triple(); |
| 1721 | } |
| 1722 | } |
| 1723 | |
| 1724 | void |
| 1725 | ArchSpec::ELFArchUpdated (size_t idx) |
| 1726 | { |
| 1727 | if (idx >= k_num_elf_arch_defs) |
| 1728 | { |
| 1729 | for (size_t i=0; i<k_num_elf_arch_defs; i++) |
| 1730 | { |
| 1731 | if (g_elf_arch_defs[i].cpu == m_cpu) |
| 1732 | { |
| 1733 | idx = i; |
| 1734 | break; |
| 1735 | } |
| 1736 | } |
| 1737 | } |
| 1738 | if (idx < k_num_elf_arch_defs) |
| 1739 | { |
| 1740 | m_byte_order = g_elf_arch_defs[idx].byte_order; |
| 1741 | m_addr_byte_size = g_elf_arch_defs[idx].addr_byte_size; |
| 1742 | char triple_cstr[1024]; |
| 1743 | int triple_cstr_len = ::snprintf (triple_cstr, |
| 1744 | sizeof(triple_cstr), |
| 1745 | "%s-unknown-unknown", |
| 1746 | g_elf_arch_defs[idx].name); |
| 1747 | std::string triple_sstr (llvm::Triple::normalize (llvm::StringRef (triple_cstr, triple_cstr_len))); |
| 1748 | llvm::StringRef triple_sref (triple_sstr.c_str(), triple_sstr.size()); |
| 1749 | llvm::Triple triple (triple_sref); |
| 1750 | m_triple = triple; |
| 1751 | } |
| 1752 | else |
| 1753 | { |
| 1754 | assert (!"Unknown ELF architecture"); |
| 1755 | m_byte_order = lldb::endian::InlHostByteOrder(); |
| 1756 | m_addr_byte_size = sizeof(void *); |
| 1757 | m_triple = llvm::Triple(); |
| 1758 | } |
| 1759 | } |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1760 | |
| 1761 | //---------------------------------------------------------------------- |
| 1762 | // Change the CPU type and subtype given an architecture name. |
| 1763 | //---------------------------------------------------------------------- |
| 1764 | bool |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1765 | ArchSpec::SetArch (const char *arch_name) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1766 | { |
| 1767 | if (arch_name && arch_name[0] != '\0') |
| 1768 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1769 | // All system default architecture string values start with LLDB_ARCH_DEFAULT |
| 1770 | if (::strncmp (arch_name, LLDB_ARCH_DEFAULT, strlen(LLDB_ARCH_DEFAULT)) == 0) |
| 1771 | { |
| 1772 | // Special case for the current host default architectures... |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1773 | |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1774 | if (::strcmp (arch_name, LLDB_ARCH_DEFAULT_32BIT) == 0) |
| 1775 | *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); |
| 1776 | else if (::strcmp (arch_name, LLDB_ARCH_DEFAULT_64BIT) == 0) |
| 1777 | *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture64); |
| 1778 | else |
| 1779 | *this = Host::GetArchitecture (Host::eSystemDefaultArchitecture); |
| 1780 | |
| 1781 | return IsValid(); |
| 1782 | } |
| 1783 | |
| 1784 | size_t i; |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1785 | switch (m_type) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1786 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1787 | case eArchTypeInvalid: |
| 1788 | case eArchTypeMachO: |
| 1789 | for (i=0; i<k_num_mach_arch_defs; i++) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1790 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1791 | if (strcasecmp(arch_name, g_mach_arch_defs[i].name) == 0) |
| 1792 | { |
| 1793 | m_type = eArchTypeMachO; |
| 1794 | m_cpu = g_mach_arch_defs[i].cpu; |
| 1795 | m_sub = g_mach_arch_defs[i].sub; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1796 | MachOArchUpdated (i); |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1797 | return true; |
| 1798 | } |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1799 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1800 | break; |
| 1801 | |
| 1802 | case eArchTypeELF: |
| 1803 | for (i=0; i<k_num_elf_arch_defs; i++) |
| 1804 | { |
| 1805 | if (strcasecmp(arch_name, g_elf_arch_defs[i].name) == 0) |
| 1806 | { |
| 1807 | m_cpu = g_elf_arch_defs[i].cpu; |
| 1808 | m_sub = g_elf_arch_defs[i].sub; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1809 | ELFArchUpdated (i); |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1810 | return true; |
| 1811 | } |
| 1812 | } |
| 1813 | break; |
Greg Clayton | c982c76 | 2010-07-09 20:39:50 +0000 | [diff] [blame] | 1814 | |
| 1815 | case kNumArchTypes: |
| 1816 | break; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1817 | } |
| 1818 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1819 | const char *str = arch_name; |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1820 | // Check for a numeric cpu followed by an optional separator char and numeric subtype. |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1821 | // This allows for support of new cpu type/subtypes without having to have |
| 1822 | // a recompiled debug core. |
| 1823 | // Examples: |
| 1824 | // "12.6" is armv6 |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1825 | // "0x0000000c-0x00000006" is also armv6 |
| 1826 | |
| 1827 | m_type = eArchTypeInvalid; |
| 1828 | for (i=1; i<kNumArchTypes; ++i) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1829 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1830 | const char *arch_type_cstr = g_arch_type_strings[i]; |
| 1831 | if (strstr(str, arch_type_cstr)) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1832 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1833 | m_type = (ArchitectureType)i; |
| 1834 | str += strlen(arch_type_cstr) + 1; // Also skip separator char |
| 1835 | } |
| 1836 | } |
| 1837 | |
| 1838 | if (m_type != eArchTypeInvalid) |
| 1839 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1840 | m_type = eArchTypeMachO; |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1841 | char *end = NULL; |
| 1842 | m_cpu = ::strtoul (str, &end, 0); |
| 1843 | if (str != end) |
| 1844 | { |
| 1845 | if (*end == ARCH_SPEC_SEPARATOR_CHAR) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1846 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1847 | // We have a cputype.cpusubtype format |
| 1848 | str = end + 1; |
| 1849 | if (*str != '\0') |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1850 | { |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1851 | m_sub = strtoul(str, &end, 0); |
| 1852 | if (*end == '\0') |
| 1853 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1854 | MachOArchUpdated (); |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1855 | // We consumed the entire string and got a cpu type and subtype |
| 1856 | return true; |
| 1857 | } |
| 1858 | } |
| 1859 | } |
| 1860 | |
| 1861 | // If we reach this point we have a valid cpu type, but no cpu subtype. |
| 1862 | // Search for the first matching cpu type and use the corresponding cpu |
| 1863 | // subtype. This setting should typically be the _ALL variant and should |
| 1864 | // appear first in the list for each cpu type in the g_mach_arch_defs |
| 1865 | // structure. |
| 1866 | for (i=0; i<k_num_mach_arch_defs; ++i) |
| 1867 | { |
| 1868 | if (m_cpu == g_mach_arch_defs[i].cpu) |
| 1869 | { |
| 1870 | m_sub = g_mach_arch_defs[i].sub; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1871 | m_byte_order = g_mach_arch_defs[i].byte_order; |
| 1872 | m_addr_byte_size = g_mach_arch_defs[i].addr_byte_size; |
| 1873 | MachOArchUpdated (i); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1874 | return true; |
| 1875 | } |
| 1876 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1877 | |
| 1878 | // Default the cpu subtype to zero when we don't have a matching |
| 1879 | // cpu type in our architecture defs structure (g_mach_arch_defs). |
| 1880 | m_sub = 0; |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1881 | MachOArchUpdated (); |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1882 | return true; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1883 | } |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1884 | } |
| 1885 | } |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1886 | Clear(); |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1887 | return false; |
| 1888 | } |
| 1889 | |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1890 | ByteOrder |
| 1891 | ArchSpec::GetDefaultEndian () const |
| 1892 | { |
Greg Clayton | 8368b4b | 2011-01-18 21:47:52 +0000 | [diff] [blame] | 1893 | switch (GetGenericCPUType ()) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1894 | { |
Greg Clayton | 514487e | 2011-02-15 21:59:32 +0000 | [diff] [blame^] | 1895 | case eCPU_ppc: |
| 1896 | case eCPU_ppc64: |
| 1897 | return eByteOrderBig; |
| 1898 | |
| 1899 | case eCPU_arm: |
| 1900 | case eCPU_i386: |
| 1901 | case eCPU_x86_64: |
| 1902 | return eByteOrderLittle; |
| 1903 | |
| 1904 | default: |
| 1905 | break; |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1906 | } |
| 1907 | return eByteOrderInvalid; |
| 1908 | } |
| 1909 | |
| 1910 | //---------------------------------------------------------------------- |
| 1911 | // Equal operator |
| 1912 | //---------------------------------------------------------------------- |
| 1913 | bool |
| 1914 | lldb_private::operator== (const ArchSpec& lhs, const ArchSpec& rhs) |
| 1915 | { |
| 1916 | uint32_t lhs_cpu = lhs.GetCPUType(); |
| 1917 | uint32_t rhs_cpu = rhs.GetCPUType(); |
| 1918 | |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1919 | if (lhs_cpu == CPU_ANY || rhs_cpu == CPU_ANY) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1920 | return true; |
| 1921 | |
| 1922 | else if (lhs_cpu == rhs_cpu) |
| 1923 | { |
| 1924 | uint32_t lhs_subtype = lhs.GetCPUSubtype(); |
| 1925 | uint32_t rhs_subtype = rhs.GetCPUSubtype(); |
Greg Clayton | 41f9232 | 2010-06-11 03:25:34 +0000 | [diff] [blame] | 1926 | if (lhs_subtype == CPU_ANY || rhs_subtype == CPU_ANY) |
Chris Lattner | 30fdc8d | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1927 | return true; |
| 1928 | return lhs_subtype == rhs_subtype; |
| 1929 | } |
| 1930 | return false; |
| 1931 | } |
| 1932 | |
| 1933 | |
| 1934 | //---------------------------------------------------------------------- |
| 1935 | // Not Equal operator |
| 1936 | //---------------------------------------------------------------------- |
| 1937 | bool |
| 1938 | lldb_private::operator!= (const ArchSpec& lhs, const ArchSpec& rhs) |
| 1939 | { |
| 1940 | return !(lhs == rhs); |
| 1941 | } |
| 1942 | |
| 1943 | //---------------------------------------------------------------------- |
| 1944 | // Less than operator |
| 1945 | //---------------------------------------------------------------------- |
| 1946 | bool |
| 1947 | lldb_private::operator<(const ArchSpec& lhs, const ArchSpec& rhs) |
| 1948 | { |
| 1949 | uint32_t lhs_cpu = lhs.GetCPUType(); |
| 1950 | uint32_t rhs_cpu = rhs.GetCPUType(); |
| 1951 | |
| 1952 | if (lhs_cpu == rhs_cpu) |
| 1953 | return lhs.GetCPUSubtype() < rhs.GetCPUSubtype(); |
| 1954 | |
| 1955 | return lhs_cpu < rhs_cpu; |
| 1956 | } |
| 1957 | |