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