1472758f3SLionel Sambuc //===----------------------------- Registers.hpp --------------------------===// 2472758f3SLionel Sambuc // 3472758f3SLionel Sambuc // The LLVM Compiler Infrastructure 4472758f3SLionel Sambuc // 5472758f3SLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open 6472758f3SLionel Sambuc // Source Licenses. See LICENSE.TXT for details. 7472758f3SLionel Sambuc // 8472758f3SLionel Sambuc // 9472758f3SLionel Sambuc // Models register sets for supported processors. 10472758f3SLionel Sambuc // 11472758f3SLionel Sambuc //===----------------------------------------------------------------------===// 12472758f3SLionel Sambuc #ifndef __REGISTERS_HPP__ 13472758f3SLionel Sambuc #define __REGISTERS_HPP__ 14472758f3SLionel Sambuc 15472758f3SLionel Sambuc #include <cassert> 16472758f3SLionel Sambuc #include <cstdint> 17472758f3SLionel Sambuc 18472758f3SLionel Sambuc namespace _Unwind { 19472758f3SLionel Sambuc 20472758f3SLionel Sambuc enum { 21472758f3SLionel Sambuc REGNO_X86_EAX = 0, 22472758f3SLionel Sambuc REGNO_X86_ECX = 1, 23472758f3SLionel Sambuc REGNO_X86_EDX = 2, 24472758f3SLionel Sambuc REGNO_X86_EBX = 3, 25472758f3SLionel Sambuc REGNO_X86_ESP = 4, 26472758f3SLionel Sambuc REGNO_X86_EBP = 5, 27472758f3SLionel Sambuc REGNO_X86_ESI = 6, 28472758f3SLionel Sambuc REGNO_X86_EDI = 7, 29472758f3SLionel Sambuc REGNO_X86_EIP = 8, 30472758f3SLionel Sambuc }; 31472758f3SLionel Sambuc 32472758f3SLionel Sambuc class Registers_x86 { 33472758f3SLionel Sambuc public: 34472758f3SLionel Sambuc enum { 35472758f3SLionel Sambuc LAST_REGISTER = REGNO_X86_EIP, 36b029fb59SBen Gras LAST_RESTORE_REG = REGNO_X86_EIP, 37b029fb59SBen Gras RETURN_OFFSET = 0, 38*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 39472758f3SLionel Sambuc }; 40472758f3SLionel Sambuc 41472758f3SLionel Sambuc __dso_hidden Registers_x86(); 42472758f3SLionel Sambuc dwarf2regno(int num)43472758f3SLionel Sambuc static int dwarf2regno(int num) { return num; } 44472758f3SLionel Sambuc validRegister(int num) const45472758f3SLionel Sambuc bool validRegister(int num) const { 46472758f3SLionel Sambuc return num >= REGNO_X86_EAX && num <= REGNO_X86_EDI; 47472758f3SLionel Sambuc } 48472758f3SLionel Sambuc getRegister(int num) const49472758f3SLionel Sambuc uint32_t getRegister(int num) const { 50472758f3SLionel Sambuc assert(validRegister(num)); 51472758f3SLionel Sambuc return reg[num]; 52472758f3SLionel Sambuc } 53472758f3SLionel Sambuc setRegister(int num,uint32_t value)54472758f3SLionel Sambuc void setRegister(int num, uint32_t value) { 55472758f3SLionel Sambuc assert(validRegister(num)); 56472758f3SLionel Sambuc reg[num] = value; 57472758f3SLionel Sambuc } 58472758f3SLionel Sambuc getIP() const59472758f3SLionel Sambuc uint32_t getIP() const { return reg[REGNO_X86_EIP]; } 60472758f3SLionel Sambuc setIP(uint32_t value)61472758f3SLionel Sambuc void setIP(uint32_t value) { reg[REGNO_X86_EIP] = value; } 62472758f3SLionel Sambuc getSP() const63472758f3SLionel Sambuc uint32_t getSP() const { return reg[REGNO_X86_ESP]; } 64472758f3SLionel Sambuc setSP(uint32_t value)65472758f3SLionel Sambuc void setSP(uint32_t value) { reg[REGNO_X86_ESP] = value; } 66472758f3SLionel Sambuc validFloatVectorRegister(int num) const67472758f3SLionel Sambuc bool validFloatVectorRegister(int num) const { return false; } 68472758f3SLionel Sambuc copyFloatVectorRegister(int num,uint32_t addr)69472758f3SLionel Sambuc void copyFloatVectorRegister(int num, uint32_t addr) { 70472758f3SLionel Sambuc } 71472758f3SLionel Sambuc 72472758f3SLionel Sambuc __dso_hidden void jumpto() const __dead; 73472758f3SLionel Sambuc 74472758f3SLionel Sambuc private: 75472758f3SLionel Sambuc uint32_t reg[REGNO_X86_EIP + 1]; 76472758f3SLionel Sambuc }; 77472758f3SLionel Sambuc 78472758f3SLionel Sambuc enum { 79472758f3SLionel Sambuc REGNO_X86_64_RAX = 0, 80472758f3SLionel Sambuc REGNO_X86_64_RDX = 1, 81472758f3SLionel Sambuc REGNO_X86_64_RCX = 2, 82472758f3SLionel Sambuc REGNO_X86_64_RBX = 3, 83472758f3SLionel Sambuc REGNO_X86_64_RSI = 4, 84472758f3SLionel Sambuc REGNO_X86_64_RDI = 5, 85472758f3SLionel Sambuc REGNO_X86_64_RBP = 6, 86472758f3SLionel Sambuc REGNO_X86_64_RSP = 7, 87472758f3SLionel Sambuc REGNO_X86_64_R8 = 8, 88472758f3SLionel Sambuc REGNO_X86_64_R9 = 9, 89472758f3SLionel Sambuc REGNO_X86_64_R10 = 10, 90472758f3SLionel Sambuc REGNO_X86_64_R11 = 11, 91472758f3SLionel Sambuc REGNO_X86_64_R12 = 12, 92472758f3SLionel Sambuc REGNO_X86_64_R13 = 13, 93472758f3SLionel Sambuc REGNO_X86_64_R14 = 14, 94472758f3SLionel Sambuc REGNO_X86_64_R15 = 15, 95472758f3SLionel Sambuc REGNO_X86_64_RIP = 16, 96472758f3SLionel Sambuc }; 97472758f3SLionel Sambuc 98472758f3SLionel Sambuc class Registers_x86_64 { 99472758f3SLionel Sambuc public: 100472758f3SLionel Sambuc enum { 101472758f3SLionel Sambuc LAST_REGISTER = REGNO_X86_64_RIP, 102b029fb59SBen Gras LAST_RESTORE_REG = REGNO_X86_64_RIP, 103b029fb59SBen Gras RETURN_OFFSET = 0, 104*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 105472758f3SLionel Sambuc }; 106472758f3SLionel Sambuc 107472758f3SLionel Sambuc __dso_hidden Registers_x86_64(); 108472758f3SLionel Sambuc dwarf2regno(int num)109472758f3SLionel Sambuc static int dwarf2regno(int num) { return num; } 110472758f3SLionel Sambuc validRegister(int num) const111472758f3SLionel Sambuc bool validRegister(int num) const { 112472758f3SLionel Sambuc return num >= REGNO_X86_64_RAX && num <= REGNO_X86_64_R15; 113472758f3SLionel Sambuc } 114472758f3SLionel Sambuc getRegister(int num) const115472758f3SLionel Sambuc uint64_t getRegister(int num) const { 116472758f3SLionel Sambuc assert(validRegister(num)); 117472758f3SLionel Sambuc return reg[num]; 118472758f3SLionel Sambuc } 119472758f3SLionel Sambuc setRegister(int num,uint64_t value)120472758f3SLionel Sambuc void setRegister(int num, uint64_t value) { 121472758f3SLionel Sambuc assert(validRegister(num)); 122472758f3SLionel Sambuc reg[num] = value; 123472758f3SLionel Sambuc } 124472758f3SLionel Sambuc getIP() const125472758f3SLionel Sambuc uint64_t getIP() const { return reg[REGNO_X86_64_RIP]; } 126472758f3SLionel Sambuc setIP(uint64_t value)127472758f3SLionel Sambuc void setIP(uint64_t value) { reg[REGNO_X86_64_RIP] = value; } 128472758f3SLionel Sambuc getSP() const129472758f3SLionel Sambuc uint64_t getSP() const { return reg[REGNO_X86_64_RSP]; } 130472758f3SLionel Sambuc setSP(uint64_t value)131472758f3SLionel Sambuc void setSP(uint64_t value) { reg[REGNO_X86_64_RSP] = value; } 132472758f3SLionel Sambuc validFloatVectorRegister(int num) const133472758f3SLionel Sambuc bool validFloatVectorRegister(int num) const { return false; } 134472758f3SLionel Sambuc copyFloatVectorRegister(int num,uint64_t addr)135472758f3SLionel Sambuc void copyFloatVectorRegister(int num, uint64_t addr) { 136472758f3SLionel Sambuc } 137472758f3SLionel Sambuc 138472758f3SLionel Sambuc __dso_hidden void jumpto() const __dead; 139472758f3SLionel Sambuc 140472758f3SLionel Sambuc private: 141472758f3SLionel Sambuc uint64_t reg[REGNO_X86_64_RIP + 1]; 142472758f3SLionel Sambuc }; 143472758f3SLionel Sambuc 144472758f3SLionel Sambuc enum { 145472758f3SLionel Sambuc DWARF_PPC32_R0 = 0, 146472758f3SLionel Sambuc DWARF_PPC32_R31 = 31, 147472758f3SLionel Sambuc DWARF_PPC32_F0 = 32, 148472758f3SLionel Sambuc DWARF_PPC32_F31 = 63, 149472758f3SLionel Sambuc DWARF_PPC32_LR = 65, 150b029fb59SBen Gras DWARF_PPC32_CR = 70, 151b029fb59SBen Gras DWARF_PPC32_V0 = 77, 152b029fb59SBen Gras DWARF_PPC32_V31 = 108, 153b029fb59SBen Gras 154472758f3SLionel Sambuc REGNO_PPC32_R0 = 0, 155b029fb59SBen Gras REGNO_PPC32_R1 = 1, 156472758f3SLionel Sambuc REGNO_PPC32_R31 = 31, 157b029fb59SBen Gras REGNO_PPC32_LR = 32, 158b029fb59SBen Gras REGNO_PPC32_CR = 33, 159b029fb59SBen Gras REGNO_PPC32_SRR0 = 34, 160b029fb59SBen Gras 161472758f3SLionel Sambuc REGNO_PPC32_F0 = REGNO_PPC32_SRR0 + 1, 162472758f3SLionel Sambuc REGNO_PPC32_F31 = REGNO_PPC32_F0 + 31, 163472758f3SLionel Sambuc REGNO_PPC32_V0 = REGNO_PPC32_F31 + 1, 164472758f3SLionel Sambuc REGNO_PPC32_V31 = REGNO_PPC32_V0 + 31, 165472758f3SLionel Sambuc }; 166472758f3SLionel Sambuc 167472758f3SLionel Sambuc class Registers_ppc32 { 168472758f3SLionel Sambuc public: 169472758f3SLionel Sambuc enum { 170472758f3SLionel Sambuc LAST_REGISTER = REGNO_PPC32_V31, 171b029fb59SBen Gras LAST_RESTORE_REG = REGNO_PPC32_V31, 172b029fb59SBen Gras RETURN_OFFSET = 0, 173*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 174472758f3SLionel Sambuc }; 175472758f3SLionel Sambuc 176472758f3SLionel Sambuc __dso_hidden Registers_ppc32(); 177472758f3SLionel Sambuc dwarf2regno(int num)178472758f3SLionel Sambuc static int dwarf2regno(int num) { 179472758f3SLionel Sambuc if (num >= DWARF_PPC32_R0 && num <= DWARF_PPC32_R31) 180472758f3SLionel Sambuc return REGNO_PPC32_R0 + (num - DWARF_PPC32_R0); 181472758f3SLionel Sambuc if (num >= DWARF_PPC32_F0 && num <= DWARF_PPC32_F31) 182472758f3SLionel Sambuc return REGNO_PPC32_F0 + (num - DWARF_PPC32_F0); 183472758f3SLionel Sambuc if (num >= DWARF_PPC32_V0 && num <= DWARF_PPC32_V31) 184472758f3SLionel Sambuc return REGNO_PPC32_V0 + (num - DWARF_PPC32_V0); 185b029fb59SBen Gras switch (num) { 186b029fb59SBen Gras case DWARF_PPC32_LR: 187b029fb59SBen Gras return REGNO_PPC32_LR; 188b029fb59SBen Gras case DWARF_PPC32_CR: 189b029fb59SBen Gras return REGNO_PPC32_CR; 190b029fb59SBen Gras default: 191472758f3SLionel Sambuc return LAST_REGISTER + 1; 192472758f3SLionel Sambuc } 193b029fb59SBen Gras } 194472758f3SLionel Sambuc validRegister(int num) const195472758f3SLionel Sambuc bool validRegister(int num) const { 196472758f3SLionel Sambuc return num >= 0 && num <= LAST_RESTORE_REG; 197472758f3SLionel Sambuc } 198472758f3SLionel Sambuc getRegister(int num) const199472758f3SLionel Sambuc uint64_t getRegister(int num) const { 200472758f3SLionel Sambuc assert(validRegister(num)); 201472758f3SLionel Sambuc return reg[num]; 202472758f3SLionel Sambuc } 203472758f3SLionel Sambuc setRegister(int num,uint64_t value)204472758f3SLionel Sambuc void setRegister(int num, uint64_t value) { 205472758f3SLionel Sambuc assert(validRegister(num)); 206472758f3SLionel Sambuc reg[num] = value; 207472758f3SLionel Sambuc } 208472758f3SLionel Sambuc getIP() const209472758f3SLionel Sambuc uint64_t getIP() const { return reg[REGNO_PPC32_SRR0]; } 210472758f3SLionel Sambuc setIP(uint64_t value)211472758f3SLionel Sambuc void setIP(uint64_t value) { reg[REGNO_PPC32_SRR0] = value; } 212472758f3SLionel Sambuc getSP() const213472758f3SLionel Sambuc uint64_t getSP() const { return reg[REGNO_PPC32_R1]; } 214472758f3SLionel Sambuc setSP(uint64_t value)215472758f3SLionel Sambuc void setSP(uint64_t value) { reg[REGNO_PPC32_R1] = value; } 216472758f3SLionel Sambuc validFloatVectorRegister(int num) const217472758f3SLionel Sambuc bool validFloatVectorRegister(int num) const { 218472758f3SLionel Sambuc return (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31) || 219472758f3SLionel Sambuc (num >= REGNO_PPC32_V0 && num <= REGNO_PPC32_V31); 220472758f3SLionel Sambuc } 221472758f3SLionel Sambuc copyFloatVectorRegister(int num,uint64_t addr_)222472758f3SLionel Sambuc void copyFloatVectorRegister(int num, uint64_t addr_) { 223472758f3SLionel Sambuc const void *addr = reinterpret_cast<const void *>(addr_); 224472758f3SLionel Sambuc if (num >= REGNO_PPC32_F0 && num <= REGNO_PPC32_F31) 225472758f3SLionel Sambuc memcpy(fpreg + (num - REGNO_PPC32_F0), addr, sizeof(fpreg[0])); 226472758f3SLionel Sambuc else 227472758f3SLionel Sambuc memcpy(vecreg + (num - REGNO_PPC32_V0), addr, sizeof(vecreg[0])); 228472758f3SLionel Sambuc } 229472758f3SLionel Sambuc 230472758f3SLionel Sambuc __dso_hidden void jumpto() const __dead; 231472758f3SLionel Sambuc 232472758f3SLionel Sambuc private: 233472758f3SLionel Sambuc struct vecreg_t { 234472758f3SLionel Sambuc uint64_t low, high; 235472758f3SLionel Sambuc }; 236472758f3SLionel Sambuc uint32_t reg[REGNO_PPC32_SRR0 + 1]; 237b029fb59SBen Gras uint32_t dummy; 238472758f3SLionel Sambuc uint64_t fpreg[32]; 239472758f3SLionel Sambuc vecreg_t vecreg[64]; 240472758f3SLionel Sambuc }; 241472758f3SLionel Sambuc 242b029fb59SBen Gras enum { 243*0a6a1f1dSLionel Sambuc DWARF_AARCH64_X0 = 0, 244*0a6a1f1dSLionel Sambuc DWARF_AARCH64_X30 = 30, 245*0a6a1f1dSLionel Sambuc DWARF_AARCH64_SP = 31, 246*0a6a1f1dSLionel Sambuc DWARF_AARCH64_ELR_MODE = 33, 247*0a6a1f1dSLionel Sambuc DWARF_AARCH64_V0 = 64, 248*0a6a1f1dSLionel Sambuc DWARF_AARCH64_V31 = 95, 249*0a6a1f1dSLionel Sambuc 250*0a6a1f1dSLionel Sambuc REGNO_AARCH64_X0 = 0, 251*0a6a1f1dSLionel Sambuc REGNO_AARCH64_X30 = 30, 252*0a6a1f1dSLionel Sambuc REGNO_AARCH64_SP = 31, 253*0a6a1f1dSLionel Sambuc REGNO_AARCH64_ELR_MODE = 32, 254*0a6a1f1dSLionel Sambuc REGNO_AARCH64_V0 = 33, 255*0a6a1f1dSLionel Sambuc REGNO_AARCH64_V31 = 64, 256*0a6a1f1dSLionel Sambuc }; 257*0a6a1f1dSLionel Sambuc 258*0a6a1f1dSLionel Sambuc class Registers_aarch64 { 259*0a6a1f1dSLionel Sambuc public: 260*0a6a1f1dSLionel Sambuc enum { 261*0a6a1f1dSLionel Sambuc LAST_RESTORE_REG = REGNO_AARCH64_V31, 262*0a6a1f1dSLionel Sambuc LAST_REGISTER = REGNO_AARCH64_V31, 263*0a6a1f1dSLionel Sambuc RETURN_OFFSET = 0, 264*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 265*0a6a1f1dSLionel Sambuc }; 266*0a6a1f1dSLionel Sambuc 267*0a6a1f1dSLionel Sambuc __dso_hidden Registers_aarch64(); 268*0a6a1f1dSLionel Sambuc dwarf2regno(int num)269*0a6a1f1dSLionel Sambuc static int dwarf2regno(int num) { 270*0a6a1f1dSLionel Sambuc if (num >= DWARF_AARCH64_X0 && num <= DWARF_AARCH64_X30) 271*0a6a1f1dSLionel Sambuc return REGNO_AARCH64_X0 + (num - DWARF_AARCH64_X0); 272*0a6a1f1dSLionel Sambuc if (num == DWARF_AARCH64_SP) 273*0a6a1f1dSLionel Sambuc return REGNO_AARCH64_SP; 274*0a6a1f1dSLionel Sambuc if (num == DWARF_AARCH64_ELR_MODE) 275*0a6a1f1dSLionel Sambuc return REGNO_AARCH64_ELR_MODE; 276*0a6a1f1dSLionel Sambuc if (num >= DWARF_AARCH64_V0 && num <= DWARF_AARCH64_V31) 277*0a6a1f1dSLionel Sambuc return REGNO_AARCH64_V0 + (num - DWARF_AARCH64_V0); 278*0a6a1f1dSLionel Sambuc return LAST_REGISTER + 1; 279*0a6a1f1dSLionel Sambuc } 280*0a6a1f1dSLionel Sambuc validRegister(int num) const281*0a6a1f1dSLionel Sambuc bool validRegister(int num) const { 282*0a6a1f1dSLionel Sambuc return num >= 0 && num <= LAST_RESTORE_REG; 283*0a6a1f1dSLionel Sambuc } 284*0a6a1f1dSLionel Sambuc getRegister(int num) const285*0a6a1f1dSLionel Sambuc uint64_t getRegister(int num) const { 286*0a6a1f1dSLionel Sambuc assert(validRegister(num)); 287*0a6a1f1dSLionel Sambuc return reg[num]; 288*0a6a1f1dSLionel Sambuc } 289*0a6a1f1dSLionel Sambuc setRegister(int num,uint64_t value)290*0a6a1f1dSLionel Sambuc void setRegister(int num, uint64_t value) { 291*0a6a1f1dSLionel Sambuc assert(validRegister(num)); 292*0a6a1f1dSLionel Sambuc reg[num] = value; 293*0a6a1f1dSLionel Sambuc } 294*0a6a1f1dSLionel Sambuc getIP() const295*0a6a1f1dSLionel Sambuc uint64_t getIP() const { return reg[REGNO_AARCH64_X30]; } 296*0a6a1f1dSLionel Sambuc setIP(uint64_t value)297*0a6a1f1dSLionel Sambuc void setIP(uint64_t value) { reg[REGNO_AARCH64_X30] = value; } 298*0a6a1f1dSLionel Sambuc getSP() const299*0a6a1f1dSLionel Sambuc uint64_t getSP() const { return reg[REGNO_AARCH64_SP]; } 300*0a6a1f1dSLionel Sambuc setSP(uint64_t value)301*0a6a1f1dSLionel Sambuc void setSP(uint64_t value) { reg[REGNO_AARCH64_SP] = value; } 302*0a6a1f1dSLionel Sambuc validFloatVectorRegister(int num) const303*0a6a1f1dSLionel Sambuc bool validFloatVectorRegister(int num) const { 304*0a6a1f1dSLionel Sambuc return (num >= REGNO_AARCH64_V0 && num <= REGNO_AARCH64_V31); 305*0a6a1f1dSLionel Sambuc } 306*0a6a1f1dSLionel Sambuc copyFloatVectorRegister(int num,uint64_t addr_)307*0a6a1f1dSLionel Sambuc void copyFloatVectorRegister(int num, uint64_t addr_) { 308*0a6a1f1dSLionel Sambuc const void *addr = reinterpret_cast<const void *>(addr_); 309*0a6a1f1dSLionel Sambuc memcpy(vecreg + (num - REGNO_AARCH64_V0), addr, sizeof(vecreg[0])); 310*0a6a1f1dSLionel Sambuc } 311*0a6a1f1dSLionel Sambuc 312*0a6a1f1dSLionel Sambuc __dso_hidden void jumpto() const __dead; 313*0a6a1f1dSLionel Sambuc 314*0a6a1f1dSLionel Sambuc private: 315*0a6a1f1dSLionel Sambuc struct vecreg_t { 316*0a6a1f1dSLionel Sambuc uint64_t low, high; 317*0a6a1f1dSLionel Sambuc }; 318*0a6a1f1dSLionel Sambuc uint64_t reg[REGNO_AARCH64_ELR_MODE + 1]; 319*0a6a1f1dSLionel Sambuc vecreg_t vecreg[32]; 320*0a6a1f1dSLionel Sambuc }; 321*0a6a1f1dSLionel Sambuc 322*0a6a1f1dSLionel Sambuc enum { 323b029fb59SBen Gras DWARF_ARM32_R0 = 0, 324b029fb59SBen Gras DWARF_ARM32_R15 = 15, 325b029fb59SBen Gras DWARF_ARM32_SPSR = 128, 326b029fb59SBen Gras DWARF_ARM32_OLD_S0 = 64, 327b029fb59SBen Gras DWARF_ARM32_OLD_S31 = 91, 328b029fb59SBen Gras DWARF_ARM32_D0 = 256, 329b029fb59SBen Gras DWARF_ARM32_D31 = 287, 330b029fb59SBen Gras REGNO_ARM32_R0 = 0, 331b029fb59SBen Gras REGNO_ARM32_SP = 13, 332b029fb59SBen Gras REGNO_ARM32_R15 = 15, 333b029fb59SBen Gras REGNO_ARM32_SPSR = 16, 334b029fb59SBen Gras REGNO_ARM32_D0 = 17, 335b029fb59SBen Gras REGNO_ARM32_D15 = 32, 336b029fb59SBen Gras REGNO_ARM32_D31 = 48, 337b029fb59SBen Gras }; 338b029fb59SBen Gras 339b029fb59SBen Gras class Registers_arm32 { 340b029fb59SBen Gras public: 341b029fb59SBen Gras enum { 342b029fb59SBen Gras LAST_REGISTER = REGNO_ARM32_D31, 343b029fb59SBen Gras LAST_RESTORE_REG = REGNO_ARM32_D31, 344b029fb59SBen Gras RETURN_OFFSET = 0, 345*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 346b029fb59SBen Gras }; 347b029fb59SBen Gras 348b029fb59SBen Gras __dso_hidden Registers_arm32(); 349b029fb59SBen Gras dwarf2regno(int num)350b029fb59SBen Gras static int dwarf2regno(int num) { 351b029fb59SBen Gras if (num >= DWARF_ARM32_R0 && num <= DWARF_ARM32_R15) 352b029fb59SBen Gras return REGNO_ARM32_R0 + (num - DWARF_ARM32_R0); 353b029fb59SBen Gras if (num == DWARF_ARM32_SPSR) 354b029fb59SBen Gras return REGNO_ARM32_SPSR; 355b029fb59SBen Gras if (num >= DWARF_ARM32_D0 && num <= DWARF_ARM32_D31) 356b029fb59SBen Gras return REGNO_ARM32_D0 + (num - DWARF_ARM32_D0); 357b029fb59SBen Gras if (num >= DWARF_ARM32_OLD_S0 && num <= DWARF_ARM32_OLD_S31) { 358b029fb59SBen Gras assert(num % 2 == 0); 359b029fb59SBen Gras return REGNO_ARM32_D0 + (num - DWARF_ARM32_OLD_S0) / 2; 360b029fb59SBen Gras } 361b029fb59SBen Gras return LAST_REGISTER + 1; 362b029fb59SBen Gras } 363b029fb59SBen Gras validRegister(int num) const364b029fb59SBen Gras bool validRegister(int num) const { 365b029fb59SBen Gras return num >= 0 && num <= REGNO_ARM32_SPSR; 366b029fb59SBen Gras } 367b029fb59SBen Gras getRegister(int num) const368b029fb59SBen Gras uint64_t getRegister(int num) const { 369b029fb59SBen Gras assert(validRegister(num)); 370b029fb59SBen Gras return reg[num]; 371b029fb59SBen Gras } 372b029fb59SBen Gras setRegister(int num,uint64_t value)373b029fb59SBen Gras void setRegister(int num, uint64_t value) { 374b029fb59SBen Gras assert(validRegister(num)); 375b029fb59SBen Gras reg[num] = value; 376b029fb59SBen Gras } 377b029fb59SBen Gras getIP() const378b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_ARM32_R15]; } 379b029fb59SBen Gras setIP(uint64_t value)380b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_ARM32_R15] = value; } 381b029fb59SBen Gras getSP() const382b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_ARM32_SP]; } 383b029fb59SBen Gras setSP(uint64_t value)384b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_ARM32_SP] = value; } 385b029fb59SBen Gras validFloatVectorRegister(int num) const386b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 387b029fb59SBen Gras return (num >= REGNO_ARM32_D0 && num <= REGNO_ARM32_D31); 388b029fb59SBen Gras } 389b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)390b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 391b029fb59SBen Gras if (num <= REGNO_ARM32_D15) { 392b029fb59SBen Gras if ((flags & 1) == 0) { 393b029fb59SBen Gras lazyVFP1(); 394b029fb59SBen Gras flags |= 1; 395b029fb59SBen Gras } 396b029fb59SBen Gras } else { 397b029fb59SBen Gras if ((flags & 2) == 0) { 398b029fb59SBen Gras lazyVFP3(); 399b029fb59SBen Gras flags |= 2; 400b029fb59SBen Gras } 401b029fb59SBen Gras } 402b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 403b029fb59SBen Gras memcpy(fpreg + (num - REGNO_ARM32_D0), addr, sizeof(fpreg[0])); 404b029fb59SBen Gras } 405b029fb59SBen Gras 406b029fb59SBen Gras __dso_hidden void lazyVFP1(); 407b029fb59SBen Gras __dso_hidden void lazyVFP3(); 408b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 409b029fb59SBen Gras 410b029fb59SBen Gras private: 411b029fb59SBen Gras uint32_t reg[REGNO_ARM32_SPSR + 1]; 412b029fb59SBen Gras uint32_t flags; 413b029fb59SBen Gras uint64_t fpreg[32]; 414b029fb59SBen Gras }; 415b029fb59SBen Gras 416b029fb59SBen Gras enum { 417b029fb59SBen Gras DWARF_VAX_R0 = 0, 418b029fb59SBen Gras DWARF_VAX_R15 = 15, 419b029fb59SBen Gras DWARF_VAX_PSW = 16, 420b029fb59SBen Gras 421b029fb59SBen Gras REGNO_VAX_R0 = 0, 422b029fb59SBen Gras REGNO_VAX_R14 = 14, 423b029fb59SBen Gras REGNO_VAX_R15 = 15, 424b029fb59SBen Gras REGNO_VAX_PSW = 16, 425b029fb59SBen Gras }; 426b029fb59SBen Gras 427b029fb59SBen Gras class Registers_vax { 428b029fb59SBen Gras public: 429b029fb59SBen Gras enum { 430b029fb59SBen Gras LAST_REGISTER = REGNO_VAX_PSW, 431b029fb59SBen Gras LAST_RESTORE_REG = REGNO_VAX_PSW, 432b029fb59SBen Gras RETURN_OFFSET = 0, 433*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 434b029fb59SBen Gras }; 435b029fb59SBen Gras 436b029fb59SBen Gras __dso_hidden Registers_vax(); 437b029fb59SBen Gras dwarf2regno(int num)438b029fb59SBen Gras static int dwarf2regno(int num) { 439b029fb59SBen Gras if (num >= DWARF_VAX_R0 && num <= DWARF_VAX_R15) 440b029fb59SBen Gras return REGNO_VAX_R0 + (num - DWARF_VAX_R0); 441b029fb59SBen Gras if (num == DWARF_VAX_PSW) 442b029fb59SBen Gras return REGNO_VAX_PSW; 443b029fb59SBen Gras return LAST_REGISTER + 1; 444b029fb59SBen Gras } 445b029fb59SBen Gras validRegister(int num) const446b029fb59SBen Gras bool validRegister(int num) const { 447b029fb59SBen Gras return num >= 0 && num <= LAST_RESTORE_REG; 448b029fb59SBen Gras } 449b029fb59SBen Gras getRegister(int num) const450b029fb59SBen Gras uint64_t getRegister(int num) const { 451b029fb59SBen Gras assert(validRegister(num)); 452b029fb59SBen Gras return reg[num]; 453b029fb59SBen Gras } 454b029fb59SBen Gras setRegister(int num,uint64_t value)455b029fb59SBen Gras void setRegister(int num, uint64_t value) { 456b029fb59SBen Gras assert(validRegister(num)); 457b029fb59SBen Gras reg[num] = value; 458b029fb59SBen Gras } 459b029fb59SBen Gras getIP() const460b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_VAX_R15]; } 461b029fb59SBen Gras setIP(uint64_t value)462b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_VAX_R15] = value; } 463b029fb59SBen Gras getSP() const464b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_VAX_R14]; } 465b029fb59SBen Gras setSP(uint64_t value)466b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_VAX_R14] = value; } 467b029fb59SBen Gras validFloatVectorRegister(int num) const468b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 469b029fb59SBen Gras return false; 470b029fb59SBen Gras } 471b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)472b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 473b029fb59SBen Gras } 474b029fb59SBen Gras 475b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 476b029fb59SBen Gras 477b029fb59SBen Gras private: 478b029fb59SBen Gras uint32_t reg[REGNO_VAX_PSW + 1]; 479b029fb59SBen Gras }; 480b029fb59SBen Gras 481b029fb59SBen Gras enum { 482b029fb59SBen Gras DWARF_M68K_A0 = 0, 483b029fb59SBen Gras DWARF_M68K_A7 = 7, 484b029fb59SBen Gras DWARF_M68K_D0 = 8, 485b029fb59SBen Gras DWARF_M68K_D7 = 15, 486b029fb59SBen Gras DWARF_M68K_FP0 = 16, 487b029fb59SBen Gras DWARF_M68K_FP7 = 23, 488b029fb59SBen Gras DWARF_M68K_PC = 24, 489b029fb59SBen Gras 490b029fb59SBen Gras REGNO_M68K_A0 = 0, 491b029fb59SBen Gras REGNO_M68K_A7 = 7, 492b029fb59SBen Gras REGNO_M68K_D0 = 8, 493b029fb59SBen Gras REGNO_M68K_D7 = 15, 494b029fb59SBen Gras REGNO_M68K_PC = 16, 495b029fb59SBen Gras REGNO_M68K_FP0 = 17, 496b029fb59SBen Gras REGNO_M68K_FP7 = 24, 497b029fb59SBen Gras }; 498b029fb59SBen Gras 499b029fb59SBen Gras class Registers_M68K { 500b029fb59SBen Gras public: 501b029fb59SBen Gras enum { 502b029fb59SBen Gras LAST_REGISTER = REGNO_M68K_FP7, 503b029fb59SBen Gras LAST_RESTORE_REG = REGNO_M68K_FP7, 504b029fb59SBen Gras RETURN_OFFSET = 0, 505*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 506b029fb59SBen Gras }; 507b029fb59SBen Gras 508b029fb59SBen Gras __dso_hidden Registers_M68K(); 509b029fb59SBen Gras dwarf2regno(int num)510b029fb59SBen Gras static int dwarf2regno(int num) { 511b029fb59SBen Gras if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7) 512b029fb59SBen Gras return REGNO_M68K_A0 + (num - DWARF_M68K_A0); 513b029fb59SBen Gras if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7) 514b029fb59SBen Gras return REGNO_M68K_D0 + (num - DWARF_M68K_D0); 515b029fb59SBen Gras if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7) 516b029fb59SBen Gras return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0); 517b029fb59SBen Gras if (num == DWARF_M68K_PC) 518b029fb59SBen Gras return REGNO_M68K_PC; 519b029fb59SBen Gras return LAST_REGISTER + 1; 520b029fb59SBen Gras } 521b029fb59SBen Gras validRegister(int num) const522b029fb59SBen Gras bool validRegister(int num) const { 523b029fb59SBen Gras return num >= 0 && num <= REGNO_M68K_PC; 524b029fb59SBen Gras } 525b029fb59SBen Gras getRegister(int num) const526b029fb59SBen Gras uint64_t getRegister(int num) const { 527b029fb59SBen Gras assert(validRegister(num)); 528b029fb59SBen Gras return reg[num]; 529b029fb59SBen Gras } 530b029fb59SBen Gras setRegister(int num,uint64_t value)531b029fb59SBen Gras void setRegister(int num, uint64_t value) { 532b029fb59SBen Gras assert(validRegister(num)); 533b029fb59SBen Gras reg[num] = value; 534b029fb59SBen Gras } 535b029fb59SBen Gras getIP() const536b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_M68K_PC]; } 537b029fb59SBen Gras setIP(uint64_t value)538b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; } 539b029fb59SBen Gras getSP() const540b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_M68K_A7]; } 541b029fb59SBen Gras setSP(uint64_t value)542b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; } 543b029fb59SBen Gras validFloatVectorRegister(int num) const544b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 545b029fb59SBen Gras return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7; 546b029fb59SBen Gras } 547b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)548b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 549b029fb59SBen Gras assert(validFloatVectorRegister(num)); 550b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 551b029fb59SBen Gras memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0])); 552b029fb59SBen Gras } 553b029fb59SBen Gras 554b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 555b029fb59SBen Gras 556b029fb59SBen Gras private: 557b029fb59SBen Gras typedef uint32_t fpreg_t[3]; 558b029fb59SBen Gras 559b029fb59SBen Gras uint32_t reg[REGNO_M68K_PC + 1]; 560b029fb59SBen Gras uint32_t dummy; 561b029fb59SBen Gras fpreg_t fpreg[8]; 562b029fb59SBen Gras }; 563b029fb59SBen Gras 564b029fb59SBen Gras enum { 565b029fb59SBen Gras DWARF_SH3_R0 = 0, 566b029fb59SBen Gras DWARF_SH3_R15 = 15, 567b029fb59SBen Gras DWARF_SH3_PC = 16, 568b029fb59SBen Gras DWARF_SH3_PR = 17, 569b029fb59SBen Gras 570b029fb59SBen Gras REGNO_SH3_R0 = 0, 571b029fb59SBen Gras REGNO_SH3_R15 = 15, 572b029fb59SBen Gras REGNO_SH3_PC = 16, 573b029fb59SBen Gras REGNO_SH3_PR = 17, 574b029fb59SBen Gras }; 575b029fb59SBen Gras 576b029fb59SBen Gras class Registers_SH3 { 577b029fb59SBen Gras public: 578b029fb59SBen Gras enum { 579b029fb59SBen Gras LAST_REGISTER = REGNO_SH3_PR, 580b029fb59SBen Gras LAST_RESTORE_REG = REGNO_SH3_PR, 581b029fb59SBen Gras RETURN_OFFSET = 0, 582*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 583b029fb59SBen Gras }; 584b029fb59SBen Gras 585b029fb59SBen Gras __dso_hidden Registers_SH3(); 586b029fb59SBen Gras dwarf2regno(int num)587b029fb59SBen Gras static int dwarf2regno(int num) { 588b029fb59SBen Gras if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15) 589b029fb59SBen Gras return REGNO_SH3_R0 + (num - DWARF_SH3_R0); 590b029fb59SBen Gras if (num == DWARF_SH3_PC) 591b029fb59SBen Gras return REGNO_SH3_PC; 592b029fb59SBen Gras if (num == DWARF_SH3_PR) 593b029fb59SBen Gras return REGNO_SH3_PR; 594b029fb59SBen Gras return LAST_REGISTER + 1; 595b029fb59SBen Gras } 596b029fb59SBen Gras validRegister(int num) const597b029fb59SBen Gras bool validRegister(int num) const { 598b029fb59SBen Gras return num >= 0 && num <= REGNO_SH3_PR; 599b029fb59SBen Gras } 600b029fb59SBen Gras getRegister(int num) const601b029fb59SBen Gras uint64_t getRegister(int num) const { 602b029fb59SBen Gras assert(validRegister(num)); 603b029fb59SBen Gras return reg[num]; 604b029fb59SBen Gras } 605b029fb59SBen Gras setRegister(int num,uint64_t value)606b029fb59SBen Gras void setRegister(int num, uint64_t value) { 607b029fb59SBen Gras assert(validRegister(num)); 608b029fb59SBen Gras reg[num] = value; 609b029fb59SBen Gras } 610b029fb59SBen Gras getIP() const611b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_SH3_PC]; } 612b029fb59SBen Gras setIP(uint64_t value)613b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; } 614b029fb59SBen Gras getSP() const615b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_SH3_R15]; } 616b029fb59SBen Gras setSP(uint64_t value)617b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; } 618b029fb59SBen Gras validFloatVectorRegister(int num) const619b029fb59SBen Gras bool validFloatVectorRegister(int num) const { return false; } 620b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)621b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) {} 622b029fb59SBen Gras 623b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 624b029fb59SBen Gras 625b029fb59SBen Gras private: 626b029fb59SBen Gras uint32_t reg[REGNO_SH3_PR + 1]; 627b029fb59SBen Gras }; 628b029fb59SBen Gras 629b029fb59SBen Gras enum { 630b029fb59SBen Gras DWARF_SPARC64_R0 = 0, 631b029fb59SBen Gras DWARF_SPARC64_R31 = 31, 632b029fb59SBen Gras DWARF_SPARC64_PC = 32, 633b029fb59SBen Gras 634b029fb59SBen Gras REGNO_SPARC64_R0 = 0, 635b029fb59SBen Gras REGNO_SPARC64_R14 = 14, 636b029fb59SBen Gras REGNO_SPARC64_R15 = 15, 637b029fb59SBen Gras REGNO_SPARC64_R31 = 31, 638b029fb59SBen Gras REGNO_SPARC64_PC = 32, 639b029fb59SBen Gras }; 640b029fb59SBen Gras 641b029fb59SBen Gras class Registers_SPARC64 { 642b029fb59SBen Gras public: 643b029fb59SBen Gras enum { 644b029fb59SBen Gras LAST_REGISTER = REGNO_SPARC64_PC, 645b029fb59SBen Gras LAST_RESTORE_REG = REGNO_SPARC64_PC, 646b029fb59SBen Gras RETURN_OFFSET = 8, 647*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 648b029fb59SBen Gras }; 649b029fb59SBen Gras typedef uint64_t reg_t; 650b029fb59SBen Gras 651b029fb59SBen Gras __dso_hidden Registers_SPARC64(); 652b029fb59SBen Gras dwarf2regno(int num)653b029fb59SBen Gras static int dwarf2regno(int num) { 654b029fb59SBen Gras if (num >= DWARF_SPARC64_R0 && num <= DWARF_SPARC64_R31) 655b029fb59SBen Gras return REGNO_SPARC64_R0 + (num - DWARF_SPARC64_R0); 656b029fb59SBen Gras if (num == DWARF_SPARC64_PC) 657b029fb59SBen Gras return REGNO_SPARC64_PC; 658b029fb59SBen Gras return LAST_REGISTER + 1; 659b029fb59SBen Gras } 660b029fb59SBen Gras validRegister(int num) const661b029fb59SBen Gras bool validRegister(int num) const { 662b029fb59SBen Gras return num >= 0 && num <= REGNO_SPARC64_PC; 663b029fb59SBen Gras } 664b029fb59SBen Gras getRegister(int num) const665b029fb59SBen Gras uint64_t getRegister(int num) const { 666b029fb59SBen Gras assert(validRegister(num)); 667b029fb59SBen Gras return reg[num]; 668b029fb59SBen Gras } 669b029fb59SBen Gras setRegister(int num,uint64_t value)670b029fb59SBen Gras void setRegister(int num, uint64_t value) { 671b029fb59SBen Gras assert(validRegister(num)); 672b029fb59SBen Gras reg[num] = value; 673b029fb59SBen Gras } 674b029fb59SBen Gras getIP() const675b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_SPARC64_PC]; } 676b029fb59SBen Gras setIP(uint64_t value)677b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_SPARC64_PC] = value; } 678b029fb59SBen Gras getSP() const679b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_SPARC64_R14]; } 680b029fb59SBen Gras setSP(uint64_t value)681b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_SPARC64_R14] = value; } 682b029fb59SBen Gras validFloatVectorRegister(int num) const683b029fb59SBen Gras bool validFloatVectorRegister(int num) const { return false; } 684b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)685b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) {} 686b029fb59SBen Gras 687b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 688b029fb59SBen Gras 689b029fb59SBen Gras private: 690b029fb59SBen Gras uint64_t reg[REGNO_SPARC64_PC + 1]; 691b029fb59SBen Gras }; 692b029fb59SBen Gras 693b029fb59SBen Gras enum { 694b029fb59SBen Gras DWARF_SPARC_R0 = 0, 695b029fb59SBen Gras DWARF_SPARC_R31 = 31, 696b029fb59SBen Gras DWARF_SPARC_PC = 32, 697b029fb59SBen Gras 698b029fb59SBen Gras REGNO_SPARC_R0 = 0, 699b029fb59SBen Gras REGNO_SPARC_R14 = 14, 700b029fb59SBen Gras REGNO_SPARC_R15 = 15, 701b029fb59SBen Gras REGNO_SPARC_R31 = 31, 702b029fb59SBen Gras REGNO_SPARC_PC = 32, 703b029fb59SBen Gras }; 704b029fb59SBen Gras 705b029fb59SBen Gras class Registers_SPARC { 706b029fb59SBen Gras public: 707b029fb59SBen Gras enum { 708b029fb59SBen Gras LAST_REGISTER = REGNO_SPARC_PC, 709b029fb59SBen Gras LAST_RESTORE_REG = REGNO_SPARC_PC, 710b029fb59SBen Gras RETURN_OFFSET = 8, 711*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 712b029fb59SBen Gras }; 713b029fb59SBen Gras typedef uint32_t reg_t; 714b029fb59SBen Gras 715b029fb59SBen Gras __dso_hidden Registers_SPARC(); 716b029fb59SBen Gras dwarf2regno(int num)717b029fb59SBen Gras static int dwarf2regno(int num) { 718b029fb59SBen Gras if (num >= DWARF_SPARC_R0 && num <= DWARF_SPARC_R31) 719b029fb59SBen Gras return REGNO_SPARC_R0 + (num - DWARF_SPARC_R0); 720b029fb59SBen Gras if (num == DWARF_SPARC_PC) 721b029fb59SBen Gras return REGNO_SPARC_PC; 722b029fb59SBen Gras return LAST_REGISTER + 1; 723b029fb59SBen Gras } 724b029fb59SBen Gras validRegister(int num) const725b029fb59SBen Gras bool validRegister(int num) const { 726b029fb59SBen Gras return num >= 0 && num <= REGNO_SPARC_PC; 727b029fb59SBen Gras } 728b029fb59SBen Gras getRegister(int num) const729b029fb59SBen Gras uint64_t getRegister(int num) const { 730b029fb59SBen Gras assert(validRegister(num)); 731b029fb59SBen Gras return reg[num]; 732b029fb59SBen Gras } 733b029fb59SBen Gras setRegister(int num,uint64_t value)734b029fb59SBen Gras void setRegister(int num, uint64_t value) { 735b029fb59SBen Gras assert(validRegister(num)); 736b029fb59SBen Gras reg[num] = value; 737b029fb59SBen Gras } 738b029fb59SBen Gras getIP() const739b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_SPARC_PC]; } 740b029fb59SBen Gras setIP(uint64_t value)741b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_SPARC_PC] = value; } 742b029fb59SBen Gras getSP() const743b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_SPARC_R14]; } 744b029fb59SBen Gras setSP(uint64_t value)745b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_SPARC_R14] = value; } 746b029fb59SBen Gras validFloatVectorRegister(int num) const747b029fb59SBen Gras bool validFloatVectorRegister(int num) const { return false; } 748b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)749b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) {} 750b029fb59SBen Gras 751b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 752b029fb59SBen Gras 753b029fb59SBen Gras private: 754b029fb59SBen Gras uint32_t reg[REGNO_SPARC_PC + 1]; 755b029fb59SBen Gras }; 756b029fb59SBen Gras 757b029fb59SBen Gras enum { 758b029fb59SBen Gras DWARF_ALPHA_R0 = 0, 759b029fb59SBen Gras DWARF_ALPHA_R30 = 30, 760b029fb59SBen Gras DWARF_ALPHA_F0 = 32, 761b029fb59SBen Gras DWARF_ALPHA_F30 = 62, 762b029fb59SBen Gras 763b029fb59SBen Gras REGNO_ALPHA_R0 = 0, 764b029fb59SBen Gras REGNO_ALPHA_R26 = 26, 765b029fb59SBen Gras REGNO_ALPHA_R30 = 30, 766b029fb59SBen Gras REGNO_ALPHA_PC = 31, 767b029fb59SBen Gras REGNO_ALPHA_F0 = 32, 768b029fb59SBen Gras REGNO_ALPHA_F30 = 62, 769b029fb59SBen Gras }; 770b029fb59SBen Gras 771b029fb59SBen Gras class Registers_Alpha { 772b029fb59SBen Gras public: 773b029fb59SBen Gras enum { 774b029fb59SBen Gras LAST_REGISTER = REGNO_ALPHA_F30, 775b029fb59SBen Gras LAST_RESTORE_REG = REGNO_ALPHA_F30, 776b029fb59SBen Gras RETURN_OFFSET = 0, 777*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 778b029fb59SBen Gras }; 779b029fb59SBen Gras typedef uint32_t reg_t; 780b029fb59SBen Gras 781b029fb59SBen Gras __dso_hidden Registers_Alpha(); 782b029fb59SBen Gras dwarf2regno(int num)783b029fb59SBen Gras static int dwarf2regno(int num) { return num; } 784b029fb59SBen Gras validRegister(int num) const785b029fb59SBen Gras bool validRegister(int num) const { 786b029fb59SBen Gras return num >= 0 && num <= REGNO_ALPHA_PC; 787b029fb59SBen Gras } 788b029fb59SBen Gras getRegister(int num) const789b029fb59SBen Gras uint64_t getRegister(int num) const { 790b029fb59SBen Gras assert(validRegister(num)); 791b029fb59SBen Gras return reg[num]; 792b029fb59SBen Gras } 793b029fb59SBen Gras setRegister(int num,uint64_t value)794b029fb59SBen Gras void setRegister(int num, uint64_t value) { 795b029fb59SBen Gras assert(validRegister(num)); 796b029fb59SBen Gras reg[num] = value; 797b029fb59SBen Gras } 798b029fb59SBen Gras getIP() const799b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_ALPHA_PC]; } 800b029fb59SBen Gras setIP(uint64_t value)801b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_ALPHA_PC] = value; } 802b029fb59SBen Gras getSP() const803b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_ALPHA_R30]; } 804b029fb59SBen Gras setSP(uint64_t value)805b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_ALPHA_R30] = value; } 806b029fb59SBen Gras validFloatVectorRegister(int num) const807b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 808b029fb59SBen Gras return num >= REGNO_ALPHA_F0 && num <= REGNO_ALPHA_F30; 809b029fb59SBen Gras } 810b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)811b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 812b029fb59SBen Gras assert(validFloatVectorRegister(num)); 813b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 814b029fb59SBen Gras memcpy(fpreg + (num - REGNO_ALPHA_F0), addr, sizeof(fpreg[0])); 815b029fb59SBen Gras } 816b029fb59SBen Gras 817b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 818b029fb59SBen Gras 819b029fb59SBen Gras private: 820b029fb59SBen Gras uint64_t reg[REGNO_ALPHA_PC + 1]; 821b029fb59SBen Gras uint64_t fpreg[31]; 822b029fb59SBen Gras }; 823b029fb59SBen Gras 824b029fb59SBen Gras enum { 825b029fb59SBen Gras DWARF_HPPA_R1 = 1, 826b029fb59SBen Gras DWARF_HPPA_R31 = 31, 827b029fb59SBen Gras DWARF_HPPA_FR4L = 32, 828b029fb59SBen Gras DWARF_HPPA_FR31H = 87, 829b029fb59SBen Gras 830b029fb59SBen Gras REGNO_HPPA_PC = 0, 831b029fb59SBen Gras REGNO_HPPA_R1 = 1, 832b029fb59SBen Gras REGNO_HPPA_R2 = 2, 833b029fb59SBen Gras REGNO_HPPA_R30 = 30, 834b029fb59SBen Gras REGNO_HPPA_R31 = 31, 835b029fb59SBen Gras REGNO_HPPA_FR4L = 32, 836b029fb59SBen Gras REGNO_HPPA_FR31H = 87, 837b029fb59SBen Gras }; 838b029fb59SBen Gras 839b029fb59SBen Gras class Registers_HPPA { 840b029fb59SBen Gras public: 841b029fb59SBen Gras enum { 842b029fb59SBen Gras LAST_REGISTER = REGNO_HPPA_FR31H, 843b029fb59SBen Gras LAST_RESTORE_REG = REGNO_HPPA_FR31H, 844*0a6a1f1dSLionel Sambuc RETURN_OFFSET = 0, 845*0a6a1f1dSLionel Sambuc RETURN_MASK = 3, 846b029fb59SBen Gras }; 847b029fb59SBen Gras 848b029fb59SBen Gras __dso_hidden Registers_HPPA(); 849b029fb59SBen Gras dwarf2regno(int num)850b029fb59SBen Gras static int dwarf2regno(int num) { 851b029fb59SBen Gras if (num >= DWARF_HPPA_R1 && num <= DWARF_HPPA_R31) 852b029fb59SBen Gras return REGNO_HPPA_R1 + (num - DWARF_HPPA_R1); 853b029fb59SBen Gras if (num >= DWARF_HPPA_FR4L && num <= DWARF_HPPA_FR31H) 854b029fb59SBen Gras return REGNO_HPPA_FR4L + (num - DWARF_HPPA_FR31H); 855b029fb59SBen Gras return LAST_REGISTER + 1; 856b029fb59SBen Gras } 857b029fb59SBen Gras validRegister(int num) const858b029fb59SBen Gras bool validRegister(int num) const { 859b029fb59SBen Gras return num >= REGNO_HPPA_PC && num <= REGNO_HPPA_R31; 860b029fb59SBen Gras } 861b029fb59SBen Gras getRegister(int num) const862b029fb59SBen Gras uint64_t getRegister(int num) const { 863b029fb59SBen Gras assert(validRegister(num)); 864b029fb59SBen Gras return reg[num]; 865b029fb59SBen Gras } 866b029fb59SBen Gras setRegister(int num,uint64_t value)867b029fb59SBen Gras void setRegister(int num, uint64_t value) { 868b029fb59SBen Gras assert(validRegister(num)); 869b029fb59SBen Gras reg[num] = value; 870b029fb59SBen Gras } 871b029fb59SBen Gras getIP() const872b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_HPPA_PC]; } 873b029fb59SBen Gras setIP(uint64_t value)874b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_HPPA_PC] = value; } 875b029fb59SBen Gras getSP() const876b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_HPPA_R30]; } 877b029fb59SBen Gras setSP(uint64_t value)878b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_HPPA_R30] = value; } 879b029fb59SBen Gras validFloatVectorRegister(int num) const880b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 881b029fb59SBen Gras return num >= REGNO_HPPA_FR4L && num <= REGNO_HPPA_FR31H; 882b029fb59SBen Gras } 883b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)884b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 885b029fb59SBen Gras assert(validFloatVectorRegister(num)); 886b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 887b029fb59SBen Gras memcpy(fpreg + (num - REGNO_HPPA_FR4L), addr, sizeof(fpreg[0])); 888b029fb59SBen Gras } 889b029fb59SBen Gras 890b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 891b029fb59SBen Gras 892b029fb59SBen Gras private: 893b029fb59SBen Gras uint32_t reg[REGNO_HPPA_R31 + 1]; 894b029fb59SBen Gras uint32_t fpreg[56]; 895b029fb59SBen Gras }; 896b029fb59SBen Gras 897b029fb59SBen Gras enum { 898b029fb59SBen Gras DWARF_MIPS_R1 = 0, 899b029fb59SBen Gras DWARF_MIPS_R31 = 31, 900b029fb59SBen Gras DWARF_MIPS_F0 = 32, 901b029fb59SBen Gras DWARF_MIPS_F31 = 63, 902b029fb59SBen Gras 903b029fb59SBen Gras REGNO_MIPS_PC = 0, 904b029fb59SBen Gras REGNO_MIPS_R1 = 0, 905b029fb59SBen Gras REGNO_MIPS_R29 = 29, 906b029fb59SBen Gras REGNO_MIPS_R31 = 31, 907b029fb59SBen Gras REGNO_MIPS_F0 = 33, 908b029fb59SBen Gras REGNO_MIPS_F31 = 64 909b029fb59SBen Gras }; 910b029fb59SBen Gras 911b029fb59SBen Gras class Registers_MIPS { 912b029fb59SBen Gras public: 913b029fb59SBen Gras enum { 914b029fb59SBen Gras LAST_REGISTER = REGNO_MIPS_F31, 915b029fb59SBen Gras LAST_RESTORE_REG = REGNO_MIPS_F31, 916b029fb59SBen Gras RETURN_OFFSET = 0, 917*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 918b029fb59SBen Gras }; 919b029fb59SBen Gras 920b029fb59SBen Gras __dso_hidden Registers_MIPS(); 921b029fb59SBen Gras dwarf2regno(int num)922b029fb59SBen Gras static int dwarf2regno(int num) { 923b029fb59SBen Gras if (num >= DWARF_MIPS_R1 && num <= DWARF_MIPS_R31) 924b029fb59SBen Gras return REGNO_MIPS_R1 + (num - DWARF_MIPS_R1); 925b029fb59SBen Gras if (num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31) 926b029fb59SBen Gras return REGNO_MIPS_F0 + (num - DWARF_MIPS_F0); 927b029fb59SBen Gras return LAST_REGISTER + 1; 928b029fb59SBen Gras } 929b029fb59SBen Gras validRegister(int num) const930b029fb59SBen Gras bool validRegister(int num) const { 931b029fb59SBen Gras return num >= REGNO_MIPS_PC && num <= REGNO_MIPS_R31; 932b029fb59SBen Gras } 933b029fb59SBen Gras getRegister(int num) const934b029fb59SBen Gras uint64_t getRegister(int num) const { 935b029fb59SBen Gras assert(validRegister(num)); 936b029fb59SBen Gras return reg[num]; 937b029fb59SBen Gras } 938b029fb59SBen Gras setRegister(int num,uint64_t value)939b029fb59SBen Gras void setRegister(int num, uint64_t value) { 940b029fb59SBen Gras assert(validRegister(num)); 941b029fb59SBen Gras reg[num] = value; 942b029fb59SBen Gras } 943b029fb59SBen Gras getIP() const944b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_MIPS_PC]; } 945b029fb59SBen Gras setIP(uint64_t value)946b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_MIPS_PC] = value; } 947b029fb59SBen Gras getSP() const948b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_MIPS_R29]; } 949b029fb59SBen Gras setSP(uint64_t value)950b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_MIPS_R29] = value; } 951b029fb59SBen Gras validFloatVectorRegister(int num) const952b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 953b029fb59SBen Gras return num >= DWARF_MIPS_F0 && num <= DWARF_MIPS_F31; 954b029fb59SBen Gras } 955b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)956b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 957b029fb59SBen Gras assert(validFloatVectorRegister(num)); 958b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 959b029fb59SBen Gras memcpy(fpreg + (num - REGNO_MIPS_F0), addr, sizeof(fpreg[0])); 960b029fb59SBen Gras } 961b029fb59SBen Gras 962b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 963b029fb59SBen Gras 964b029fb59SBen Gras private: 965b029fb59SBen Gras uint32_t reg[REGNO_MIPS_R31 + 1]; 966b029fb59SBen Gras uint64_t fpreg[32]; 967b029fb59SBen Gras }; 968b029fb59SBen Gras 969b029fb59SBen Gras enum { 970b029fb59SBen Gras DWARF_MIPS64_R1 = 0, 971b029fb59SBen Gras DWARF_MIPS64_R31 = 31, 972b029fb59SBen Gras DWARF_MIPS64_F0 = 32, 973b029fb59SBen Gras DWARF_MIPS64_F31 = 63, 974b029fb59SBen Gras 975b029fb59SBen Gras REGNO_MIPS64_PC = 0, 976b029fb59SBen Gras REGNO_MIPS64_R1 = 0, 977b029fb59SBen Gras REGNO_MIPS64_R29 = 29, 978b029fb59SBen Gras REGNO_MIPS64_R31 = 31, 979b029fb59SBen Gras REGNO_MIPS64_F0 = 33, 980b029fb59SBen Gras REGNO_MIPS64_F31 = 64 981b029fb59SBen Gras }; 982b029fb59SBen Gras 983b029fb59SBen Gras class Registers_MIPS64 { 984b029fb59SBen Gras public: 985b029fb59SBen Gras enum { 986b029fb59SBen Gras LAST_REGISTER = REGNO_MIPS64_F31, 987b029fb59SBen Gras LAST_RESTORE_REG = REGNO_MIPS64_F31, 988b029fb59SBen Gras RETURN_OFFSET = 0, 989*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 990b029fb59SBen Gras }; 991b029fb59SBen Gras 992b029fb59SBen Gras __dso_hidden Registers_MIPS64(); 993b029fb59SBen Gras dwarf2regno(int num)994b029fb59SBen Gras static int dwarf2regno(int num) { 995b029fb59SBen Gras if (num >= DWARF_MIPS64_R1 && num <= DWARF_MIPS64_R31) 996b029fb59SBen Gras return REGNO_MIPS64_R1 + (num - DWARF_MIPS64_R1); 997b029fb59SBen Gras if (num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31) 998b029fb59SBen Gras return REGNO_MIPS64_F0 + (num - DWARF_MIPS64_F0); 999b029fb59SBen Gras return LAST_REGISTER + 1; 1000b029fb59SBen Gras } 1001b029fb59SBen Gras validRegister(int num) const1002b029fb59SBen Gras bool validRegister(int num) const { 1003b029fb59SBen Gras return num >= REGNO_MIPS64_PC && num <= REGNO_MIPS64_R31; 1004b029fb59SBen Gras } 1005b029fb59SBen Gras getRegister(int num) const1006b029fb59SBen Gras uint64_t getRegister(int num) const { 1007b029fb59SBen Gras assert(validRegister(num)); 1008b029fb59SBen Gras return reg[num]; 1009b029fb59SBen Gras } 1010b029fb59SBen Gras setRegister(int num,uint64_t value)1011b029fb59SBen Gras void setRegister(int num, uint64_t value) { 1012b029fb59SBen Gras assert(validRegister(num)); 1013b029fb59SBen Gras reg[num] = value; 1014b029fb59SBen Gras } 1015b029fb59SBen Gras getIP() const1016b029fb59SBen Gras uint64_t getIP() const { return reg[REGNO_MIPS64_PC]; } 1017b029fb59SBen Gras setIP(uint64_t value)1018b029fb59SBen Gras void setIP(uint64_t value) { reg[REGNO_MIPS64_PC] = value; } 1019b029fb59SBen Gras getSP() const1020b029fb59SBen Gras uint64_t getSP() const { return reg[REGNO_MIPS64_R29]; } 1021b029fb59SBen Gras setSP(uint64_t value)1022b029fb59SBen Gras void setSP(uint64_t value) { reg[REGNO_MIPS64_R29] = value; } 1023b029fb59SBen Gras validFloatVectorRegister(int num) const1024b029fb59SBen Gras bool validFloatVectorRegister(int num) const { 1025b029fb59SBen Gras return num >= DWARF_MIPS64_F0 && num <= DWARF_MIPS64_F31; 1026b029fb59SBen Gras } 1027b029fb59SBen Gras copyFloatVectorRegister(int num,uint64_t addr_)1028b029fb59SBen Gras void copyFloatVectorRegister(int num, uint64_t addr_) { 1029b029fb59SBen Gras assert(validFloatVectorRegister(num)); 1030b029fb59SBen Gras const void *addr = reinterpret_cast<const void *>(addr_); 1031b029fb59SBen Gras memcpy(fpreg + (num - REGNO_MIPS64_F0), addr, sizeof(fpreg[0])); 1032b029fb59SBen Gras } 1033b029fb59SBen Gras 1034b029fb59SBen Gras __dso_hidden void jumpto() const __dead; 1035b029fb59SBen Gras 1036b029fb59SBen Gras private: 1037b029fb59SBen Gras uint64_t reg[REGNO_MIPS64_R31 + 1]; 1038b029fb59SBen Gras uint64_t fpreg[32]; 1039b029fb59SBen Gras }; 1040b029fb59SBen Gras 1041*0a6a1f1dSLionel Sambuc enum { 1042*0a6a1f1dSLionel Sambuc DWARF_OR1K_R0 = 0, 1043*0a6a1f1dSLionel Sambuc DWARF_OR1K_SP = 1, 1044*0a6a1f1dSLionel Sambuc DWARF_OR1K_LR = 9, 1045*0a6a1f1dSLionel Sambuc DWARF_OR1K_R31 = 31, 1046*0a6a1f1dSLionel Sambuc DWARF_OR1K_FPCSR = 32, 1047*0a6a1f1dSLionel Sambuc 1048*0a6a1f1dSLionel Sambuc REGNO_OR1K_R0 = 0, 1049*0a6a1f1dSLionel Sambuc REGNO_OR1K_SP = 1, 1050*0a6a1f1dSLionel Sambuc REGNO_OR1K_LR = 9, 1051*0a6a1f1dSLionel Sambuc REGNO_OR1K_R31 = 31, 1052*0a6a1f1dSLionel Sambuc REGNO_OR1K_FPCSR = 32, 1053*0a6a1f1dSLionel Sambuc }; 1054*0a6a1f1dSLionel Sambuc 1055*0a6a1f1dSLionel Sambuc class Registers_or1k { 1056*0a6a1f1dSLionel Sambuc public: 1057*0a6a1f1dSLionel Sambuc enum { 1058*0a6a1f1dSLionel Sambuc LAST_REGISTER = REGNO_OR1K_FPCSR, 1059*0a6a1f1dSLionel Sambuc LAST_RESTORE_REG = REGNO_OR1K_FPCSR, 1060*0a6a1f1dSLionel Sambuc RETURN_OFFSET = 0, 1061*0a6a1f1dSLionel Sambuc RETURN_MASK = 0, 1062*0a6a1f1dSLionel Sambuc }; 1063*0a6a1f1dSLionel Sambuc 1064*0a6a1f1dSLionel Sambuc __dso_hidden Registers_or1k(); 1065*0a6a1f1dSLionel Sambuc dwarf2regno(int num)1066*0a6a1f1dSLionel Sambuc static int dwarf2regno(int num) { 1067*0a6a1f1dSLionel Sambuc if (num >= DWARF_OR1K_R0 && num <= DWARF_OR1K_R31) 1068*0a6a1f1dSLionel Sambuc return REGNO_OR1K_R0 + (num - DWARF_OR1K_R0); 1069*0a6a1f1dSLionel Sambuc if (num == DWARF_OR1K_FPCSR) 1070*0a6a1f1dSLionel Sambuc return REGNO_OR1K_FPCSR; 1071*0a6a1f1dSLionel Sambuc return LAST_REGISTER + 1; 1072*0a6a1f1dSLionel Sambuc } 1073*0a6a1f1dSLionel Sambuc validRegister(int num) const1074*0a6a1f1dSLionel Sambuc bool validRegister(int num) const { 1075*0a6a1f1dSLionel Sambuc return num >= 0 && num <= LAST_RESTORE_REG; 1076*0a6a1f1dSLionel Sambuc } 1077*0a6a1f1dSLionel Sambuc getRegister(int num) const1078*0a6a1f1dSLionel Sambuc uint64_t getRegister(int num) const { 1079*0a6a1f1dSLionel Sambuc assert(validRegister(num)); 1080*0a6a1f1dSLionel Sambuc return reg[num]; 1081*0a6a1f1dSLionel Sambuc } 1082*0a6a1f1dSLionel Sambuc setRegister(int num,uint64_t value)1083*0a6a1f1dSLionel Sambuc void setRegister(int num, uint64_t value) { 1084*0a6a1f1dSLionel Sambuc assert(validRegister(num)); 1085*0a6a1f1dSLionel Sambuc reg[num] = value; 1086*0a6a1f1dSLionel Sambuc } 1087*0a6a1f1dSLionel Sambuc getIP() const1088*0a6a1f1dSLionel Sambuc uint64_t getIP() const { return reg[REGNO_OR1K_LR]; } 1089*0a6a1f1dSLionel Sambuc setIP(uint64_t value)1090*0a6a1f1dSLionel Sambuc void setIP(uint64_t value) { reg[REGNO_OR1K_LR] = value; } 1091*0a6a1f1dSLionel Sambuc getSP() const1092*0a6a1f1dSLionel Sambuc uint64_t getSP() const { return reg[REGNO_OR1K_SP]; } 1093*0a6a1f1dSLionel Sambuc setSP(uint64_t value)1094*0a6a1f1dSLionel Sambuc void setSP(uint64_t value) { reg[REGNO_OR1K_SP] = value; } 1095*0a6a1f1dSLionel Sambuc validFloatVectorRegister(int num) const1096*0a6a1f1dSLionel Sambuc bool validFloatVectorRegister(int num) const { 1097*0a6a1f1dSLionel Sambuc return false; 1098*0a6a1f1dSLionel Sambuc } 1099*0a6a1f1dSLionel Sambuc copyFloatVectorRegister(int num,uint64_t addr_)1100*0a6a1f1dSLionel Sambuc void copyFloatVectorRegister(int num, uint64_t addr_) { 1101*0a6a1f1dSLionel Sambuc } 1102*0a6a1f1dSLionel Sambuc 1103*0a6a1f1dSLionel Sambuc __dso_hidden void jumpto() const __dead; 1104*0a6a1f1dSLionel Sambuc 1105*0a6a1f1dSLionel Sambuc private: 1106*0a6a1f1dSLionel Sambuc uint32_t reg[REGNO_OR1K_FPCSR + 1]; 1107*0a6a1f1dSLionel Sambuc }; 1108*0a6a1f1dSLionel Sambuc 1109b029fb59SBen Gras #if __i386__ 1110b029fb59SBen Gras typedef Registers_x86 NativeUnwindRegisters; 1111b029fb59SBen Gras #elif __x86_64__ 1112b029fb59SBen Gras typedef Registers_x86_64 NativeUnwindRegisters; 1113b029fb59SBen Gras #elif __powerpc__ 1114b029fb59SBen Gras typedef Registers_ppc32 NativeUnwindRegisters; 1115*0a6a1f1dSLionel Sambuc #elif __aarch64__ 1116*0a6a1f1dSLionel Sambuc typedef Registers_aarch64 NativeUnwindRegisters; 1117b029fb59SBen Gras #elif __arm__ 1118b029fb59SBen Gras typedef Registers_arm32 NativeUnwindRegisters; 1119b029fb59SBen Gras #elif __vax__ 1120b029fb59SBen Gras typedef Registers_vax NativeUnwindRegisters; 1121b029fb59SBen Gras #elif __m68k__ 1122b029fb59SBen Gras typedef Registers_M68K NativeUnwindRegisters; 1123b029fb59SBen Gras #elif __mips_n64 || __mips_n32 1124b029fb59SBen Gras typedef Registers_MIPS64 NativeUnwindRegisters; 1125b029fb59SBen Gras #elif __mips__ 1126b029fb59SBen Gras typedef Registers_MIPS NativeUnwindRegisters; 1127b029fb59SBen Gras #elif __sh3__ 1128b029fb59SBen Gras typedef Registers_SH3 NativeUnwindRegisters; 1129b029fb59SBen Gras #elif __sparc64__ 1130b029fb59SBen Gras typedef Registers_SPARC64 NativeUnwindRegisters; 1131b029fb59SBen Gras #elif __sparc__ 1132b029fb59SBen Gras typedef Registers_SPARC NativeUnwindRegisters; 1133b029fb59SBen Gras #elif __alpha__ 1134b029fb59SBen Gras typedef Registers_Alpha NativeUnwindRegisters; 1135b029fb59SBen Gras #elif __hppa__ 1136b029fb59SBen Gras typedef Registers_HPPA NativeUnwindRegisters; 1137*0a6a1f1dSLionel Sambuc #elif __or1k__ 1138*0a6a1f1dSLionel Sambuc typedef Registers_or1k NativeUnwindRegisters; 1139b029fb59SBen Gras #endif 1140472758f3SLionel Sambuc } // namespace _Unwind 1141472758f3SLionel Sambuc 1142472758f3SLionel Sambuc #endif // __REGISTERS_HPP__ 1143