Move the address lookup implementation from SymtabAPI to libcommon, so it can be...
[dyninst.git] / common / src / dyn_regs.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #define DYN_DEFINE_REGS
33 #include "dynutil/h/dyn_regs.h"
34
35 #include "external/rose/rose-compat.h"
36
37 using namespace Dyninst;
38
39 std::map<signed int, const char *> *Dyninst::MachRegister::names;
40
41 MachRegister::MachRegister() :
42    reg(0)
43
44 }
45
46 MachRegister::MachRegister(signed int r) :
47    reg(r)
48 {
49 }
50  
51 MachRegister::MachRegister(signed int r, const char *n) :
52    reg(r)
53 {
54    if (!names) {
55       names = new std::map<signed int, const char *>();
56    }
57    (*names)[r] = n;
58 }
59
60 MachRegister MachRegister::getBaseRegister() const { 
61    switch (getArchitecture()) {
62       case Arch_x86:
63       case Arch_x86_64:
64         
65           return MachRegister(reg & 0xfffff0ff);
66       case Arch_ppc32:
67       case Arch_ppc64:
68          return *this;
69       case Arch_none:
70          return *this;
71    }
72    return InvalidReg;
73 }
74    
75 Architecture MachRegister::getArchitecture() const { 
76    return (Architecture) (reg & 0xff000000);
77 }
78
79 bool MachRegister::isValid() const {
80    return (reg != InvalidReg.reg);
81 }
82
83 MachRegisterVal MachRegister::getSubRegValue(const MachRegister subreg, 
84                                              MachRegisterVal &orig) const
85 {
86    if (subreg.reg == reg || 
87        getArchitecture() == Arch_ppc32 ||
88        getArchitecture() == Arch_ppc64)
89       return orig;
90
91    assert(subreg.getBaseRegister() == getBaseRegister());
92    switch ((subreg.reg & 0x00000f00) >> 8) {
93       case 0x0: return orig;
94       case 0x1: return (orig & 0xff);
95       case 0x2: return (orig & 0xff00) >> 8;              
96       case 0x3: return (orig & 0xffff);
97       case 0xf: return (orig & 0xffffffff);
98       default: assert(0); return orig;
99    }
100 }
101
102 const char *MachRegister::name() const { 
103    return (*names)[reg];
104 }
105
106 unsigned int MachRegister::size() const {
107    switch (getArchitecture())
108    {
109       case Arch_x86:
110          switch (reg & 0x0000ff00) {
111             case x86::L_REG: //L_REG
112             case x86::H_REG: //H_REG
113                return 1;
114             case x86::W_REG: //W_REG
115                return 2;
116             case x86::FULL: //FULL
117                return 4;
118             case x86::QUAD:
119                return 8;
120             case x86::OCT:
121                return 16;
122             case x86::FPDBL:
123                return 10;
124             case x86::BIT:
125                return 0;
126             default:
127                assert(0);
128          }
129       case Arch_x86_64:
130          switch (reg & 0x0000ff00) {
131             case x86_64::L_REG: //L_REG
132             case x86_64::H_REG: //H_REG
133                 return 1;
134             case x86_64::W_REG: //W_REG
135                 return 2;
136             case x86_64::FULL: //FULL
137                 return 8;
138             case x86_64::D_REG:
139                return 4;
140             case x86_64::OCT:
141                return 16;
142             case x86_64::FPDBL:
143                return 10;
144             case x86_64::BIT:
145                return 0;
146             default:
147                assert(0);
148          }
149       case Arch_ppc32: {
150          int reg_class = reg & 0x00ff0000;
151          if (reg_class == ppc32::FPR || reg_class == ppc32::FSR)
152             return 8;
153          return 4;
154       }
155       case Arch_ppc64:
156          return 8;
157       case Arch_none:
158          return 0;
159    }
160    return 0; //Unreachable, but disable warnings
161 }
162    
163 bool MachRegister::operator<(const MachRegister &a) const { 
164    return (reg < a.reg);
165 }
166  
167 bool MachRegister::operator==(const MachRegister &a) const { 
168    return (reg == a.reg);
169 }
170  
171 MachRegister::operator signed int() const {
172    return reg;
173 }
174
175 signed int MachRegister::val() const {
176    return reg;
177 }
178
179
180 MachRegister MachRegister::getPC(Dyninst::Architecture arch)
181 {
182    switch (arch)
183    {
184       case Arch_x86:
185          return x86::eip;
186       case Arch_x86_64:
187          return x86_64::rip;
188       case Arch_ppc32:
189          return ppc32::pc;
190       case Arch_ppc64:
191          return ppc64::pc;
192       case Arch_none:
193          return InvalidReg;
194    }
195    return InvalidReg;
196 }
197
198 MachRegister MachRegister::getFramePointer(Dyninst::Architecture arch)
199 {
200    switch (arch)
201    {
202       case Arch_x86:
203          return x86::ebp;
204       case Arch_x86_64:
205          return x86_64::rbp;
206       case Arch_ppc32:
207       case Arch_ppc64:
208          return FrameBase;
209       case Arch_none:
210          return InvalidReg;
211    }
212    return InvalidReg;
213 }
214
215 MachRegister MachRegister::getStackPointer(Dyninst::Architecture arch)
216 {
217    switch (arch)
218    {
219       case Arch_x86:
220          return x86::esp;
221       case Arch_x86_64:
222          return x86_64::rsp;
223       case Arch_ppc32:
224          return ppc32::r1;
225       case Arch_ppc64:
226          return ppc64::r1;
227       case Arch_none:
228          return InvalidReg;
229    }
230    return InvalidReg;
231 }
232
233 bool MachRegister::isPC() const
234 {
235    return (*this == x86_64::rip || *this == x86::eip ||
236            *this == ppc32::pc || *this == ppc64::pc);
237 }
238
239 bool MachRegister::isFramePointer() const
240 {
241    return (*this == x86_64::rbp || *this == x86::ebp ||
242            *this == FrameBase);
243 }
244
245 bool MachRegister::isStackPointer() const
246 {
247    return (*this == x86_64::rsp || *this == x86::esp ||
248            *this == ppc32::r1 || *this == ppc64::r1);
249 }
250
251 void MachRegister::getROSERegister(int &c, int &n, int &p)
252 {
253    // Rose: class, number, position
254    // Dyninst: category, base id, subrange
255
256    signed int category = (reg & 0x00ff0000);
257    signed int subrange = (reg & 0x0000ff00);
258    signed int baseID =   (reg & 0x000000ff);
259
260    switch (getArchitecture()) {
261       case Arch_x86:
262       case Arch_x86_64: // 64-bit not supported in ROSE
263          switch (category) {
264             case x86::GPR:
265                c = x86_regclass_gpr;
266                switch (baseID) {
267                   case x86::BASEA:
268                      n = x86_gpr_ax;
269                      break;
270                   case x86::BASEC:
271                      n = x86_gpr_cx;
272                      break;
273                   case x86::BASED:
274                      n = x86_gpr_dx;
275                      break;
276                   case x86::BASEB:
277                      n = x86_gpr_bx;
278                      break;
279                   case x86::BASESP:
280                      n = x86_gpr_sp;
281                      break;
282                   case x86::BASEBP:
283                      n = x86_gpr_bp;
284                      break;
285                   case x86::BASESI:
286                      n = x86_gpr_si;
287                      break;
288                   case x86::BASEDI:
289                      n = x86_gpr_di;
290                      break;
291                   default:
292                      n = 0;
293                      break;
294                }
295                break;
296             case x86::SEG:
297                c = x86_regclass_segment;
298                switch (baseID) {
299                   case 0x0:
300                      n = x86_segreg_ds;
301                      break;
302                   case 0x1:
303                      n = x86_segreg_es;
304                      break;
305                   case 0x2:
306                      n = x86_segreg_fs;
307                      break;
308                   case 0x3:
309                      n = x86_segreg_gs;
310                      break;
311                   case 0x4:
312                      n = x86_segreg_cs;
313                      break;
314                   case 0x5:
315                      n = x86_segreg_ss;
316                      break;
317                   default:
318                      n = 0;
319                      break;
320                }
321                break;
322             case x86::FLAG:
323                c = x86_regclass_flags;
324                switch(baseID) {
325                case x86::CF:
326                  n = x86_flag_cf;
327                  break;
328                case x86::PF:
329                  n = x86_flag_pf;
330                  break;
331                case x86::AF:
332                  n = x86_flag_af;
333                  break;
334                case x86::ZF:
335                  n = x86_flag_zf;
336                  break;
337                case x86::SF:
338                  n = x86_flag_sf;
339                  break;
340                case x86::TF:
341                  n = x86_flag_tf;
342                  break;
343                case x86::IF:
344                  n = x86_flag_if;
345                  break;
346                case x86::DF:
347                  n = x86_flag_df;
348                  break;
349                case x86::OF:
350                  n = x86_flag_of;
351                  break;
352                default:
353                  assert(0);
354                  break;
355                }
356                break;
357             case x86::MISC:
358                c = x86_regclass_unknown;
359                break;
360             case x86::XMM:
361                c = x86_regclass_xmm;
362                n = baseID;
363                break;
364             case x86::MMX:
365                c = x86_regclass_mm;
366                n = baseID;
367                break;
368             case x86::CTL:
369                c = x86_regclass_cr;
370                n = baseID;
371                break;
372             case x86::DBG:
373                c = x86_regclass_dr;
374                n = baseID;
375                break;
376             case x86::TST:
377                c = x86_regclass_unknown;
378                break;
379             case 0:
380                switch (baseID) {
381                   case 0x10:
382                      c = x86_regclass_ip;
383                      n = 0;
384                      break;
385                   default:
386                      c = x86_regclass_unknown;
387                      break;
388                }
389                break;
390          }
391          break;
392       default:
393          c = x86_regclass_unknown;
394          n = 0;
395          break;
396    }
397
398    switch (getArchitecture()) {
399       case Arch_x86:
400       case Arch_x86_64:
401          switch (subrange) {
402             case x86::FULL:
403             case x86::OCT:
404             case x86::FPDBL:
405                p = x86_regpos_all;
406                break;
407             case x86::H_REG:
408                p = x86_regpos_high_byte;
409                break;
410             case x86::L_REG:
411                p = x86_regpos_low_byte;
412                break;
413             case x86::W_REG:
414                p = x86_regpos_word;
415                break;
416             case x86_64::D_REG:
417                p = x86_regpos_dword;
418                break;
419             case x86::BIT:
420                p = x86_regpos_all;
421                break;
422          }
423          break;
424       default:
425         p = x86_regpos_unknown;
426    }
427 }
428
429 MachRegister MachRegister::DwarfEncToReg(int encoding, Dyninst::Architecture arch)
430 {
431    switch (arch)
432    {
433       case Arch_x86:
434          switch (encoding) {
435             case 0: return Dyninst::x86::eax;
436             case 1: return Dyninst::x86::ecx;
437             case 2: return Dyninst::x86::edx;
438             case 3: return Dyninst::x86::ebx;
439             case 4: return Dyninst::x86::esp;
440             case 5: return Dyninst::x86::ebp;
441             case 6: return Dyninst::x86::esi;
442             case 7: return Dyninst::x86::edi;
443             case 8: return Dyninst::x86::eip;
444             case 9: return Dyninst::x86::flags;
445             case 10: return Dyninst::InvalidReg;
446             case 11: return Dyninst::x86::st0;
447             case 12: return Dyninst::x86::st1;
448             case 13: return Dyninst::x86::st2;
449             case 14: return Dyninst::x86::st3;
450             case 15: return Dyninst::x86::st4;
451             case 16: return Dyninst::x86::st5;
452             case 17: return Dyninst::x86::st6;
453             case 18: return Dyninst::x86::st7;
454             case 19: return Dyninst::InvalidReg;
455             case 20: return Dyninst::InvalidReg;
456             case 21: return Dyninst::x86::xmm0;
457             case 22: return Dyninst::x86::xmm1;
458             case 23: return Dyninst::x86::xmm2;
459             case 24: return Dyninst::x86::xmm3;
460             case 25: return Dyninst::x86::xmm4;
461             case 26: return Dyninst::x86::xmm5;
462             case 27: return Dyninst::x86::xmm6;
463             case 28: return Dyninst::x86::xmm7;
464             case 29: return Dyninst::x86::mm0;
465             case 30: return Dyninst::x86::mm1;
466             case 31: return Dyninst::x86::mm2;
467             case 32: return Dyninst::x86::mm3;
468             case 33: return Dyninst::x86::mm4;
469             case 34: return Dyninst::x86::mm5;
470             case 35: return Dyninst::x86::mm6;
471             case 36: return Dyninst::x86::mm7;
472             case 37: return Dyninst::InvalidReg; //fcw
473             case 38: return Dyninst::InvalidReg; //fsw
474             case 39: return Dyninst::InvalidReg; //mxcsr
475             case 40: return Dyninst::x86::es;
476             case 41: return Dyninst::x86::cs;
477             case 42: return Dyninst::x86::ss;
478             case 43: return Dyninst::x86::ds;
479             case 44: return Dyninst::x86::fs;
480             case 45: return Dyninst::x86::gs;
481             case 46: return Dyninst::InvalidReg;
482             case 47: return Dyninst::InvalidReg;
483             case 48: return Dyninst::InvalidReg; //tr
484             case 49: return Dyninst::InvalidReg; //ldtr
485             default: return Dyninst::InvalidReg;
486          }
487          break;
488       case Arch_x86_64:
489          switch (encoding) {
490             case 0: return Dyninst::x86_64::rax;
491             case 1: return Dyninst::x86_64::rdx;
492             case 2: return Dyninst::x86_64::rcx;
493             case 3: return Dyninst::x86_64::rbx;
494             case 4: return Dyninst::x86_64::rsi;
495             case 5: return Dyninst::x86_64::rdi;
496             case 6: return Dyninst::x86_64::rbp;
497             case 7: return Dyninst::x86_64::rsp;
498             case 8: return Dyninst::x86_64::r8;
499             case 9: return Dyninst::x86_64::r9;
500             case 10: return Dyninst::x86_64::r10;
501             case 11: return Dyninst::x86_64::r11;
502             case 12: return Dyninst::x86_64::r12;
503             case 13: return Dyninst::x86_64::r13;
504             case 14: return Dyninst::x86_64::r14;
505             case 15: return Dyninst::x86_64::r15;
506             case 16: return Dyninst::x86_64::rip;
507             case 17: return Dyninst::x86_64::xmm0;
508             case 18: return Dyninst::x86_64::xmm1;
509             case 19: return Dyninst::x86_64::xmm2;
510             case 20: return Dyninst::x86_64::xmm3;
511             case 21: return Dyninst::x86_64::xmm4;
512             case 22: return Dyninst::x86_64::xmm5;
513             case 23: return Dyninst::x86_64::xmm6;
514             case 24: return Dyninst::x86_64::xmm7;
515             case 25: return Dyninst::x86_64::xmm8;
516             case 26: return Dyninst::x86_64::xmm9;
517             case 27: return Dyninst::x86_64::xmm10;
518             case 28: return Dyninst::x86_64::xmm11;
519             case 29: return Dyninst::x86_64::xmm12;
520             case 30: return Dyninst::x86_64::xmm13;
521             case 31: return Dyninst::x86_64::xmm14;
522             case 32: return Dyninst::x86_64::xmm15;
523             case 33: return Dyninst::x86_64::st0;
524             case 34: return Dyninst::x86_64::st1;
525             case 35: return Dyninst::x86_64::st2;
526             case 36: return Dyninst::x86_64::st3;
527             case 37: return Dyninst::x86_64::st4;
528             case 38: return Dyninst::x86_64::st5;
529             case 39: return Dyninst::x86_64::st6;
530             case 40: return Dyninst::x86_64::st7;
531             case 41: return Dyninst::x86_64::mm0;
532             case 42: return Dyninst::x86_64::mm1;
533             case 43: return Dyninst::x86_64::mm2;
534             case 44: return Dyninst::x86_64::mm3;
535             case 45: return Dyninst::x86_64::mm4;
536             case 46: return Dyninst::x86_64::mm5;
537             case 47: return Dyninst::x86_64::mm6;
538             case 48: return Dyninst::x86_64::mm7;
539             case 49: return Dyninst::x86_64::flags;
540             case 50: return Dyninst::x86_64::es;
541             case 51: return Dyninst::x86_64::cs;
542             case 52: return Dyninst::x86_64::ss;
543             case 53: return Dyninst::x86_64::ds;
544             case 54: return Dyninst::x86_64::fs;
545             case 55: return Dyninst::x86_64::gs;
546             case 56: return Dyninst::InvalidReg;
547             case 57: return Dyninst::InvalidReg;
548             case 58: return Dyninst::x86_64::fsbase;
549             case 59: return Dyninst::x86_64::gsbase;
550             case 60: return Dyninst::InvalidReg; 
551             case 61: return Dyninst::InvalidReg; 
552             case 62: return Dyninst::InvalidReg; //tr
553             case 63: return Dyninst::InvalidReg; //ldtr
554             case 64: return Dyninst::InvalidReg; //mxcsr
555             case 65: return Dyninst::InvalidReg; //fcw
556             case 66: return Dyninst::InvalidReg; //fsw
557          }
558          break;
559       case Arch_ppc32:
560          switch (encoding) {
561             case 0: return Dyninst::ppc32::r0;
562             case 1: return Dyninst::ppc32::r1;
563             case 2: return Dyninst::ppc32::r2;
564             case 3: return Dyninst::ppc32::r3;
565             case 4: return Dyninst::ppc32::r4;
566             case 5: return Dyninst::ppc32::r5;
567             case 6: return Dyninst::ppc32::r6;
568             case 7: return Dyninst::ppc32::r7;
569             case 8: return Dyninst::ppc32::r8;
570             case 9: return Dyninst::ppc32::r9;
571             case 10: return Dyninst::ppc32::r10;
572             case 11: return Dyninst::ppc32::r11;
573             case 12: return Dyninst::ppc32::r12;
574             case 13: return Dyninst::ppc32::r13;
575             case 14: return Dyninst::ppc32::r14;
576             case 15: return Dyninst::ppc32::r15;
577             case 16: return Dyninst::ppc32::r16;
578             case 17: return Dyninst::ppc32::r17;
579             case 18: return Dyninst::ppc32::r18;
580             case 19: return Dyninst::ppc32::r19;
581             case 20: return Dyninst::ppc32::r20;
582             case 21: return Dyninst::ppc32::r21;
583             case 22: return Dyninst::ppc32::r22;
584             case 23: return Dyninst::ppc32::r23;
585             case 24: return Dyninst::ppc32::r24;
586             case 25: return Dyninst::ppc32::r25;
587             case 26: return Dyninst::ppc32::r26;
588             case 27: return Dyninst::ppc32::r27;
589             case 28: return Dyninst::ppc32::r28;
590             case 29: return Dyninst::ppc32::r29;
591             case 30: return Dyninst::ppc32::r30;
592             case 31: return Dyninst::ppc32::r31;
593             case 32: return Dyninst::ppc32::fpr0;
594             case 33: return Dyninst::ppc32::fpr1;
595             case 34: return Dyninst::ppc32::fpr2;
596             case 35: return Dyninst::ppc32::fpr3;
597             case 36: return Dyninst::ppc32::fpr4;
598             case 37: return Dyninst::ppc32::fpr5;
599             case 38: return Dyninst::ppc32::fpr6;
600             case 39: return Dyninst::ppc32::fpr7;
601             case 40: return Dyninst::ppc32::fpr8;
602             case 41: return Dyninst::ppc32::fpr9;
603             case 42: return Dyninst::ppc32::fpr10;
604             case 43: return Dyninst::ppc32::fpr11;
605             case 44: return Dyninst::ppc32::fpr12;
606             case 45: return Dyninst::ppc32::fpr13;
607             case 46: return Dyninst::ppc32::fpr14;
608             case 47: return Dyninst::ppc32::fpr15;
609             case 48: return Dyninst::ppc32::fpr16;
610             case 49: return Dyninst::ppc32::fpr17;
611             case 50: return Dyninst::ppc32::fpr18;
612             case 51: return Dyninst::ppc32::fpr19;
613             case 52: return Dyninst::ppc32::fpr20;
614             case 53: return Dyninst::ppc32::fpr21;
615             case 54: return Dyninst::ppc32::fpr22;
616             case 55: return Dyninst::ppc32::fpr23;
617             case 56: return Dyninst::ppc32::fpr24;
618             case 57: return Dyninst::ppc32::fpr25;
619             case 58: return Dyninst::ppc32::fpr26;
620             case 59: return Dyninst::ppc32::fpr27;
621             case 60: return Dyninst::ppc32::fpr28;
622             case 61: return Dyninst::ppc32::fpr29;
623             case 62: return Dyninst::ppc32::fpr30;
624             case 63: return Dyninst::ppc32::fpr31;
625             case 64: return Dyninst::ppc32::cr;
626             case 65: return Dyninst::InvalidReg; //FPSCR
627          }
628          //Seperate switch statements to give compilers an easier time of 
629          // optimizing
630          switch (encoding) {
631             case 100: return Dyninst::ppc32::mq;
632             case 101: return Dyninst::ppc32::xer;
633             case 102: return Dyninst::InvalidReg;
634             case 103: return Dyninst::InvalidReg;
635             case 104: return Dyninst::InvalidReg; //RTCU
636             case 105: return Dyninst::InvalidReg; //RTCL
637             case 106: return Dyninst::InvalidReg;
638             case 107: return Dyninst::InvalidReg;
639             case 108: return Dyninst::ppc32::lr;
640             case 109: return Dyninst::ppc32::ctr;
641             default: return Dyninst::InvalidReg;
642          }
643          break;
644       case Arch_ppc64:
645          switch (encoding) {
646             case 0: return Dyninst::ppc64::r0;
647             case 1: return Dyninst::ppc64::r1;
648             case 2: return Dyninst::ppc64::r2;
649             case 3: return Dyninst::ppc64::r3;
650             case 4: return Dyninst::ppc64::r4;
651             case 5: return Dyninst::ppc64::r5;
652             case 6: return Dyninst::ppc64::r6;
653             case 7: return Dyninst::ppc64::r7;
654             case 8: return Dyninst::ppc64::r8;
655             case 9: return Dyninst::ppc64::r9;
656             case 10: return Dyninst::ppc64::r10;
657             case 11: return Dyninst::ppc64::r11;
658             case 12: return Dyninst::ppc64::r12;
659             case 13: return Dyninst::ppc64::r13;
660             case 14: return Dyninst::ppc64::r14;
661             case 15: return Dyninst::ppc64::r15;
662             case 16: return Dyninst::ppc64::r16;
663             case 17: return Dyninst::ppc64::r17;
664             case 18: return Dyninst::ppc64::r18;
665             case 19: return Dyninst::ppc64::r19;
666             case 20: return Dyninst::ppc64::r20;
667             case 21: return Dyninst::ppc64::r21;
668             case 22: return Dyninst::ppc64::r22;
669             case 23: return Dyninst::ppc64::r23;
670             case 24: return Dyninst::ppc64::r24;
671             case 25: return Dyninst::ppc64::r25;
672             case 26: return Dyninst::ppc64::r26;
673             case 27: return Dyninst::ppc64::r27;
674             case 28: return Dyninst::ppc64::r28;
675             case 29: return Dyninst::ppc64::r29;
676             case 30: return Dyninst::ppc64::r30;
677             case 31: return Dyninst::ppc64::r31;
678             case 32: return Dyninst::ppc64::fpr0;
679             case 33: return Dyninst::ppc64::fpr1;
680             case 34: return Dyninst::ppc64::fpr2;
681             case 35: return Dyninst::ppc64::fpr3;
682             case 36: return Dyninst::ppc64::fpr4;
683             case 37: return Dyninst::ppc64::fpr5;
684             case 38: return Dyninst::ppc64::fpr6;
685             case 39: return Dyninst::ppc64::fpr7;
686             case 40: return Dyninst::ppc64::fpr8;
687             case 41: return Dyninst::ppc64::fpr9;
688             case 42: return Dyninst::ppc64::fpr10;
689             case 43: return Dyninst::ppc64::fpr11;
690             case 44: return Dyninst::ppc64::fpr12;
691             case 45: return Dyninst::ppc64::fpr13;
692             case 46: return Dyninst::ppc64::fpr14;
693             case 47: return Dyninst::ppc64::fpr15;
694             case 48: return Dyninst::ppc64::fpr16;
695             case 49: return Dyninst::ppc64::fpr17;
696             case 50: return Dyninst::ppc64::fpr18;
697             case 51: return Dyninst::ppc64::fpr19;
698             case 52: return Dyninst::ppc64::fpr20;
699             case 53: return Dyninst::ppc64::fpr21;
700             case 54: return Dyninst::ppc64::fpr22;
701             case 55: return Dyninst::ppc64::fpr23;
702             case 56: return Dyninst::ppc64::fpr24;
703             case 57: return Dyninst::ppc64::fpr25;
704             case 58: return Dyninst::ppc64::fpr26;
705             case 59: return Dyninst::ppc64::fpr27;
706             case 60: return Dyninst::ppc64::fpr28;
707             case 61: return Dyninst::ppc64::fpr29;
708             case 62: return Dyninst::ppc64::fpr30;
709             case 63: return Dyninst::ppc64::fpr31;
710             case 64: return Dyninst::ppc64::cr;
711             case 65: return Dyninst::InvalidReg; //FPSCR
712          }
713          //Seperate switch statements to give compilers an easier time of 
714          // optimizing
715          switch (encoding) {
716             case 100: return Dyninst::ppc64::mq;
717             case 101: return Dyninst::ppc64::xer;
718             case 102: return Dyninst::InvalidReg;
719             case 103: return Dyninst::InvalidReg;
720             case 104: return Dyninst::InvalidReg; //RTCU
721             case 105: return Dyninst::InvalidReg; //RTCL
722             case 106: return Dyninst::InvalidReg;
723             case 107: return Dyninst::InvalidReg;
724             case 108: return Dyninst::ppc64::lr;
725             case 109: return Dyninst::ppc64::ctr;
726             default: return Dyninst::InvalidReg;
727          }
728          break;
729       case Arch_none:
730          return Dyninst::InvalidReg;
731          break;
732    }
733    //Invalid Architecture passed
734    return Dyninst::InvalidReg;
735
736 }
737
738 int MachRegister::getDwarfEnc() const
739 {
740    switch (getArchitecture())
741    {
742       case Arch_x86:
743          switch (val()) {
744             case Dyninst::x86::ieax: return 0;
745             case Dyninst::x86::iecx: return 1;
746             case Dyninst::x86::iedx: return 2;
747             case Dyninst::x86::iebx: return 3;
748             case Dyninst::x86::iesp: return 4;
749             case Dyninst::x86::iebp: return 5;
750             case Dyninst::x86::iesi: return 6;
751             case Dyninst::x86::iedi: return 7;
752             case Dyninst::x86::ieip: return 8;
753             case Dyninst::x86::iflags: return 9;
754             case Dyninst::x86::ixmm0: return 21;
755             case Dyninst::x86::ixmm1: return 22;
756             case Dyninst::x86::ixmm2: return 23;
757             case Dyninst::x86::ixmm3: return 24;
758             case Dyninst::x86::ixmm4: return 25;
759             case Dyninst::x86::ixmm5: return 26;
760             case Dyninst::x86::ixmm6: return 27;
761             case Dyninst::x86::ixmm7: return 28;
762             case Dyninst::x86::imm0: return 29;
763             case Dyninst::x86::imm1: return 30;
764             case Dyninst::x86::imm2: return 31;
765             case Dyninst::x86::imm3: return 32;
766             case Dyninst::x86::imm4: return 33;
767             case Dyninst::x86::imm5: return 34;
768             case Dyninst::x86::imm6: return 35;
769             case Dyninst::x86::imm7: return 36;
770             case Dyninst::x86::ies: return 40;
771             case Dyninst::x86::ics: return 41;
772             case Dyninst::x86::iss: return 42;
773             case Dyninst::x86::ids: return 43;
774             case Dyninst::x86::ifs: return 44;
775             case Dyninst::x86::igs: return 45;
776             default: return -1;
777          }
778          break;
779       case Arch_x86_64:
780          switch (val()) {
781             case Dyninst::x86_64::irax: return 0;
782             case Dyninst::x86_64::irdx: return 1;
783             case Dyninst::x86_64::ircx: return 2;
784             case Dyninst::x86_64::irbx: return 3;
785             case Dyninst::x86_64::irsi: return 4;
786             case Dyninst::x86_64::irdi: return 5;
787             case Dyninst::x86_64::irbp: return 6;
788             case Dyninst::x86_64::irsp: return 7;
789             case Dyninst::x86_64::ir8: return 8;
790             case Dyninst::x86_64::ir9: return 9;
791             case Dyninst::x86_64::ir10: return 10;
792             case Dyninst::x86_64::ir11: return 11;
793             case Dyninst::x86_64::ir12: return 12;
794             case Dyninst::x86_64::ir13: return 13;
795             case Dyninst::x86_64::ir14: return 14;
796             case Dyninst::x86_64::ir15: return 15;
797             case Dyninst::x86_64::irip: return 16;
798             case Dyninst::x86_64::ixmm0: return 17;
799             case Dyninst::x86_64::ixmm1: return 18;
800             case Dyninst::x86_64::ixmm2: return 19;
801             case Dyninst::x86_64::ixmm3: return 20;
802             case Dyninst::x86_64::ixmm4: return 21;
803             case Dyninst::x86_64::ixmm5: return 22;
804             case Dyninst::x86_64::ixmm6: return 23;
805             case Dyninst::x86_64::ixmm7: return 24;
806             case Dyninst::x86_64::ixmm8: return 25;
807             case Dyninst::x86_64::ixmm9: return 26;
808             case Dyninst::x86_64::ixmm10: return 27;
809             case Dyninst::x86_64::ixmm11: return 28;
810             case Dyninst::x86_64::ixmm12: return 29;
811             case Dyninst::x86_64::ixmm13: return 30;
812             case Dyninst::x86_64::ixmm14: return 31;
813             case Dyninst::x86_64::ixmm15: return 32;
814             case Dyninst::x86_64::imm0: return 41;
815             case Dyninst::x86_64::imm1: return 42;
816             case Dyninst::x86_64::imm2: return 43;
817             case Dyninst::x86_64::imm3: return 44;
818             case Dyninst::x86_64::imm4: return 45;
819             case Dyninst::x86_64::imm5: return 46;
820             case Dyninst::x86_64::imm6: return 47;
821             case Dyninst::x86_64::imm7: return 48;
822             case Dyninst::x86_64::iflags: return 49;
823             case Dyninst::x86_64::ies: return 50;
824             case Dyninst::x86_64::ics: return 51;
825             case Dyninst::x86_64::iss: return 52;
826             case Dyninst::x86_64::ids: return 53;
827             case Dyninst::x86_64::ifs: return 54;
828             case Dyninst::x86_64::igs: return 55;
829             case Dyninst::x86_64::ifsbase: return 58;
830             case Dyninst::x86_64::igsbase: return 59;
831             default: return -1;
832          }
833          break;
834       case Arch_ppc32:
835          switch (val()) {
836             case Dyninst::ppc32::ir0: return 0;
837             case Dyninst::ppc32::ir1: return 1;
838             case Dyninst::ppc32::ir2: return 2;
839             case Dyninst::ppc32::ir3: return 3;
840             case Dyninst::ppc32::ir4: return 4;
841             case Dyninst::ppc32::ir5: return 5;
842             case Dyninst::ppc32::ir6: return 6;
843             case Dyninst::ppc32::ir7: return 7;
844             case Dyninst::ppc32::ir8: return 8;
845             case Dyninst::ppc32::ir9: return 9;
846             case Dyninst::ppc32::ir10: return 10;
847             case Dyninst::ppc32::ir11: return 11;
848             case Dyninst::ppc32::ir12: return 12;
849             case Dyninst::ppc32::ir13: return 13;
850             case Dyninst::ppc32::ir14: return 14;
851             case Dyninst::ppc32::ir15: return 15;
852             case Dyninst::ppc32::ir16: return 16;
853             case Dyninst::ppc32::ir17: return 17;
854             case Dyninst::ppc32::ir18: return 18;
855             case Dyninst::ppc32::ir19: return 19;
856             case Dyninst::ppc32::ir20: return 20;
857             case Dyninst::ppc32::ir21: return 21;
858             case Dyninst::ppc32::ir22: return 22;
859             case Dyninst::ppc32::ir23: return 23;
860             case Dyninst::ppc32::ir24: return 24;
861             case Dyninst::ppc32::ir25: return 25;
862             case Dyninst::ppc32::ir26: return 26;
863             case Dyninst::ppc32::ir27: return 27;
864             case Dyninst::ppc32::ir28: return 28;
865             case Dyninst::ppc32::ir29: return 29;
866             case Dyninst::ppc32::ir30: return 30;
867             case Dyninst::ppc32::ir31: return 31;
868             case Dyninst::ppc32::ifpr0: return 32;
869             case Dyninst::ppc32::ifpr1: return 33;
870             case Dyninst::ppc32::ifpr2: return 34;
871             case Dyninst::ppc32::ifpr3: return 35;
872             case Dyninst::ppc32::ifpr4: return 36;
873             case Dyninst::ppc32::ifpr5: return 37;
874             case Dyninst::ppc32::ifpr6: return 38;
875             case Dyninst::ppc32::ifpr7: return 39;
876             case Dyninst::ppc32::ifpr8: return 40;
877             case Dyninst::ppc32::ifpr9: return 41;
878             case Dyninst::ppc32::ifpr10: return 42;
879             case Dyninst::ppc32::ifpr11: return 43;
880             case Dyninst::ppc32::ifpr12: return 44;
881             case Dyninst::ppc32::ifpr13: return 45;
882             case Dyninst::ppc32::ifpr14: return 46;
883             case Dyninst::ppc32::ifpr15: return 47;
884             case Dyninst::ppc32::ifpr16: return 48;
885             case Dyninst::ppc32::ifpr17: return 49;
886             case Dyninst::ppc32::ifpr18: return 50;
887             case Dyninst::ppc32::ifpr19: return 51;
888             case Dyninst::ppc32::ifpr20: return 52;
889             case Dyninst::ppc32::ifpr21: return 53;
890             case Dyninst::ppc32::ifpr22: return 54;
891             case Dyninst::ppc32::ifpr23: return 55;
892             case Dyninst::ppc32::ifpr24: return 56;
893             case Dyninst::ppc32::ifpr25: return 57;
894             case Dyninst::ppc32::ifpr26: return 58;
895             case Dyninst::ppc32::ifpr27: return 59;
896             case Dyninst::ppc32::ifpr28: return 60;
897             case Dyninst::ppc32::ifpr29: return 61;
898             case Dyninst::ppc32::ifpr30: return 62;
899             case Dyninst::ppc32::ifpr31: return 63;
900             case Dyninst::ppc32::icr: return 64;
901             case Dyninst::ppc32::imq: return 100;
902             case Dyninst::ppc32::ixer: return 101;
903             case Dyninst::ppc32::ilr: return 108;
904             case Dyninst::ppc32::ictr: return 109;
905             default: return -1;
906          }
907       case Arch_ppc64:
908          switch (val()) {
909             case Dyninst::ppc64::ir0: return 0;
910             case Dyninst::ppc64::ir1: return 1;
911             case Dyninst::ppc64::ir2: return 2;
912             case Dyninst::ppc64::ir3: return 3;
913             case Dyninst::ppc64::ir4: return 4;
914             case Dyninst::ppc64::ir5: return 5;
915             case Dyninst::ppc64::ir6: return 6;
916             case Dyninst::ppc64::ir7: return 7;
917             case Dyninst::ppc64::ir8: return 8;
918             case Dyninst::ppc64::ir9: return 9;
919             case Dyninst::ppc64::ir10: return 10;
920             case Dyninst::ppc64::ir11: return 11;
921             case Dyninst::ppc64::ir12: return 12;
922             case Dyninst::ppc64::ir13: return 13;
923             case Dyninst::ppc64::ir14: return 14;
924             case Dyninst::ppc64::ir15: return 15;
925             case Dyninst::ppc64::ir16: return 16;
926             case Dyninst::ppc64::ir17: return 17;
927             case Dyninst::ppc64::ir18: return 18;
928             case Dyninst::ppc64::ir19: return 19;
929             case Dyninst::ppc64::ir20: return 20;
930             case Dyninst::ppc64::ir21: return 21;
931             case Dyninst::ppc64::ir22: return 22;
932             case Dyninst::ppc64::ir23: return 23;
933             case Dyninst::ppc64::ir24: return 24;
934             case Dyninst::ppc64::ir25: return 25;
935             case Dyninst::ppc64::ir26: return 26;
936             case Dyninst::ppc64::ir27: return 27;
937             case Dyninst::ppc64::ir28: return 28;
938             case Dyninst::ppc64::ir29: return 29;
939             case Dyninst::ppc64::ir30: return 30;
940             case Dyninst::ppc64::ir31: return 31;
941             case Dyninst::ppc64::ifpr0: return 32;
942             case Dyninst::ppc64::ifpr1: return 33;
943             case Dyninst::ppc64::ifpr2: return 34;
944             case Dyninst::ppc64::ifpr3: return 35;
945             case Dyninst::ppc64::ifpr4: return 36;
946             case Dyninst::ppc64::ifpr5: return 37;
947             case Dyninst::ppc64::ifpr6: return 38;
948             case Dyninst::ppc64::ifpr7: return 39;
949             case Dyninst::ppc64::ifpr8: return 40;
950             case Dyninst::ppc64::ifpr9: return 41;
951             case Dyninst::ppc64::ifpr10: return 42;
952             case Dyninst::ppc64::ifpr11: return 43;
953             case Dyninst::ppc64::ifpr12: return 44;
954             case Dyninst::ppc64::ifpr13: return 45;
955             case Dyninst::ppc64::ifpr14: return 46;
956             case Dyninst::ppc64::ifpr15: return 47;
957             case Dyninst::ppc64::ifpr16: return 48;
958             case Dyninst::ppc64::ifpr17: return 49;
959             case Dyninst::ppc64::ifpr18: return 50;
960             case Dyninst::ppc64::ifpr19: return 51;
961             case Dyninst::ppc64::ifpr20: return 52;
962             case Dyninst::ppc64::ifpr21: return 53;
963             case Dyninst::ppc64::ifpr22: return 54;
964             case Dyninst::ppc64::ifpr23: return 55;
965             case Dyninst::ppc64::ifpr24: return 56;
966             case Dyninst::ppc64::ifpr25: return 57;
967             case Dyninst::ppc64::ifpr26: return 58;
968             case Dyninst::ppc64::ifpr27: return 59;
969             case Dyninst::ppc64::ifpr28: return 60;
970             case Dyninst::ppc64::ifpr29: return 61;
971             case Dyninst::ppc64::ifpr30: return 62;
972             case Dyninst::ppc64::ifpr31: return 63;
973             case Dyninst::ppc64::icr: return 64;
974             case Dyninst::ppc64::imq: return 100;
975             case Dyninst::ppc64::ixer: return 101;
976             case Dyninst::ppc64::ilr: return 108;
977             case Dyninst::ppc64::ictr: return 109;
978             default: return -1;
979          }
980          break;
981       case Arch_none:
982          return -1;
983    }
984    //Invalid register passed
985    return -1;
986 }