Home | History | Annotate | Line # | Download | only in libunwind
Registers.hpp revision 1.16.4.2
      1  1.16.4.2  yamt //===----------------------------- Registers.hpp --------------------------===//
      2  1.16.4.2  yamt //
      3  1.16.4.2  yamt //                     The LLVM Compiler Infrastructure
      4  1.16.4.2  yamt //
      5  1.16.4.2  yamt // This file is dual licensed under the MIT and the University of Illinois Open
      6  1.16.4.2  yamt // Source Licenses. See LICENSE.TXT for details.
      7  1.16.4.2  yamt //
      8  1.16.4.2  yamt //
      9  1.16.4.2  yamt //  Models register sets for supported processors.
     10  1.16.4.2  yamt //
     11  1.16.4.2  yamt //===----------------------------------------------------------------------===//
     12  1.16.4.2  yamt #ifndef __REGISTERS_HPP__
     13  1.16.4.2  yamt #define __REGISTERS_HPP__
     14  1.16.4.2  yamt 
     15  1.16.4.2  yamt #include <cassert>
     16  1.16.4.2  yamt #include <cstdint>
     17  1.16.4.2  yamt 
     18  1.16.4.2  yamt namespace _Unwind {
     19  1.16.4.2  yamt 
     20  1.16.4.2  yamt enum {
     21  1.16.4.2  yamt   REGNO_X86_EAX = 0,
     22  1.16.4.2  yamt   REGNO_X86_ECX = 1,
     23  1.16.4.2  yamt   REGNO_X86_EDX = 2,
     24  1.16.4.2  yamt   REGNO_X86_EBX = 3,
     25  1.16.4.2  yamt   REGNO_X86_ESP = 4,
     26  1.16.4.2  yamt   REGNO_X86_EBP = 5,
     27  1.16.4.2  yamt   REGNO_X86_ESI = 6,
     28  1.16.4.2  yamt   REGNO_X86_EDI = 7,
     29  1.16.4.2  yamt   REGNO_X86_EIP = 8,
     30  1.16.4.2  yamt };
     31  1.16.4.2  yamt 
     32  1.16.4.2  yamt class Registers_x86 {
     33  1.16.4.2  yamt public:
     34  1.16.4.2  yamt   enum {
     35  1.16.4.2  yamt     LAST_REGISTER = REGNO_X86_EIP,
     36  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_X86_EIP,
     37  1.16.4.2  yamt     RETURN_OFFSET = 0,
     38  1.16.4.2  yamt   };
     39  1.16.4.2  yamt 
     40  1.16.4.2  yamt   __dso_hidden Registers_x86();
     41  1.16.4.2  yamt 
     42  1.16.4.2  yamt   static int dwarf2regno(int num) { return num; }
     43  1.16.4.2  yamt 
     44  1.16.4.2  yamt   bool validRegister(int num) const {
     45  1.16.4.2  yamt     return num >= REGNO_X86_EAX && num <= REGNO_X86_EDI;
     46  1.16.4.2  yamt   }
     47  1.16.4.2  yamt 
     48  1.16.4.2  yamt   uint32_t getRegister(int num) const {
     49  1.16.4.2  yamt     assert(validRegister(num));
     50  1.16.4.2  yamt     return reg[num];
     51  1.16.4.2  yamt   }
     52  1.16.4.2  yamt 
     53  1.16.4.2  yamt   void setRegister(int num, uint32_t value) {
     54  1.16.4.2  yamt     assert(validRegister(num));
     55  1.16.4.2  yamt     reg[num] = value;
     56  1.16.4.2  yamt   }
     57  1.16.4.2  yamt 
     58  1.16.4.2  yamt   uint32_t getIP() const { return reg[REGNO_X86_EIP]; }
     59  1.16.4.2  yamt 
     60  1.16.4.2  yamt   void setIP(uint32_t value) { reg[REGNO_X86_EIP] = value; }
     61  1.16.4.2  yamt 
     62  1.16.4.2  yamt   uint32_t getSP() const { return reg[REGNO_X86_ESP]; }
     63  1.16.4.2  yamt 
     64  1.16.4.2  yamt   void setSP(uint32_t value) { reg[REGNO_X86_ESP] = value; }
     65  1.16.4.2  yamt 
     66  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const { return false; }
     67  1.16.4.2  yamt 
     68  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint32_t addr) {
     69  1.16.4.2  yamt   }
     70  1.16.4.2  yamt 
     71  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
     72  1.16.4.2  yamt 
     73  1.16.4.2  yamt private:
     74  1.16.4.2  yamt   uint32_t reg[REGNO_X86_EIP + 1];
     75  1.16.4.2  yamt };
     76  1.16.4.2  yamt 
     77  1.16.4.2  yamt enum {
     78  1.16.4.2  yamt   REGNO_X86_64_RAX = 0,
     79  1.16.4.2  yamt   REGNO_X86_64_RDX = 1,
     80  1.16.4.2  yamt   REGNO_X86_64_RCX = 2,
     81  1.16.4.2  yamt   REGNO_X86_64_RBX = 3,
     82  1.16.4.2  yamt   REGNO_X86_64_RSI = 4,
     83  1.16.4.2  yamt   REGNO_X86_64_RDI = 5,
     84  1.16.4.2  yamt   REGNO_X86_64_RBP = 6,
     85  1.16.4.2  yamt   REGNO_X86_64_RSP = 7,
     86  1.16.4.2  yamt   REGNO_X86_64_R8 = 8,
     87  1.16.4.2  yamt   REGNO_X86_64_R9 = 9,
     88  1.16.4.2  yamt   REGNO_X86_64_R10 = 10,
     89  1.16.4.2  yamt   REGNO_X86_64_R11 = 11,
     90  1.16.4.2  yamt   REGNO_X86_64_R12 = 12,
     91  1.16.4.2  yamt   REGNO_X86_64_R13 = 13,
     92  1.16.4.2  yamt   REGNO_X86_64_R14 = 14,
     93  1.16.4.2  yamt   REGNO_X86_64_R15 = 15,
     94  1.16.4.2  yamt   REGNO_X86_64_RIP = 16,
     95  1.16.4.2  yamt };
     96  1.16.4.2  yamt 
     97  1.16.4.2  yamt class Registers_x86_64 {
     98  1.16.4.2  yamt public:
     99  1.16.4.2  yamt   enum {
    100  1.16.4.2  yamt     LAST_REGISTER = REGNO_X86_64_RIP,
    101  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_X86_64_RIP,
    102  1.16.4.2  yamt     RETURN_OFFSET = 0,
    103  1.16.4.2  yamt   };
    104  1.16.4.2  yamt 
    105  1.16.4.2  yamt   __dso_hidden Registers_x86_64();
    106  1.16.4.2  yamt 
    107  1.16.4.2  yamt   static int dwarf2regno(int num) { return num; }
    108  1.16.4.2  yamt 
    109  1.16.4.2  yamt   bool validRegister(int num) const {
    110  1.16.4.2  yamt     return num >= REGNO_X86_64_RAX && num <= REGNO_X86_64_R15;
    111  1.16.4.2  yamt   }
    112  1.16.4.2  yamt 
    113  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    114  1.16.4.2  yamt     assert(validRegister(num));
    115  1.16.4.2  yamt     return reg[num];
    116  1.16.4.2  yamt   }
    117  1.16.4.2  yamt 
    118  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    119  1.16.4.2  yamt     assert(validRegister(num));
    120  1.16.4.2  yamt     reg[num] = value;
    121  1.16.4.2  yamt   }
    122  1.16.4.2  yamt 
    123  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_X86_64_RIP]; }
    124  1.16.4.2  yamt 
    125  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_X86_64_RIP] = value; }
    126  1.16.4.2  yamt 
    127  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_X86_64_RSP]; }
    128  1.16.4.2  yamt 
    129  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_X86_64_RSP] = value; }
    130  1.16.4.2  yamt 
    131  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const { return false; }
    132  1.16.4.2  yamt 
    133  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr) {
    134  1.16.4.2  yamt   }
    135  1.16.4.2  yamt 
    136  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    137  1.16.4.2  yamt 
    138  1.16.4.2  yamt private:
    139  1.16.4.2  yamt   uint64_t reg[REGNO_X86_64_RIP + 1];
    140  1.16.4.2  yamt };
    141  1.16.4.2  yamt 
    142  1.16.4.2  yamt enum {
    143  1.16.4.2  yamt   DWARF_PPC32_R0 = 0,
    144  1.16.4.2  yamt   DWARF_PPC32_R31 = 31,
    145  1.16.4.2  yamt   DWARF_PPC32_F0 = 32,
    146  1.16.4.2  yamt   DWARF_PPC32_F31 = 63,
    147  1.16.4.2  yamt   DWARF_PPC32_LR = 65,
    148  1.16.4.2  yamt   DWARF_PPC32_CR = 70,
    149  1.16.4.2  yamt   DWARF_PPC32_V0 = 77,
    150  1.16.4.2  yamt   DWARF_PPC32_V31 = 108,
    151  1.16.4.2  yamt 
    152  1.16.4.2  yamt   REGNO_PPC32_R0 = 0,
    153  1.16.4.2  yamt   REGNO_PPC32_R1 = 1,
    154  1.16.4.2  yamt   REGNO_PPC32_R31 = 31,
    155  1.16.4.2  yamt   REGNO_PPC32_LR = 32,
    156  1.16.4.2  yamt   REGNO_PPC32_CR = 33,
    157  1.16.4.2  yamt   REGNO_PPC32_SRR0 = 34,
    158  1.16.4.2  yamt 
    159  1.16.4.2  yamt   REGNO_PPC32_F0 = REGNO_PPC32_SRR0 + 1,
    160  1.16.4.2  yamt   REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31,
    161  1.16.4.2  yamt   REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1,
    162  1.16.4.2  yamt   REGNO_PPC32_V31 = REGNO_PPC32_V0 + 31,
    163  1.16.4.2  yamt };
    164  1.16.4.2  yamt 
    165  1.16.4.2  yamt class Registers_ppc32 {
    166  1.16.4.2  yamt public:
    167  1.16.4.2  yamt   enum {
    168  1.16.4.2  yamt     LAST_REGISTER = REGNO_PPC32_V31,
    169  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_PPC32_V31,
    170  1.16.4.2  yamt     RETURN_OFFSET = 0,
    171  1.16.4.2  yamt   };
    172  1.16.4.2  yamt 
    173  1.16.4.2  yamt   __dso_hidden Registers_ppc32();
    174  1.16.4.2  yamt 
    175  1.16.4.2  yamt   static int dwarf2regno(int num) {
    176  1.16.4.2  yamt     if (num >= DWARF_PPC32_R0 && num <= DWARF_PPC32_R31)
    177  1.16.4.2  yamt       return REGNO_PPC32_R0 + (num - DWARF_PPC32_R0);
    178  1.16.4.2  yamt     if (num >= DWARF_PPC32_F0 && num <= DWARF_PPC32_F31)
    179  1.16.4.2  yamt       return REGNO_PPC32_F0 + (num - DWARF_PPC32_F0);
    180  1.16.4.2  yamt     if (num >= DWARF_PPC32_V0 && num <= DWARF_PPC32_V31)
    181  1.16.4.2  yamt       return REGNO_PPC32_V0 + (num - DWARF_PPC32_V0);
    182  1.16.4.2  yamt     switch (num) {
    183  1.16.4.2  yamt     case DWARF_PPC32_LR:
    184  1.16.4.2  yamt       return REGNO_PPC32_LR;
    185  1.16.4.2  yamt     case DWARF_PPC32_CR:
    186  1.16.4.2  yamt       return REGNO_PPC32_CR;
    187  1.16.4.2  yamt     default:
    188  1.16.4.2  yamt       return LAST_REGISTER + 1;
    189  1.16.4.2  yamt     }
    190  1.16.4.2  yamt   }
    191  1.16.4.2  yamt 
    192  1.16.4.2  yamt   bool validRegister(int num) const {
    193  1.16.4.2  yamt     return num >= 0 && num <= LAST_RESTORE_REG;
    194  1.16.4.2  yamt   }
    195  1.16.4.2  yamt 
    196  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    197  1.16.4.2  yamt     assert(validRegister(num));
    198  1.16.4.2  yamt     return reg[num];
    199  1.16.4.2  yamt   }
    200  1.16.4.2  yamt 
    201  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    202  1.16.4.2  yamt     assert(validRegister(num));
    203  1.16.4.2  yamt     reg[num] = value;
    204  1.16.4.2  yamt   }
    205  1.16.4.2  yamt 
    206  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_PPC32_SRR0]; }
    207  1.16.4.2  yamt 
    208  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_PPC32_SRR0] = value; }
    209  1.16.4.2  yamt 
    210  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_PPC32_R1]; }
    211  1.16.4.2  yamt 
    212  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_PPC32_R1] = value; }
    213  1.16.4.2  yamt 
    214  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    215  1.16.4.2  yamt     return (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31) ||
    216  1.16.4.2  yamt            (num >= REGNO_PPC32_V0 && num <= REGNO_PPC32_V31);
    217  1.16.4.2  yamt   }
    218  1.16.4.2  yamt 
    219  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    220  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    221  1.16.4.2  yamt     if (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31)
    222  1.16.4.2  yamt       memcpy(fpreg + (num - REGNO_PPC32_F0), addr, sizeof(fpreg[0]));
    223  1.16.4.2  yamt     else
    224  1.16.4.2  yamt       memcpy(vecreg + (num - REGNO_PPC32_V0), addr, sizeof(vecreg[0]));
    225  1.16.4.2  yamt   }
    226  1.16.4.2  yamt 
    227  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    228  1.16.4.2  yamt 
    229  1.16.4.2  yamt private:
    230  1.16.4.2  yamt   struct vecreg_t {
    231  1.16.4.2  yamt     uint64_t low, high;
    232  1.16.4.2  yamt   };
    233  1.16.4.2  yamt   uint32_t reg[REGNO_PPC32_SRR0 + 1];
    234  1.16.4.2  yamt   uint32_t dummy;
    235  1.16.4.2  yamt   uint64_t fpreg[32];
    236  1.16.4.2  yamt   vecreg_t vecreg[64];
    237  1.16.4.2  yamt };
    238  1.16.4.2  yamt 
    239  1.16.4.2  yamt enum {
    240  1.16.4.2  yamt   DWARF_ARM32_R0 = 0,
    241  1.16.4.2  yamt   DWARF_ARM32_R15 = 15,
    242  1.16.4.2  yamt   DWARF_ARM32_SPSR = 128,
    243  1.16.4.2  yamt   DWARF_ARM32_OLD_S0 = 64,
    244  1.16.4.2  yamt   DWARF_ARM32_OLD_S31 = 91,
    245  1.16.4.2  yamt   DWARF_ARM32_D0 = 256,
    246  1.16.4.2  yamt   DWARF_ARM32_D31 = 287,
    247  1.16.4.2  yamt   REGNO_ARM32_R0 = 0,
    248  1.16.4.2  yamt   REGNO_ARM32_SP = 13,
    249  1.16.4.2  yamt   REGNO_ARM32_R15 = 15,
    250  1.16.4.2  yamt   REGNO_ARM32_SPSR = 16,
    251  1.16.4.2  yamt   REGNO_ARM32_D0 = 17,
    252  1.16.4.2  yamt   REGNO_ARM32_D15 = 32,
    253  1.16.4.2  yamt   REGNO_ARM32_D31 = 48,
    254  1.16.4.2  yamt };
    255  1.16.4.2  yamt 
    256  1.16.4.2  yamt class Registers_arm32 {
    257  1.16.4.2  yamt public:
    258  1.16.4.2  yamt   enum {
    259  1.16.4.2  yamt     LAST_REGISTER = REGNO_ARM32_D31,
    260  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_ARM32_D31,
    261  1.16.4.2  yamt     RETURN_OFFSET = 0,
    262  1.16.4.2  yamt   };
    263  1.16.4.2  yamt 
    264  1.16.4.2  yamt   __dso_hidden Registers_arm32();
    265  1.16.4.2  yamt 
    266  1.16.4.2  yamt   static int dwarf2regno(int num) {
    267  1.16.4.2  yamt     if (num >= DWARF_ARM32_R0 && num <= DWARF_ARM32_R15)
    268  1.16.4.2  yamt       return REGNO_ARM32_R0 + (num - DWARF_ARM32_R0);
    269  1.16.4.2  yamt     if (num == DWARF_ARM32_SPSR)
    270  1.16.4.2  yamt       return REGNO_ARM32_SPSR;
    271  1.16.4.2  yamt     if (num >= DWARF_ARM32_D0 && num <= DWARF_ARM32_D31)
    272  1.16.4.2  yamt       return REGNO_ARM32_D0 + (num - DWARF_ARM32_D0);
    273  1.16.4.2  yamt     if (num >= DWARF_ARM32_OLD_S0 && num <= DWARF_ARM32_OLD_S31) {
    274  1.16.4.2  yamt       assert(num % 2 == 0);
    275  1.16.4.2  yamt       return REGNO_ARM32_D0 + (num - DWARF_ARM32_OLD_S0) / 2;
    276  1.16.4.2  yamt     }
    277  1.16.4.2  yamt     return LAST_REGISTER + 1;
    278  1.16.4.2  yamt   }
    279  1.16.4.2  yamt 
    280  1.16.4.2  yamt   bool validRegister(int num) const {
    281  1.16.4.2  yamt     return num >= 0 && num <= REGNO_ARM32_SPSR;
    282  1.16.4.2  yamt   }
    283  1.16.4.2  yamt 
    284  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    285  1.16.4.2  yamt     assert(validRegister(num));
    286  1.16.4.2  yamt     return reg[num];
    287  1.16.4.2  yamt   }
    288  1.16.4.2  yamt 
    289  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    290  1.16.4.2  yamt     assert(validRegister(num));
    291  1.16.4.2  yamt     reg[num] = value;
    292  1.16.4.2  yamt   }
    293  1.16.4.2  yamt 
    294  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_ARM32_R15]; }
    295  1.16.4.2  yamt 
    296  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_ARM32_R15] = value; }
    297  1.16.4.2  yamt 
    298  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_ARM32_SP]; }
    299  1.16.4.2  yamt 
    300  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_ARM32_SP] = value; }
    301  1.16.4.2  yamt 
    302  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    303  1.16.4.2  yamt     return (num >= REGNO_ARM32_D0 && num <= REGNO_ARM32_D31);
    304  1.16.4.2  yamt   }
    305  1.16.4.2  yamt 
    306  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    307  1.16.4.2  yamt     if (num <= REGNO_ARM32_D15) {
    308  1.16.4.2  yamt       if ((flags & 1) == 0) {
    309  1.16.4.2  yamt         lazyVFP1();
    310  1.16.4.2  yamt         flags |= 1;
    311  1.16.4.2  yamt       }
    312  1.16.4.2  yamt     } else {
    313  1.16.4.2  yamt       if ((flags & 2) == 0) {
    314  1.16.4.2  yamt         lazyVFP3();
    315  1.16.4.2  yamt         flags |= 2;
    316  1.16.4.2  yamt       }
    317  1.16.4.2  yamt     }
    318  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    319  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_ARM32_D0), addr, sizeof(fpreg[0]));
    320  1.16.4.2  yamt   }
    321  1.16.4.2  yamt 
    322  1.16.4.2  yamt   __dso_hidden void lazyVFP1();
    323  1.16.4.2  yamt   __dso_hidden void lazyVFP3();
    324  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    325  1.16.4.2  yamt 
    326  1.16.4.2  yamt private:
    327  1.16.4.2  yamt   uint32_t reg[REGNO_ARM32_SPSR + 1];
    328  1.16.4.2  yamt   uint32_t flags;
    329  1.16.4.2  yamt   uint64_t fpreg[32];
    330  1.16.4.2  yamt };
    331  1.16.4.2  yamt 
    332  1.16.4.2  yamt enum {
    333  1.16.4.2  yamt   DWARF_VAX_R0 = 0,
    334  1.16.4.2  yamt   DWARF_VAX_R15 = 15,
    335  1.16.4.2  yamt   DWARF_VAX_PSW = 16,
    336  1.16.4.2  yamt 
    337  1.16.4.2  yamt   REGNO_VAX_R0 = 0,
    338  1.16.4.2  yamt   REGNO_VAX_R14 = 14,
    339  1.16.4.2  yamt   REGNO_VAX_R15 = 15,
    340  1.16.4.2  yamt   REGNO_VAX_PSW = 16,
    341  1.16.4.2  yamt };
    342  1.16.4.2  yamt 
    343  1.16.4.2  yamt class Registers_vax {
    344  1.16.4.2  yamt public:
    345  1.16.4.2  yamt   enum {
    346  1.16.4.2  yamt     LAST_REGISTER = REGNO_VAX_PSW,
    347  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_VAX_PSW,
    348  1.16.4.2  yamt     RETURN_OFFSET = 0,
    349  1.16.4.2  yamt   };
    350  1.16.4.2  yamt 
    351  1.16.4.2  yamt   __dso_hidden Registers_vax();
    352  1.16.4.2  yamt 
    353  1.16.4.2  yamt   static int dwarf2regno(int num) {
    354  1.16.4.2  yamt     if (num >= DWARF_VAX_R0 && num <= DWARF_VAX_R15)
    355  1.16.4.2  yamt       return REGNO_VAX_R0 + (num - DWARF_VAX_R0);
    356  1.16.4.2  yamt     if (num == DWARF_VAX_PSW)
    357  1.16.4.2  yamt       return REGNO_VAX_PSW;
    358  1.16.4.2  yamt     return LAST_REGISTER + 1;
    359  1.16.4.2  yamt   }
    360  1.16.4.2  yamt 
    361  1.16.4.2  yamt   bool validRegister(int num) const {
    362  1.16.4.2  yamt     return num >= 0 && num <= LAST_RESTORE_REG;
    363  1.16.4.2  yamt   }
    364  1.16.4.2  yamt 
    365  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    366  1.16.4.2  yamt     assert(validRegister(num));
    367  1.16.4.2  yamt     return reg[num];
    368  1.16.4.2  yamt   }
    369  1.16.4.2  yamt 
    370  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    371  1.16.4.2  yamt     assert(validRegister(num));
    372  1.16.4.2  yamt     reg[num] = value;
    373  1.16.4.2  yamt   }
    374  1.16.4.2  yamt 
    375  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_VAX_R15]; }
    376  1.16.4.2  yamt 
    377  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_VAX_R15] = value; }
    378  1.16.4.2  yamt 
    379  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_VAX_R14]; }
    380  1.16.4.2  yamt 
    381  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_VAX_R14] = value; }
    382  1.16.4.2  yamt 
    383  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    384  1.16.4.2  yamt     return false;
    385  1.16.4.2  yamt   }
    386  1.16.4.2  yamt 
    387  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    388  1.16.4.2  yamt   }
    389  1.16.4.2  yamt 
    390  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    391  1.16.4.2  yamt 
    392  1.16.4.2  yamt private:
    393  1.16.4.2  yamt   uint32_t reg[REGNO_VAX_PSW + 1];
    394  1.16.4.2  yamt };
    395  1.16.4.2  yamt 
    396  1.16.4.2  yamt enum {
    397  1.16.4.2  yamt   DWARF_M68K_A0 = 0,
    398  1.16.4.2  yamt   DWARF_M68K_A7 = 7,
    399  1.16.4.2  yamt   DWARF_M68K_D0 = 8,
    400  1.16.4.2  yamt   DWARF_M68K_D7 = 15,
    401  1.16.4.2  yamt   DWARF_M68K_FP0 = 16,
    402  1.16.4.2  yamt   DWARF_M68K_FP7 = 23,
    403  1.16.4.2  yamt   DWARF_M68K_PC = 24,
    404  1.16.4.2  yamt 
    405  1.16.4.2  yamt   REGNO_M68K_A0 = 0,
    406  1.16.4.2  yamt   REGNO_M68K_A7 = 7,
    407  1.16.4.2  yamt   REGNO_M68K_D0 = 8,
    408  1.16.4.2  yamt   REGNO_M68K_D7 = 15,
    409  1.16.4.2  yamt   REGNO_M68K_PC = 16,
    410  1.16.4.2  yamt   REGNO_M68K_FP0 = 17,
    411  1.16.4.2  yamt   REGNO_M68K_FP7 = 24,
    412  1.16.4.2  yamt };
    413  1.16.4.2  yamt 
    414  1.16.4.2  yamt class Registers_M68K {
    415  1.16.4.2  yamt public:
    416  1.16.4.2  yamt   enum {
    417  1.16.4.2  yamt     LAST_REGISTER = REGNO_M68K_FP7,
    418  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_M68K_FP7,
    419  1.16.4.2  yamt     RETURN_OFFSET = 0,
    420  1.16.4.2  yamt   };
    421  1.16.4.2  yamt 
    422  1.16.4.2  yamt   __dso_hidden Registers_M68K();
    423  1.16.4.2  yamt 
    424  1.16.4.2  yamt   static int dwarf2regno(int num) {
    425  1.16.4.2  yamt     if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7)
    426  1.16.4.2  yamt       return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
    427  1.16.4.2  yamt     if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
    428  1.16.4.2  yamt       return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
    429  1.16.4.2  yamt     if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7)
    430  1.16.4.2  yamt       return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0);
    431  1.16.4.2  yamt     if (num == DWARF_M68K_PC)
    432  1.16.4.2  yamt       return REGNO_M68K_PC;
    433  1.16.4.2  yamt     return LAST_REGISTER + 1;
    434  1.16.4.2  yamt   }
    435  1.16.4.2  yamt 
    436  1.16.4.2  yamt   bool validRegister(int num) const {
    437  1.16.4.2  yamt     return num >= 0 && num <= REGNO_M68K_PC;
    438  1.16.4.2  yamt   }
    439  1.16.4.2  yamt 
    440  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    441  1.16.4.2  yamt     assert(validRegister(num));
    442  1.16.4.2  yamt     return reg[num];
    443  1.16.4.2  yamt   }
    444  1.16.4.2  yamt 
    445  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    446  1.16.4.2  yamt     assert(validRegister(num));
    447  1.16.4.2  yamt     reg[num] = value;
    448  1.16.4.2  yamt   }
    449  1.16.4.2  yamt 
    450  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_M68K_PC]; }
    451  1.16.4.2  yamt 
    452  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; }
    453  1.16.4.2  yamt 
    454  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_M68K_A7]; }
    455  1.16.4.2  yamt 
    456  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; }
    457  1.16.4.2  yamt 
    458  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    459  1.16.4.2  yamt     return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7;
    460  1.16.4.2  yamt   }
    461  1.16.4.2  yamt 
    462  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    463  1.16.4.2  yamt     assert(validFloatVectorRegister(num));
    464  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    465  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0]));
    466  1.16.4.2  yamt   }
    467  1.16.4.2  yamt 
    468  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    469  1.16.4.2  yamt 
    470  1.16.4.2  yamt private:
    471  1.16.4.2  yamt   typedef uint32_t fpreg_t[3];
    472  1.16.4.2  yamt 
    473  1.16.4.2  yamt   uint32_t reg[REGNO_M68K_PC + 1];
    474  1.16.4.2  yamt   uint32_t dummy;
    475  1.16.4.2  yamt   fpreg_t fpreg[8];
    476  1.16.4.2  yamt };
    477  1.16.4.2  yamt 
    478  1.16.4.2  yamt enum {
    479  1.16.4.2  yamt   DWARF_SH3_R0 = 0,
    480  1.16.4.2  yamt   DWARF_SH3_R15 = 15,
    481  1.16.4.2  yamt   DWARF_SH3_PC = 16,
    482  1.16.4.2  yamt   DWARF_SH3_PR = 17,
    483  1.16.4.2  yamt 
    484  1.16.4.2  yamt   REGNO_SH3_R0 = 0,
    485  1.16.4.2  yamt   REGNO_SH3_R15 = 15,
    486  1.16.4.2  yamt   REGNO_SH3_PC = 16,
    487  1.16.4.2  yamt   REGNO_SH3_PR = 17,
    488  1.16.4.2  yamt };
    489  1.16.4.2  yamt 
    490  1.16.4.2  yamt class Registers_SH3 {
    491  1.16.4.2  yamt public:
    492  1.16.4.2  yamt   enum {
    493  1.16.4.2  yamt     LAST_REGISTER = REGNO_SH3_PR,
    494  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_SH3_PR,
    495  1.16.4.2  yamt     RETURN_OFFSET = 0,
    496  1.16.4.2  yamt   };
    497  1.16.4.2  yamt 
    498  1.16.4.2  yamt   __dso_hidden Registers_SH3();
    499  1.16.4.2  yamt 
    500  1.16.4.2  yamt   static int dwarf2regno(int num) {
    501  1.16.4.2  yamt     if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
    502  1.16.4.2  yamt       return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
    503  1.16.4.2  yamt     if (num == DWARF_SH3_PC)
    504  1.16.4.2  yamt       return REGNO_SH3_PC;
    505  1.16.4.2  yamt     if (num == DWARF_SH3_PR)
    506  1.16.4.2  yamt       return REGNO_SH3_PR;
    507  1.16.4.2  yamt     return LAST_REGISTER + 1;
    508  1.16.4.2  yamt   }
    509  1.16.4.2  yamt 
    510  1.16.4.2  yamt   bool validRegister(int num) const {
    511  1.16.4.2  yamt     return num >= 0 && num <= REGNO_SH3_PR;
    512  1.16.4.2  yamt   }
    513  1.16.4.2  yamt 
    514  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    515  1.16.4.2  yamt     assert(validRegister(num));
    516  1.16.4.2  yamt     return reg[num];
    517  1.16.4.2  yamt   }
    518  1.16.4.2  yamt 
    519  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    520  1.16.4.2  yamt     assert(validRegister(num));
    521  1.16.4.2  yamt     reg[num] = value;
    522  1.16.4.2  yamt   }
    523  1.16.4.2  yamt 
    524  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
    525  1.16.4.2  yamt 
    526  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
    527  1.16.4.2  yamt 
    528  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
    529  1.16.4.2  yamt 
    530  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
    531  1.16.4.2  yamt 
    532  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const { return false; }
    533  1.16.4.2  yamt 
    534  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {}
    535  1.16.4.2  yamt 
    536  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    537  1.16.4.2  yamt 
    538  1.16.4.2  yamt private:
    539  1.16.4.2  yamt   uint32_t reg[REGNO_SH3_PR + 1];
    540  1.16.4.2  yamt };
    541  1.16.4.2  yamt 
    542  1.16.4.2  yamt enum {
    543  1.16.4.2  yamt   DWARF_SPARC64_R0 = 0,
    544  1.16.4.2  yamt   DWARF_SPARC64_R31 = 31,
    545  1.16.4.2  yamt   DWARF_SPARC64_PC = 32,
    546  1.16.4.2  yamt 
    547  1.16.4.2  yamt   REGNO_SPARC64_R0 = 0,
    548  1.16.4.2  yamt   REGNO_SPARC64_R14 = 14,
    549  1.16.4.2  yamt   REGNO_SPARC64_R15 = 15,
    550  1.16.4.2  yamt   REGNO_SPARC64_R31 = 31,
    551  1.16.4.2  yamt   REGNO_SPARC64_PC = 32,
    552  1.16.4.2  yamt };
    553  1.16.4.2  yamt 
    554  1.16.4.2  yamt class Registers_SPARC64 {
    555  1.16.4.2  yamt public:
    556  1.16.4.2  yamt   enum {
    557  1.16.4.2  yamt     LAST_REGISTER = REGNO_SPARC64_PC,
    558  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_SPARC64_PC,
    559  1.16.4.2  yamt     RETURN_OFFSET = 8,
    560  1.16.4.2  yamt   };
    561  1.16.4.2  yamt   typedef uint64_t reg_t;
    562  1.16.4.2  yamt 
    563  1.16.4.2  yamt   __dso_hidden Registers_SPARC64();
    564  1.16.4.2  yamt 
    565  1.16.4.2  yamt   static int dwarf2regno(int num) {
    566  1.16.4.2  yamt     if (num >= DWARF_SPARC64_R0 && num <= DWARF_SPARC64_R31)
    567  1.16.4.2  yamt       return REGNO_SPARC64_R0 + (num - DWARF_SPARC64_R0);
    568  1.16.4.2  yamt     if (num == DWARF_SPARC64_PC)
    569  1.16.4.2  yamt       return REGNO_SPARC64_PC;
    570  1.16.4.2  yamt     return LAST_REGISTER + 1;
    571  1.16.4.2  yamt   }
    572  1.16.4.2  yamt 
    573  1.16.4.2  yamt   bool validRegister(int num) const {
    574  1.16.4.2  yamt     return num >= 0 && num <= REGNO_SPARC64_PC;
    575  1.16.4.2  yamt   }
    576  1.16.4.2  yamt 
    577  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    578  1.16.4.2  yamt     assert(validRegister(num));
    579  1.16.4.2  yamt     return reg[num];
    580  1.16.4.2  yamt   }
    581  1.16.4.2  yamt 
    582  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    583  1.16.4.2  yamt     assert(validRegister(num));
    584  1.16.4.2  yamt     reg[num] = value;
    585  1.16.4.2  yamt   }
    586  1.16.4.2  yamt 
    587  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_SPARC64_PC]; }
    588  1.16.4.2  yamt 
    589  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_SPARC64_PC] = value; }
    590  1.16.4.2  yamt 
    591  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_SPARC64_R14]; }
    592  1.16.4.2  yamt 
    593  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_SPARC64_R14] = value; }
    594  1.16.4.2  yamt 
    595  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const { return false; }
    596  1.16.4.2  yamt 
    597  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {}
    598  1.16.4.2  yamt 
    599  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    600  1.16.4.2  yamt 
    601  1.16.4.2  yamt private:
    602  1.16.4.2  yamt   uint64_t reg[REGNO_SPARC64_PC + 1];
    603  1.16.4.2  yamt };
    604  1.16.4.2  yamt 
    605  1.16.4.2  yamt enum {
    606  1.16.4.2  yamt   DWARF_SPARC_R0 = 0,
    607  1.16.4.2  yamt   DWARF_SPARC_R31 = 31,
    608  1.16.4.2  yamt   DWARF_SPARC_PC = 32,
    609  1.16.4.2  yamt 
    610  1.16.4.2  yamt   REGNO_SPARC_R0 = 0,
    611  1.16.4.2  yamt   REGNO_SPARC_R14 = 14,
    612  1.16.4.2  yamt   REGNO_SPARC_R15 = 15,
    613  1.16.4.2  yamt   REGNO_SPARC_R31 = 31,
    614  1.16.4.2  yamt   REGNO_SPARC_PC = 32,
    615  1.16.4.2  yamt };
    616  1.16.4.2  yamt 
    617  1.16.4.2  yamt class Registers_SPARC {
    618  1.16.4.2  yamt public:
    619  1.16.4.2  yamt   enum {
    620  1.16.4.2  yamt     LAST_REGISTER = REGNO_SPARC_PC,
    621  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_SPARC_PC,
    622  1.16.4.2  yamt     RETURN_OFFSET = 8,
    623  1.16.4.2  yamt   };
    624  1.16.4.2  yamt   typedef uint32_t reg_t;
    625  1.16.4.2  yamt 
    626  1.16.4.2  yamt   __dso_hidden Registers_SPARC();
    627  1.16.4.2  yamt 
    628  1.16.4.2  yamt   static int dwarf2regno(int num) {
    629  1.16.4.2  yamt     if (num >= DWARF_SPARC_R0 && num <= DWARF_SPARC_R31)
    630  1.16.4.2  yamt       return REGNO_SPARC_R0 + (num - DWARF_SPARC_R0);
    631  1.16.4.2  yamt     if (num == DWARF_SPARC_PC)
    632  1.16.4.2  yamt       return REGNO_SPARC_PC;
    633  1.16.4.2  yamt     return LAST_REGISTER + 1;
    634  1.16.4.2  yamt   }
    635  1.16.4.2  yamt 
    636  1.16.4.2  yamt   bool validRegister(int num) const {
    637  1.16.4.2  yamt     return num >= 0 && num <= REGNO_SPARC_PC;
    638  1.16.4.2  yamt   }
    639  1.16.4.2  yamt 
    640  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    641  1.16.4.2  yamt     assert(validRegister(num));
    642  1.16.4.2  yamt     return reg[num];
    643  1.16.4.2  yamt   }
    644  1.16.4.2  yamt 
    645  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    646  1.16.4.2  yamt     assert(validRegister(num));
    647  1.16.4.2  yamt     reg[num] = value;
    648  1.16.4.2  yamt   }
    649  1.16.4.2  yamt 
    650  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_SPARC_PC]; }
    651  1.16.4.2  yamt 
    652  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_SPARC_PC] = value; }
    653  1.16.4.2  yamt 
    654  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_SPARC_R14]; }
    655  1.16.4.2  yamt 
    656  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_SPARC_R14] = value; }
    657  1.16.4.2  yamt 
    658  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const { return false; }
    659  1.16.4.2  yamt 
    660  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {}
    661  1.16.4.2  yamt 
    662  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    663  1.16.4.2  yamt 
    664  1.16.4.2  yamt private:
    665  1.16.4.2  yamt   uint32_t reg[REGNO_SPARC_PC + 1];
    666  1.16.4.2  yamt };
    667  1.16.4.2  yamt 
    668  1.16.4.2  yamt enum {
    669  1.16.4.2  yamt   DWARF_ALPHA_R0 = 0,
    670  1.16.4.2  yamt   DWARF_ALPHA_R30 = 30,
    671  1.16.4.2  yamt   DWARF_ALPHA_F0 = 32,
    672  1.16.4.2  yamt   DWARF_ALPHA_F30 = 62,
    673  1.16.4.2  yamt 
    674  1.16.4.2  yamt   REGNO_ALPHA_R0 = 0,
    675  1.16.4.2  yamt   REGNO_ALPHA_R26 = 26,
    676  1.16.4.2  yamt   REGNO_ALPHA_R30 = 30,
    677  1.16.4.2  yamt   REGNO_ALPHA_PC = 31,
    678  1.16.4.2  yamt   REGNO_ALPHA_F0 = 32,
    679  1.16.4.2  yamt   REGNO_ALPHA_F30 = 62,
    680  1.16.4.2  yamt };
    681  1.16.4.2  yamt 
    682  1.16.4.2  yamt class Registers_Alpha {
    683  1.16.4.2  yamt public:
    684  1.16.4.2  yamt   enum {
    685  1.16.4.2  yamt     LAST_REGISTER = REGNO_ALPHA_F30,
    686  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_ALPHA_F30,
    687  1.16.4.2  yamt     RETURN_OFFSET = 0,
    688  1.16.4.2  yamt   };
    689  1.16.4.2  yamt   typedef uint32_t reg_t;
    690  1.16.4.2  yamt 
    691  1.16.4.2  yamt   __dso_hidden Registers_Alpha();
    692  1.16.4.2  yamt 
    693  1.16.4.2  yamt   static int dwarf2regno(int num) { return num; }
    694  1.16.4.2  yamt 
    695  1.16.4.2  yamt   bool validRegister(int num) const {
    696  1.16.4.2  yamt     return num >= 0 && num <= REGNO_ALPHA_PC;
    697  1.16.4.2  yamt   }
    698  1.16.4.2  yamt 
    699  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    700  1.16.4.2  yamt     assert(validRegister(num));
    701  1.16.4.2  yamt     return reg[num];
    702  1.16.4.2  yamt   }
    703  1.16.4.2  yamt 
    704  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    705  1.16.4.2  yamt     assert(validRegister(num));
    706  1.16.4.2  yamt     reg[num] = value;
    707  1.16.4.2  yamt   }
    708  1.16.4.2  yamt 
    709  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_ALPHA_PC]; }
    710  1.16.4.2  yamt 
    711  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_ALPHA_PC] = value; }
    712  1.16.4.2  yamt 
    713  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_ALPHA_R30]; }
    714  1.16.4.2  yamt 
    715  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_ALPHA_R30] = value; }
    716  1.16.4.2  yamt 
    717  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    718  1.16.4.2  yamt     return num >= REGNO_ALPHA_F0 && num <= REGNO_ALPHA_F30;
    719  1.16.4.2  yamt   }
    720  1.16.4.2  yamt 
    721  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    722  1.16.4.2  yamt     assert(validFloatVectorRegister(num));
    723  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    724  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_ALPHA_F0), addr, sizeof(fpreg[0]));
    725  1.16.4.2  yamt   }
    726  1.16.4.2  yamt 
    727  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    728  1.16.4.2  yamt 
    729  1.16.4.2  yamt private:
    730  1.16.4.2  yamt   uint64_t reg[REGNO_ALPHA_PC + 1];
    731  1.16.4.2  yamt   uint64_t fpreg[31];
    732  1.16.4.2  yamt };
    733  1.16.4.2  yamt 
    734  1.16.4.2  yamt enum {
    735  1.16.4.2  yamt   DWARF_HPPA_R1 = 1,
    736  1.16.4.2  yamt   DWARF_HPPA_R31 = 31,
    737  1.16.4.2  yamt   DWARF_HPPA_FR4L = 32,
    738  1.16.4.2  yamt   DWARF_HPPA_FR31H = 87,
    739  1.16.4.2  yamt 
    740  1.16.4.2  yamt   REGNO_HPPA_PC = 0,
    741  1.16.4.2  yamt   REGNO_HPPA_R1 = 1,
    742  1.16.4.2  yamt   REGNO_HPPA_R2 = 2,
    743  1.16.4.2  yamt   REGNO_HPPA_R30 = 30,
    744  1.16.4.2  yamt   REGNO_HPPA_R31 = 31,
    745  1.16.4.2  yamt   REGNO_HPPA_FR4L = 32,
    746  1.16.4.2  yamt   REGNO_HPPA_FR31H = 87,
    747  1.16.4.2  yamt };
    748  1.16.4.2  yamt 
    749  1.16.4.2  yamt class Registers_HPPA {
    750  1.16.4.2  yamt public:
    751  1.16.4.2  yamt   enum {
    752  1.16.4.2  yamt     LAST_REGISTER = REGNO_HPPA_FR31H,
    753  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_HPPA_FR31H,
    754  1.16.4.2  yamt     RETURN_OFFSET = -3, // strictly speaking, this is a mask
    755  1.16.4.2  yamt   };
    756  1.16.4.2  yamt 
    757  1.16.4.2  yamt   __dso_hidden Registers_HPPA();
    758  1.16.4.2  yamt 
    759  1.16.4.2  yamt   static int dwarf2regno(int num) {
    760  1.16.4.2  yamt     if (num >= DWARF_HPPA_R1 && num <= DWARF_HPPA_R31)
    761  1.16.4.2  yamt       return REGNO_HPPA_R1 + (num - DWARF_HPPA_R1);
    762  1.16.4.2  yamt     if (num >= DWARF_HPPA_FR4L && num <= DWARF_HPPA_FR31H)
    763  1.16.4.2  yamt       return REGNO_HPPA_FR4L + (num - DWARF_HPPA_FR31H);
    764  1.16.4.2  yamt     return LAST_REGISTER + 1;
    765  1.16.4.2  yamt   }
    766  1.16.4.2  yamt 
    767  1.16.4.2  yamt   bool validRegister(int num) const {
    768  1.16.4.2  yamt     return num >= REGNO_HPPA_PC && num <= REGNO_HPPA_R31;
    769  1.16.4.2  yamt   }
    770  1.16.4.2  yamt 
    771  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    772  1.16.4.2  yamt     assert(validRegister(num));
    773  1.16.4.2  yamt     return reg[num];
    774  1.16.4.2  yamt   }
    775  1.16.4.2  yamt 
    776  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    777  1.16.4.2  yamt     assert(validRegister(num));
    778  1.16.4.2  yamt     reg[num] = value;
    779  1.16.4.2  yamt   }
    780  1.16.4.2  yamt 
    781  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_HPPA_PC]; }
    782  1.16.4.2  yamt 
    783  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_HPPA_PC] = value; }
    784  1.16.4.2  yamt 
    785  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_HPPA_R30]; }
    786  1.16.4.2  yamt 
    787  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_HPPA_R30] = value; }
    788  1.16.4.2  yamt 
    789  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    790  1.16.4.2  yamt     return num >= REGNO_HPPA_FR4L && num <= REGNO_HPPA_FR31H;
    791  1.16.4.2  yamt   }
    792  1.16.4.2  yamt 
    793  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    794  1.16.4.2  yamt     assert(validFloatVectorRegister(num));
    795  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    796  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_HPPA_FR4L), addr, sizeof(fpreg[0]));
    797  1.16.4.2  yamt   }
    798  1.16.4.2  yamt 
    799  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    800  1.16.4.2  yamt 
    801  1.16.4.2  yamt private:
    802  1.16.4.2  yamt   uint32_t reg[REGNO_HPPA_R31 + 1];
    803  1.16.4.2  yamt   uint32_t fpreg[56];
    804  1.16.4.2  yamt };
    805  1.16.4.2  yamt 
    806  1.16.4.2  yamt enum {
    807  1.16.4.2  yamt   DWARF_MIPS_R1 = 0,
    808  1.16.4.2  yamt   DWARF_MIPS_R31 = 31,
    809  1.16.4.2  yamt   DWARF_MIPS_F0 = 32,
    810  1.16.4.2  yamt   DWARF_MIPS_F31 = 63,
    811  1.16.4.2  yamt 
    812  1.16.4.2  yamt   REGNO_MIPS_PC = 0,
    813  1.16.4.2  yamt   REGNO_MIPS_R1 = 0,
    814  1.16.4.2  yamt   REGNO_MIPS_R29 = 29,
    815  1.16.4.2  yamt   REGNO_MIPS_R31 = 31,
    816  1.16.4.2  yamt   REGNO_MIPS_F0 = 33,
    817  1.16.4.2  yamt   REGNO_MIPS_F31 = 64
    818  1.16.4.2  yamt };
    819  1.16.4.2  yamt 
    820  1.16.4.2  yamt class Registers_MIPS {
    821  1.16.4.2  yamt public:
    822  1.16.4.2  yamt   enum {
    823  1.16.4.2  yamt     LAST_REGISTER = REGNO_MIPS_F31,
    824  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_MIPS_F31,
    825  1.16.4.2  yamt     RETURN_OFFSET = 0,
    826  1.16.4.2  yamt   };
    827  1.16.4.2  yamt 
    828  1.16.4.2  yamt   __dso_hidden Registers_MIPS();
    829  1.16.4.2  yamt 
    830  1.16.4.2  yamt   static int dwarf2regno(int num) {
    831  1.16.4.2  yamt     if (num >= DWARF_MIPS_R1 && num <= DWARF_MIPS_R31)
    832  1.16.4.2  yamt       return REGNO_MIPS_R1 + (num - DWARF_MIPS_R1);
    833  1.16.4.2  yamt     if (num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31)
    834  1.16.4.2  yamt       return REGNO_MIPS_F0 + (num - DWARF_MIPS_F0);
    835  1.16.4.2  yamt     return LAST_REGISTER + 1;
    836  1.16.4.2  yamt   }
    837  1.16.4.2  yamt 
    838  1.16.4.2  yamt   bool validRegister(int num) const {
    839  1.16.4.2  yamt     return num >= REGNO_MIPS_PC && num <= REGNO_MIPS_R31;
    840  1.16.4.2  yamt   }
    841  1.16.4.2  yamt 
    842  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    843  1.16.4.2  yamt     assert(validRegister(num));
    844  1.16.4.2  yamt     return reg[num];
    845  1.16.4.2  yamt   }
    846  1.16.4.2  yamt 
    847  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    848  1.16.4.2  yamt     assert(validRegister(num));
    849  1.16.4.2  yamt     reg[num] = value;
    850  1.16.4.2  yamt   }
    851  1.16.4.2  yamt 
    852  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_MIPS_PC]; }
    853  1.16.4.2  yamt 
    854  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_MIPS_PC] = value; }
    855  1.16.4.2  yamt 
    856  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_MIPS_R29]; }
    857  1.16.4.2  yamt 
    858  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_MIPS_R29] = value; }
    859  1.16.4.2  yamt 
    860  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    861  1.16.4.2  yamt     return num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31;
    862  1.16.4.2  yamt   }
    863  1.16.4.2  yamt 
    864  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    865  1.16.4.2  yamt     assert(validFloatVectorRegister(num));
    866  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    867  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_MIPS_F0), addr, sizeof(fpreg[0]));
    868  1.16.4.2  yamt   }
    869  1.16.4.2  yamt 
    870  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    871  1.16.4.2  yamt 
    872  1.16.4.2  yamt private:
    873  1.16.4.2  yamt   uint32_t reg[REGNO_MIPS_R31 + 1];
    874  1.16.4.2  yamt   uint64_t fpreg[32];
    875  1.16.4.2  yamt };
    876  1.16.4.2  yamt 
    877  1.16.4.2  yamt enum {
    878  1.16.4.2  yamt   DWARF_MIPS64_R1 = 0,
    879  1.16.4.2  yamt   DWARF_MIPS64_R31 = 31,
    880  1.16.4.2  yamt   DWARF_MIPS64_F0 = 32,
    881  1.16.4.2  yamt   DWARF_MIPS64_F31 = 63,
    882  1.16.4.2  yamt 
    883  1.16.4.2  yamt   REGNO_MIPS64_PC = 0,
    884  1.16.4.2  yamt   REGNO_MIPS64_R1 = 0,
    885  1.16.4.2  yamt   REGNO_MIPS64_R29 = 29,
    886  1.16.4.2  yamt   REGNO_MIPS64_R31 = 31,
    887  1.16.4.2  yamt   REGNO_MIPS64_F0 = 33,
    888  1.16.4.2  yamt   REGNO_MIPS64_F31 = 64
    889  1.16.4.2  yamt };
    890  1.16.4.2  yamt 
    891  1.16.4.2  yamt class Registers_MIPS64 {
    892  1.16.4.2  yamt public:
    893  1.16.4.2  yamt   enum {
    894  1.16.4.2  yamt     LAST_REGISTER = REGNO_MIPS64_F31,
    895  1.16.4.2  yamt     LAST_RESTORE_REG = REGNO_MIPS64_F31,
    896  1.16.4.2  yamt     RETURN_OFFSET = 0,
    897  1.16.4.2  yamt   };
    898  1.16.4.2  yamt 
    899  1.16.4.2  yamt   __dso_hidden Registers_MIPS64();
    900  1.16.4.2  yamt 
    901  1.16.4.2  yamt   static int dwarf2regno(int num) {
    902  1.16.4.2  yamt     if (num >= DWARF_MIPS64_R1 && num <= DWARF_MIPS64_R31)
    903  1.16.4.2  yamt       return REGNO_MIPS64_R1 + (num - DWARF_MIPS64_R1);
    904  1.16.4.2  yamt     if (num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31)
    905  1.16.4.2  yamt       return REGNO_MIPS64_F0 + (num - DWARF_MIPS64_F0);
    906  1.16.4.2  yamt     return LAST_REGISTER + 1;
    907  1.16.4.2  yamt   }
    908  1.16.4.2  yamt 
    909  1.16.4.2  yamt   bool validRegister(int num) const {
    910  1.16.4.2  yamt     return num >= REGNO_MIPS64_PC && num <= REGNO_MIPS64_R31;
    911  1.16.4.2  yamt   }
    912  1.16.4.2  yamt 
    913  1.16.4.2  yamt   uint64_t getRegister(int num) const {
    914  1.16.4.2  yamt     assert(validRegister(num));
    915  1.16.4.2  yamt     return reg[num];
    916  1.16.4.2  yamt   }
    917  1.16.4.2  yamt 
    918  1.16.4.2  yamt   void setRegister(int num, uint64_t value) {
    919  1.16.4.2  yamt     assert(validRegister(num));
    920  1.16.4.2  yamt     reg[num] = value;
    921  1.16.4.2  yamt   }
    922  1.16.4.2  yamt 
    923  1.16.4.2  yamt   uint64_t getIP() const { return reg[REGNO_MIPS64_PC]; }
    924  1.16.4.2  yamt 
    925  1.16.4.2  yamt   void setIP(uint64_t value) { reg[REGNO_MIPS64_PC] = value; }
    926  1.16.4.2  yamt 
    927  1.16.4.2  yamt   uint64_t getSP() const { return reg[REGNO_MIPS64_R29]; }
    928  1.16.4.2  yamt 
    929  1.16.4.2  yamt   void setSP(uint64_t value) { reg[REGNO_MIPS64_R29] = value; }
    930  1.16.4.2  yamt 
    931  1.16.4.2  yamt   bool validFloatVectorRegister(int num) const {
    932  1.16.4.2  yamt     return num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31;
    933  1.16.4.2  yamt   }
    934  1.16.4.2  yamt 
    935  1.16.4.2  yamt   void copyFloatVectorRegister(int num, uint64_t addr_) {
    936  1.16.4.2  yamt     assert(validFloatVectorRegister(num));
    937  1.16.4.2  yamt     const void *addr = reinterpret_cast<const void *>(addr_);
    938  1.16.4.2  yamt     memcpy(fpreg + (num - REGNO_MIPS64_F0), addr, sizeof(fpreg[0]));
    939  1.16.4.2  yamt   }
    940  1.16.4.2  yamt 
    941  1.16.4.2  yamt   __dso_hidden void jumpto() const __dead;
    942  1.16.4.2  yamt 
    943  1.16.4.2  yamt private:
    944  1.16.4.2  yamt   uint64_t reg[REGNO_MIPS64_R31 + 1];
    945  1.16.4.2  yamt   uint64_t fpreg[32];
    946  1.16.4.2  yamt };
    947  1.16.4.2  yamt 
    948  1.16.4.2  yamt #if __i386__
    949  1.16.4.2  yamt typedef Registers_x86 NativeUnwindRegisters;
    950  1.16.4.2  yamt #elif __x86_64__
    951  1.16.4.2  yamt typedef Registers_x86_64 NativeUnwindRegisters;
    952  1.16.4.2  yamt #elif __powerpc__
    953  1.16.4.2  yamt typedef Registers_ppc32 NativeUnwindRegisters;
    954  1.16.4.2  yamt #elif __arm__
    955  1.16.4.2  yamt typedef Registers_arm32 NativeUnwindRegisters;
    956  1.16.4.2  yamt #elif __vax__
    957  1.16.4.2  yamt typedef Registers_vax NativeUnwindRegisters;
    958  1.16.4.2  yamt #elif __m68k__
    959  1.16.4.2  yamt typedef Registers_M68K NativeUnwindRegisters;
    960  1.16.4.2  yamt #elif __mips_n64 || __mips_n32
    961  1.16.4.2  yamt typedef Registers_MIPS64 NativeUnwindRegisters;
    962  1.16.4.2  yamt #elif __mips__
    963  1.16.4.2  yamt typedef Registers_MIPS NativeUnwindRegisters;
    964  1.16.4.2  yamt #elif __sh3__
    965  1.16.4.2  yamt typedef Registers_SH3 NativeUnwindRegisters;
    966  1.16.4.2  yamt #elif __sparc64__
    967  1.16.4.2  yamt typedef Registers_SPARC64 NativeUnwindRegisters;
    968  1.16.4.2  yamt #elif __sparc__
    969  1.16.4.2  yamt typedef Registers_SPARC NativeUnwindRegisters;
    970  1.16.4.2  yamt #elif __alpha__
    971  1.16.4.2  yamt typedef Registers_Alpha NativeUnwindRegisters;
    972  1.16.4.2  yamt #elif __hppa__
    973  1.16.4.2  yamt typedef Registers_HPPA NativeUnwindRegisters;
    974  1.16.4.2  yamt #endif
    975  1.16.4.2  yamt } // namespace _Unwind
    976  1.16.4.2  yamt 
    977  1.16.4.2  yamt #endif // __REGISTERS_HPP__
    978