blob: a17c0aaf4fba0dcd97645c056fcef1d64ac63e4d [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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 Friedman50fac2f2010-06-11 04:26:08 +000012#include <stdio.h>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013
14#include <string>
15
Greg Clayton41f92322010-06-11 03:25:34 +000016#include "llvm/Support/ELF.h"
17#include "llvm/Support/MachO.h"
Greg Clayton514487e2011-02-15 21:59:32 +000018#include "lldb/Host/Endian.h"
19#include "lldb/Host/Host.h"
Greg Clayton41f92322010-06-11 03:25:34 +000020
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021using namespace lldb;
22using namespace lldb_private;
23
24#define ARCH_SPEC_SEPARATOR_CHAR '-'
25
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
27//----------------------------------------------------------------------
28// A structure that describes all of the information we want to know
29// about each architecture.
30//----------------------------------------------------------------------
31struct ArchDefinition
32{
Greg Clayton514487e2011-02-15 21:59:32 +000033 ByteOrder byte_order;
34 uint32_t addr_byte_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035 uint32_t cpu;
36 uint32_t sub;
37 const char *name;
38};
39
Greg Clayton41f92322010-06-11 03:25:34 +000040
41static const char *g_arch_type_strings[] =
42{
43 "invalid",
44 "mach-o",
45 "elf"
46};
47
48#define CPU_ANY (UINT32_MAX)
49
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050//----------------------------------------------------------------------
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 Clayton41f92322010-06-11 03:25:34 +000057static ArchDefinition g_mach_arch_defs[] =
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058{
Greg Clayton514487e2011-02-15 21:59:32 +000059 { 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 Lattner30fdc8d2010-06-08 16:52:24 +000089};
90
91//----------------------------------------------------------------------
92// Figure out how many architecture definitions we have
93//----------------------------------------------------------------------
Greg Clayton41f92322010-06-11 03:25:34 +000094const size_t k_num_mach_arch_defs = sizeof(g_mach_arch_defs)/sizeof(ArchDefinition);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095
96
Greg Clayton41f92322010-06-11 03:25:34 +000097
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//----------------------------------------------------------------------
105static ArchDefinition g_elf_arch_defs[] =
106{
Greg Clayton514487e2011-02-15 21:59:32 +0000107 { 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 Clayton41f92322010-06-11 03:25:34 +0000121};
122
123//----------------------------------------------------------------------
124// Figure out how many architecture definitions we have
125//----------------------------------------------------------------------
126const size_t k_num_elf_arch_defs = sizeof(g_elf_arch_defs)/sizeof(ArchDefinition);
127
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128//----------------------------------------------------------------------
129// Default constructor
130//----------------------------------------------------------------------
131ArchSpec::ArchSpec() :
Greg Clayton41f92322010-06-11 03:25:34 +0000132 m_type (eArchTypeMachO), // Use the most complete arch definition which will always be translatable to any other ArchitectureType values
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000133 m_cpu (LLDB_INVALID_CPUTYPE),
Greg Clayton514487e2011-02-15 21:59:32 +0000134 m_sub (0),
135 m_triple (),
136 m_byte_order (lldb::endian::InlHostByteOrder()),
137 m_addr_byte_size (0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000138{
139}
140
141//----------------------------------------------------------------------
142// Constructor that initializes the object with supplied cpu and
143// subtypes.
144//----------------------------------------------------------------------
Greg Clayton41f92322010-06-11 03:25:34 +0000145ArchSpec::ArchSpec (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub) :
146 m_type (arch_type),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000147 m_cpu (cpu),
Greg Clayton514487e2011-02-15 21:59:32 +0000148 m_sub (sub),
149 m_triple (),
150 m_byte_order (lldb::endian::InlHostByteOrder()),
151 m_addr_byte_size (0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000152{
Greg Clayton514487e2011-02-15 21:59:32 +0000153 if (m_type == eArchTypeMachO)
154 MachOArchUpdated ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155}
156
157//----------------------------------------------------------------------
158// Constructor that initializes the object with supplied
159// architecture name. There are also predefined values in
160// Defines.h:
Greg Clayton514487e2011-02-15 21:59:32 +0000161// LLDB_ARCH_DEFAULT
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000162// The arch the current system defaults to when a program is
163// launched without any extra attributes or settings.
164//
Greg Clayton514487e2011-02-15 21:59:32 +0000165// LLDB_ARCH_DEFAULT_32BIT
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166// The 32 bit arch the current system defaults to (if any)
167//
Greg Clayton514487e2011-02-15 21:59:32 +0000168// LLDB_ARCH_DEFAULT_32BIT
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000169// The 64 bit arch the current system defaults to (if any)
170//----------------------------------------------------------------------
Greg Clayton41f92322010-06-11 03:25:34 +0000171ArchSpec::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 Lattner30fdc8d2010-06-08 16:52:24 +0000173 m_cpu (LLDB_INVALID_CPUTYPE),
Greg Clayton514487e2011-02-15 21:59:32 +0000174 m_sub (0),
175 m_triple (),
176 m_byte_order (lldb::endian::InlHostByteOrder()),
177 m_addr_byte_size (0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178{
Greg Clayton514487e2011-02-15 21:59:32 +0000179 SetArch (arch_name);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000180}
181
182//----------------------------------------------------------------------
183// Destructor
184//----------------------------------------------------------------------
185ArchSpec::~ArchSpec()
186{
187}
188
189//----------------------------------------------------------------------
190// Assignment operator
191//----------------------------------------------------------------------
192const ArchSpec&
193ArchSpec::operator= (const ArchSpec& rhs)
194{
195 if (this != &rhs)
196 {
Greg Clayton41f92322010-06-11 03:25:34 +0000197 m_type = rhs.m_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000198 m_cpu = rhs.m_cpu;
199 m_sub = rhs.m_sub;
Greg Clayton514487e2011-02-15 21:59:32 +0000200 m_triple = rhs.m_triple;
201 m_byte_order = rhs.m_byte_order;
202 m_addr_byte_size = rhs.m_addr_byte_size;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000203 }
204 return *this;
205}
206
207//----------------------------------------------------------------------
208// Get a C string representation of the current architecture
209//----------------------------------------------------------------------
210const char *
211ArchSpec::AsCString() const
212{
Greg Clayton41f92322010-06-11 03:25:34 +0000213 return ArchSpec::AsCString(m_type, m_cpu, m_sub);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000214}
215
216//----------------------------------------------------------------------
217// Class function to get a C string representation given a CPU type
218// and subtype.
219//----------------------------------------------------------------------
220const char *
Greg Clayton41f92322010-06-11 03:25:34 +0000221ArchSpec::AsCString (lldb::ArchitectureType arch_type, uint32_t cpu, uint32_t sub)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000222{
Greg Clayton41f92322010-06-11 03:25:34 +0000223 if (arch_type >= kNumArchTypes)
224 return NULL;
225
226 switch (arch_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000227 {
Greg Claytonc982c762010-07-09 20:39:50 +0000228 case kNumArchTypes:
Greg Clayton41f92322010-06-11 03:25:34 +0000229 case eArchTypeInvalid:
230 break;
231
232 case eArchTypeMachO:
233 for (uint32_t i=0; i<k_num_mach_arch_defs; i++)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000234 {
Greg Clayton41f92322010-06-11 03:25:34 +0000235 if (cpu == g_mach_arch_defs[i].cpu)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236 {
Greg Clayton41f92322010-06-11 03:25:34 +0000237 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 Lattner30fdc8d2010-06-08 16:52:24 +0000244 }
245 }
Greg Clayton41f92322010-06-11 03:25:34 +0000246 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 Lattner30fdc8d2010-06-08 16:52:24 +0000258 }
Greg Clayton41f92322010-06-11 03:25:34 +0000259
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 Lattner30fdc8d2010-06-08 16:52:24 +0000271 return s_cpu_hex_str;
272}
273
274//----------------------------------------------------------------------
275// Clears the object contents back to a default invalid state.
276//----------------------------------------------------------------------
277void
278ArchSpec::Clear()
279{
Greg Clayton41f92322010-06-11 03:25:34 +0000280 m_type = eArchTypeInvalid;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000281 m_cpu = LLDB_INVALID_CPUTYPE;
282 m_sub = 0;
Greg Clayton514487e2011-02-15 21:59:32 +0000283 m_triple = llvm::Triple();
284 m_byte_order = lldb::endian::InlHostByteOrder();
285 m_addr_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000286}
287
288
Greg Clayton41f92322010-06-11 03:25:34 +0000289
290
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000291//----------------------------------------------------------------------
292// CPU subtype get accessor.
293//----------------------------------------------------------------------
294uint32_t
295ArchSpec::GetCPUSubtype() const
296{
Greg Clayton41f92322010-06-11 03:25:34 +0000297 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 Lattner30fdc8d2010-06-08 16:52:24 +0000304}
305
306
307//----------------------------------------------------------------------
308// CPU type get accessor.
309//----------------------------------------------------------------------
310uint32_t
311ArchSpec::GetCPUType() const
312{
313 return m_cpu;
314}
315
Greg Clayton41f92322010-06-11 03:25:34 +0000316//----------------------------------------------------------------------
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//----------------------------------------------------------------------
322ArchSpec::CPU
323ArchSpec::GetGenericCPUType () const
324{
325 switch (m_type)
326 {
Greg Claytonc982c762010-07-09 20:39:50 +0000327 case kNumArchTypes:
Greg Clayton41f92322010-06-11 03:25:34 +0000328 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 Lattner30fdc8d2010-06-08 16:52:24 +0000361
362//----------------------------------------------------------------------
363// Feature flags get accessor.
364//----------------------------------------------------------------------
365uint32_t
366ArchSpec::GetFeatureFlags() const
367{
Greg Clayton41f92322010-06-11 03:25:34 +0000368 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 Lattner30fdc8d2010-06-08 16:52:24 +0000375}
376
377
378static 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
392static 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
406static 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
429enum
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
646enum
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
869enum
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 Claytonc982c762010-07-09 20:39:50 +0000984 eRegNumPPC_GCC_sfp = 113
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000985};
986
987static 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//----------------------------------------------------------------------
1008const char *
1009ArchSpec::GetRegisterName(uint32_t reg_num, uint32_t reg_kind) const
1010{
Greg Clayton41f92322010-06-11 03:25:34 +00001011 return ArchSpec::GetRegisterName(m_type, m_cpu, m_sub, reg_num, reg_kind);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001012}
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//----------------------------------------------------------------------
1019const char *
Greg Clayton41f92322010-06-11 03:25:34 +00001020ArchSpec::GetRegisterName (ArchitectureType arch_type, uint32_t cpu, uint32_t subtype, uint32_t reg_num, uint32_t reg_kind)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001021{
Greg Clayton41f92322010-06-11 03:25:34 +00001022 if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeI386) ||
1023 (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_386))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001024 {
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 Clayton41f92322010-06-11 03:25:34 +00001039 else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeX86_64) ||
1040 (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_X86_64))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001041 {
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 Clayton41f92322010-06-11 03:25:34 +00001053 else if ((arch_type == eArchTypeMachO && cpu == llvm::MachO::CPUTypeARM) ||
1054 (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_ARM))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001055 {
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 Clayton41f92322010-06-11 03:25:34 +00001220 else if ((arch_type == eArchTypeMachO && (cpu == llvm::MachO::CPUTypePowerPC || cpu == llvm::MachO::CPUTypePowerPC64)) ||
1221 (arch_type == eArchTypeELF && cpu == llvm::ELF::EM_PPC))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001222 {
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//----------------------------------------------------------------------
1584bool
1585ArchSpec::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//----------------------------------------------------------------------
1594uint32_t
1595ArchSpec::GetAddressByteSize() const
1596{
Greg Clayton514487e2011-02-15 21:59:32 +00001597 if (m_addr_byte_size > 0)
1598 return m_addr_byte_size;
1599
Greg Clayton41f92322010-06-11 03:25:34 +00001600 switch (m_type)
1601 {
Greg Claytonc982c762010-07-09 20:39:50 +00001602 case kNumArchTypes:
Greg Clayton41f92322010-06-11 03:25:34 +00001603 case eArchTypeInvalid:
1604 break;
1605
1606 case eArchTypeMachO:
Eli Friedman50fac2f2010-06-11 04:26:08 +00001607 if (GetCPUType() & llvm::MachO::CPUArchABI64)
Greg Clayton41f92322010-06-11 03:25:34 +00001608 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 Clayton41f92322010-06-11 03:25:34 +00001634 return 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001635}
1636
1637//----------------------------------------------------------------------
1638// Returns the number of bytes that this object takes when an
1639// instance exists in memory.
1640//----------------------------------------------------------------------
1641size_t
1642ArchSpec::MemorySize() const
1643{
1644 return sizeof(ArchSpec);
1645}
1646
1647bool
1648ArchSpec::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 Clayton514487e2011-02-15 21:59:32 +00001661void
1662ArchSpec::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
1670void
1671ArchSpec::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
1724void
1725ArchSpec::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 Lattner30fdc8d2010-06-08 16:52:24 +00001760
1761//----------------------------------------------------------------------
1762// Change the CPU type and subtype given an architecture name.
1763//----------------------------------------------------------------------
1764bool
Greg Clayton41f92322010-06-11 03:25:34 +00001765ArchSpec::SetArch (const char *arch_name)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001766{
1767 if (arch_name && arch_name[0] != '\0')
1768 {
Greg Clayton514487e2011-02-15 21:59:32 +00001769 // 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 Clayton41f92322010-06-11 03:25:34 +00001773
Greg Clayton514487e2011-02-15 21:59:32 +00001774 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 Clayton41f92322010-06-11 03:25:34 +00001785 switch (m_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001786 {
Greg Clayton41f92322010-06-11 03:25:34 +00001787 case eArchTypeInvalid:
1788 case eArchTypeMachO:
1789 for (i=0; i<k_num_mach_arch_defs; i++)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001790 {
Greg Clayton41f92322010-06-11 03:25:34 +00001791 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 Clayton514487e2011-02-15 21:59:32 +00001796 MachOArchUpdated (i);
Greg Clayton41f92322010-06-11 03:25:34 +00001797 return true;
1798 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001799 }
Greg Clayton41f92322010-06-11 03:25:34 +00001800 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 Clayton514487e2011-02-15 21:59:32 +00001809 ELFArchUpdated (i);
Greg Clayton41f92322010-06-11 03:25:34 +00001810 return true;
1811 }
1812 }
1813 break;
Greg Claytonc982c762010-07-09 20:39:50 +00001814
1815 case kNumArchTypes:
1816 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001817 }
1818
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819 const char *str = arch_name;
Greg Clayton41f92322010-06-11 03:25:34 +00001820 // Check for a numeric cpu followed by an optional separator char and numeric subtype.
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001821 // 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 Clayton41f92322010-06-11 03:25:34 +00001825 // "0x0000000c-0x00000006" is also armv6
1826
1827 m_type = eArchTypeInvalid;
1828 for (i=1; i<kNumArchTypes; ++i)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001829 {
Greg Clayton41f92322010-06-11 03:25:34 +00001830 const char *arch_type_cstr = g_arch_type_strings[i];
1831 if (strstr(str, arch_type_cstr))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001832 {
Greg Clayton41f92322010-06-11 03:25:34 +00001833 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 Clayton514487e2011-02-15 21:59:32 +00001840 m_type = eArchTypeMachO;
Greg Clayton41f92322010-06-11 03:25:34 +00001841 char *end = NULL;
1842 m_cpu = ::strtoul (str, &end, 0);
1843 if (str != end)
1844 {
1845 if (*end == ARCH_SPEC_SEPARATOR_CHAR)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001846 {
Greg Clayton41f92322010-06-11 03:25:34 +00001847 // We have a cputype.cpusubtype format
1848 str = end + 1;
1849 if (*str != '\0')
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001850 {
Greg Clayton41f92322010-06-11 03:25:34 +00001851 m_sub = strtoul(str, &end, 0);
1852 if (*end == '\0')
1853 {
Greg Clayton514487e2011-02-15 21:59:32 +00001854 MachOArchUpdated ();
Greg Clayton41f92322010-06-11 03:25:34 +00001855 // 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 Clayton514487e2011-02-15 21:59:32 +00001871 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 Lattner30fdc8d2010-06-08 16:52:24 +00001874 return true;
1875 }
1876 }
Greg Clayton41f92322010-06-11 03:25:34 +00001877
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 Clayton514487e2011-02-15 21:59:32 +00001881 MachOArchUpdated ();
Greg Clayton41f92322010-06-11 03:25:34 +00001882 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001883 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001884 }
1885 }
Greg Clayton41f92322010-06-11 03:25:34 +00001886 Clear();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001887 return false;
1888}
1889
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001890ByteOrder
1891ArchSpec::GetDefaultEndian () const
1892{
Greg Clayton8368b4b2011-01-18 21:47:52 +00001893 switch (GetGenericCPUType ())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001894 {
Greg Clayton514487e2011-02-15 21:59:32 +00001895 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 Lattner30fdc8d2010-06-08 16:52:24 +00001906 }
1907 return eByteOrderInvalid;
1908}
1909
1910//----------------------------------------------------------------------
1911// Equal operator
1912//----------------------------------------------------------------------
1913bool
1914lldb_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 Clayton41f92322010-06-11 03:25:34 +00001919 if (lhs_cpu == CPU_ANY || rhs_cpu == CPU_ANY)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001920 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 Clayton41f92322010-06-11 03:25:34 +00001926 if (lhs_subtype == CPU_ANY || rhs_subtype == CPU_ANY)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001927 return true;
1928 return lhs_subtype == rhs_subtype;
1929 }
1930 return false;
1931}
1932
1933
1934//----------------------------------------------------------------------
1935// Not Equal operator
1936//----------------------------------------------------------------------
1937bool
1938lldb_private::operator!= (const ArchSpec& lhs, const ArchSpec& rhs)
1939{
1940 return !(lhs == rhs);
1941}
1942
1943//----------------------------------------------------------------------
1944// Less than operator
1945//----------------------------------------------------------------------
1946bool
1947lldb_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