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