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