Registers.hpp revision 1.10 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.3 joerg RETURN_REG = REGNO_X86_EIP,
38 1.10 joerg RETURN_OFFSET = 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.3 joerg RETURN_REG = REGNO_X86_64_RIP,
104 1.10 joerg RETURN_OFFSET = 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.3 joerg RETURN_REG = REGNO_PPC32_LR,
173 1.10 joerg RETURN_OFFSET = 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.2 matt DWARF_ARM32_R0 = 0,
244 1.2 matt DWARF_ARM32_R15 = 15,
245 1.2 matt DWARF_ARM32_SPSR = 128,
246 1.2 matt DWARF_ARM32_D0 = 256, // VFP-v3/Neon
247 1.2 matt DWARF_ARM32_D31 = 287,
248 1.2 matt REGNO_ARM32_R0 = 0,
249 1.2 matt REGNO_ARM32_SP = 13,
250 1.2 matt REGNO_ARM32_R15 = 15,
251 1.2 matt REGNO_ARM32_SPSR = 16,
252 1.2 matt REGNO_ARM32_D0 = 0,
253 1.2 matt REGNO_ARM32_D31 = 31,
254 1.2 matt };
255 1.2 matt
256 1.2 matt class Registers_arm32 {
257 1.2 matt public:
258 1.2 matt enum {
259 1.3 joerg LAST_REGISTER = REGNO_ARM32_D31,
260 1.2 matt LAST_RESTORE_REG = REGNO_ARM32_SPSR,
261 1.3 joerg RETURN_REG = REGNO_ARM32_SPSR,
262 1.10 joerg RETURN_OFFSET = 0,
263 1.2 matt };
264 1.2 matt
265 1.2 matt __dso_hidden Registers_arm32();
266 1.2 matt
267 1.2 matt static int dwarf2regno(int num) {
268 1.2 matt if (num >= DWARF_ARM32_R0 && num <= DWARF_ARM32_R15)
269 1.2 matt return REGNO_ARM32_R0 + (num - DWARF_ARM32_R0);
270 1.2 matt if (num >= DWARF_ARM32_D0 && num <= DWARF_ARM32_D31)
271 1.2 matt return REGNO_ARM32_D0 + (num - DWARF_ARM32_D0);
272 1.2 matt if (num == DWARF_ARM32_SPSR)
273 1.2 matt return REGNO_ARM32_SPSR;
274 1.2 matt return LAST_REGISTER + 1;
275 1.2 matt }
276 1.2 matt
277 1.2 matt bool validRegister(int num) const {
278 1.2 matt return num >= 0 && num <= LAST_RESTORE_REG;
279 1.2 matt }
280 1.2 matt
281 1.2 matt uint64_t getRegister(int num) const {
282 1.2 matt assert(validRegister(num));
283 1.2 matt return reg[num];
284 1.2 matt }
285 1.2 matt
286 1.2 matt void setRegister(int num, uint64_t value) {
287 1.2 matt assert(validRegister(num));
288 1.2 matt reg[num] = value;
289 1.2 matt }
290 1.2 matt
291 1.2 matt uint64_t getIP() const { return reg[REGNO_ARM32_R15]; }
292 1.2 matt
293 1.2 matt void setIP(uint64_t value) { reg[REGNO_ARM32_R15] = value; }
294 1.2 matt
295 1.2 matt uint64_t getSP() const { return reg[REGNO_ARM32_SP]; }
296 1.2 matt
297 1.2 matt void setSP(uint64_t value) { reg[REGNO_ARM32_SP] = value; }
298 1.2 matt
299 1.2 matt bool validFloatVectorRegister(int num) const {
300 1.2 matt return (num >= REGNO_ARM32_D0 && num <= REGNO_ARM32_D31);
301 1.2 matt }
302 1.2 matt
303 1.2 matt void copyFloatVectorRegister(int num, uint64_t addr_) {
304 1.2 matt const void *addr = reinterpret_cast<const void *>(addr_);
305 1.2 matt memcpy(fpreg + (num - REGNO_ARM32_D0), addr, sizeof(fpreg[0]));
306 1.2 matt }
307 1.2 matt
308 1.2 matt __dso_hidden void jumpto() const __dead;
309 1.2 matt
310 1.2 matt private:
311 1.2 matt uint32_t reg[REGNO_ARM32_SPSR + 1];
312 1.2 matt uint64_t fpreg[32];
313 1.2 matt };
314 1.2 matt
315 1.5 joerg enum {
316 1.5 joerg DWARF_VAX_R0 = 0,
317 1.5 joerg DWARF_VAX_R15 = 15,
318 1.5 joerg DWARF_VAX_PSW = 16,
319 1.5 joerg
320 1.5 joerg REGNO_VAX_R0 = 0,
321 1.5 joerg REGNO_VAX_R14 = 14,
322 1.5 joerg REGNO_VAX_R15 = 15,
323 1.5 joerg REGNO_VAX_PSW = 16,
324 1.5 joerg };
325 1.5 joerg
326 1.5 joerg class Registers_vax {
327 1.5 joerg public:
328 1.5 joerg enum {
329 1.5 joerg LAST_REGISTER = REGNO_VAX_PSW,
330 1.5 joerg LAST_RESTORE_REG = REGNO_VAX_PSW,
331 1.5 joerg RETURN_REG = REGNO_VAX_R15,
332 1.10 joerg RETURN_OFFSET = 0,
333 1.5 joerg };
334 1.5 joerg
335 1.5 joerg __dso_hidden Registers_vax();
336 1.5 joerg
337 1.5 joerg static int dwarf2regno(int num) {
338 1.5 joerg if (num >= DWARF_VAX_R0 && num <= DWARF_VAX_R15)
339 1.5 joerg return REGNO_VAX_R0 + (num - DWARF_VAX_R0);
340 1.5 joerg if (num == DWARF_VAX_PSW)
341 1.5 joerg return REGNO_VAX_PSW;
342 1.5 joerg return LAST_REGISTER + 1;
343 1.5 joerg }
344 1.5 joerg
345 1.5 joerg bool validRegister(int num) const {
346 1.5 joerg return num >= 0 && num <= LAST_RESTORE_REG;
347 1.5 joerg }
348 1.5 joerg
349 1.5 joerg uint64_t getRegister(int num) const {
350 1.5 joerg assert(validRegister(num));
351 1.5 joerg return reg[num];
352 1.5 joerg }
353 1.5 joerg
354 1.5 joerg void setRegister(int num, uint64_t value) {
355 1.5 joerg assert(validRegister(num));
356 1.5 joerg reg[num] = value;
357 1.5 joerg }
358 1.5 joerg
359 1.5 joerg uint64_t getIP() const { return reg[REGNO_VAX_R15]; }
360 1.5 joerg
361 1.5 joerg void setIP(uint64_t value) { reg[REGNO_VAX_R15] = value; }
362 1.5 joerg
363 1.5 joerg uint64_t getSP() const { return reg[REGNO_VAX_R14]; }
364 1.5 joerg
365 1.5 joerg void setSP(uint64_t value) { reg[REGNO_VAX_R14] = value; }
366 1.5 joerg
367 1.5 joerg bool validFloatVectorRegister(int num) const {
368 1.5 joerg return false;
369 1.5 joerg }
370 1.5 joerg
371 1.5 joerg void copyFloatVectorRegister(int num, uint64_t addr_) {
372 1.5 joerg }
373 1.5 joerg
374 1.5 joerg __dso_hidden void jumpto() const __dead;
375 1.5 joerg
376 1.5 joerg private:
377 1.5 joerg uint32_t reg[REGNO_VAX_PSW + 1];
378 1.5 joerg };
379 1.5 joerg
380 1.6 joerg enum {
381 1.6 joerg DWARF_M68K_A0 = 0,
382 1.6 joerg DWARF_M68K_A7 = 7,
383 1.6 joerg DWARF_M68K_D0 = 8,
384 1.6 joerg DWARF_M68K_D7 = 15,
385 1.7 joerg DWARF_M68K_FP0 = 16,
386 1.7 joerg DWARF_M68K_FP7 = 23,
387 1.6 joerg DWARF_M68K_PC = 24,
388 1.6 joerg
389 1.6 joerg REGNO_M68K_A0 = 0,
390 1.6 joerg REGNO_M68K_A7 = 7,
391 1.6 joerg REGNO_M68K_D0 = 8,
392 1.6 joerg REGNO_M68K_D7 = 15,
393 1.6 joerg REGNO_M68K_PC = 16,
394 1.7 joerg REGNO_M68K_FP0 = 17,
395 1.7 joerg REGNO_M68K_FP7 = 24,
396 1.6 joerg };
397 1.6 joerg
398 1.6 joerg class Registers_M68K {
399 1.6 joerg public:
400 1.6 joerg enum {
401 1.7 joerg LAST_REGISTER = REGNO_M68K_FP7,
402 1.7 joerg LAST_RESTORE_REG = REGNO_M68K_FP7,
403 1.6 joerg RETURN_REG = REGNO_M68K_PC,
404 1.10 joerg RETURN_OFFSET = 0,
405 1.6 joerg };
406 1.6 joerg
407 1.6 joerg __dso_hidden Registers_M68K();
408 1.6 joerg
409 1.6 joerg static int dwarf2regno(int num) {
410 1.6 joerg if (num >= DWARF_M68K_A0 && num <= DWARF_M68K_A7)
411 1.6 joerg return REGNO_M68K_A0 + (num - DWARF_M68K_A0);
412 1.6 joerg if (num >= DWARF_M68K_D0 && num <= DWARF_M68K_D7)
413 1.6 joerg return REGNO_M68K_D0 + (num - DWARF_M68K_D0);
414 1.7 joerg if (num >= DWARF_M68K_FP0 && num <= DWARF_M68K_FP7)
415 1.7 joerg return REGNO_M68K_FP0 + (num - DWARF_M68K_FP0);
416 1.6 joerg if (num == DWARF_M68K_PC)
417 1.6 joerg return REGNO_M68K_PC;
418 1.6 joerg return LAST_REGISTER + 1;
419 1.6 joerg }
420 1.6 joerg
421 1.6 joerg bool validRegister(int num) const {
422 1.7 joerg return num >= 0 && num <= REGNO_M68K_PC;
423 1.6 joerg }
424 1.6 joerg
425 1.6 joerg uint64_t getRegister(int num) const {
426 1.6 joerg assert(validRegister(num));
427 1.6 joerg return reg[num];
428 1.6 joerg }
429 1.6 joerg
430 1.6 joerg void setRegister(int num, uint64_t value) {
431 1.6 joerg assert(validRegister(num));
432 1.6 joerg reg[num] = value;
433 1.6 joerg }
434 1.6 joerg
435 1.6 joerg uint64_t getIP() const { return reg[REGNO_M68K_PC]; }
436 1.6 joerg
437 1.6 joerg void setIP(uint64_t value) { reg[REGNO_M68K_PC] = value; }
438 1.6 joerg
439 1.6 joerg uint64_t getSP() const { return reg[REGNO_M68K_A7]; }
440 1.6 joerg
441 1.6 joerg void setSP(uint64_t value) { reg[REGNO_M68K_A7] = value; }
442 1.6 joerg
443 1.6 joerg bool validFloatVectorRegister(int num) const {
444 1.7 joerg return num >= REGNO_M68K_FP0 && num <= REGNO_M68K_FP7;
445 1.6 joerg }
446 1.6 joerg
447 1.6 joerg void copyFloatVectorRegister(int num, uint64_t addr_) {
448 1.7 joerg assert(validFloatVectorRegister(num));
449 1.7 joerg const void *addr = reinterpret_cast<const void *>(addr_);
450 1.7 joerg memcpy(fpreg + (num - REGNO_M68K_FP0), addr, sizeof(fpreg[0]));
451 1.6 joerg }
452 1.6 joerg
453 1.6 joerg __dso_hidden void jumpto() const __dead;
454 1.6 joerg
455 1.6 joerg private:
456 1.7 joerg typedef uint32_t fpreg_t[3];
457 1.7 joerg
458 1.6 joerg uint32_t reg[REGNO_M68K_PC + 1];
459 1.7 joerg uint32_t dummy;
460 1.7 joerg fpreg_t fpreg[8];
461 1.6 joerg };
462 1.6 joerg
463 1.8 joerg enum {
464 1.8 joerg DWARF_SH3_R0 = 0,
465 1.8 joerg DWARF_SH3_R15 = 15,
466 1.8 joerg DWARF_SH3_PC = 16,
467 1.8 joerg DWARF_SH3_PR = 17,
468 1.8 joerg
469 1.8 joerg REGNO_SH3_R0 = 0,
470 1.8 joerg REGNO_SH3_R15 = 15,
471 1.8 joerg REGNO_SH3_PC = 16,
472 1.8 joerg REGNO_SH3_PR = 17,
473 1.8 joerg };
474 1.8 joerg
475 1.8 joerg class Registers_SH3 {
476 1.8 joerg public:
477 1.8 joerg enum {
478 1.8 joerg LAST_REGISTER = REGNO_SH3_PR,
479 1.8 joerg LAST_RESTORE_REG = REGNO_SH3_PR,
480 1.8 joerg RETURN_REG = REGNO_SH3_PR,
481 1.10 joerg RETURN_OFFSET = 0,
482 1.8 joerg };
483 1.8 joerg
484 1.8 joerg __dso_hidden Registers_SH3();
485 1.8 joerg
486 1.8 joerg static int dwarf2regno(int num) {
487 1.8 joerg if (num >= DWARF_SH3_R0 && num <= DWARF_SH3_R15)
488 1.8 joerg return REGNO_SH3_R0 + (num - DWARF_SH3_R0);
489 1.8 joerg if (num == DWARF_SH3_PC)
490 1.8 joerg return REGNO_SH3_PC;
491 1.8 joerg if (num == DWARF_SH3_PR)
492 1.8 joerg return REGNO_SH3_PR;
493 1.8 joerg return LAST_REGISTER + 1;
494 1.8 joerg }
495 1.8 joerg
496 1.8 joerg bool validRegister(int num) const {
497 1.8 joerg return num >= 0 && num <= REGNO_SH3_PR;
498 1.8 joerg }
499 1.8 joerg
500 1.8 joerg uint64_t getRegister(int num) const {
501 1.8 joerg assert(validRegister(num));
502 1.8 joerg return reg[num];
503 1.8 joerg }
504 1.8 joerg
505 1.8 joerg void setRegister(int num, uint64_t value) {
506 1.8 joerg assert(validRegister(num));
507 1.8 joerg reg[num] = value;
508 1.8 joerg }
509 1.8 joerg
510 1.8 joerg uint64_t getIP() const { return reg[REGNO_SH3_PC]; }
511 1.8 joerg
512 1.8 joerg void setIP(uint64_t value) { reg[REGNO_SH3_PC] = value; }
513 1.8 joerg
514 1.8 joerg uint64_t getSP() const { return reg[REGNO_SH3_R15]; }
515 1.8 joerg
516 1.8 joerg void setSP(uint64_t value) { reg[REGNO_SH3_R15] = value; }
517 1.8 joerg
518 1.8 joerg bool validFloatVectorRegister(int num) const { return false; }
519 1.8 joerg
520 1.8 joerg void copyFloatVectorRegister(int num, uint64_t addr_) {}
521 1.8 joerg
522 1.8 joerg __dso_hidden void jumpto() const __dead;
523 1.8 joerg
524 1.8 joerg private:
525 1.8 joerg uint32_t reg[REGNO_SH3_PR + 1];
526 1.8 joerg };
527 1.8 joerg
528 1.9 joerg #if __i386__
529 1.9 joerg typedef Registers_x86 NativeUnwindRegisters;
530 1.9 joerg #elif __x86_64__
531 1.9 joerg typedef Registers_x86_64 NativeUnwindRegisters;
532 1.9 joerg #elif __powerpc__
533 1.9 joerg typedef Registers_ppc32 NativeUnwindRegisters;
534 1.9 joerg #elif __arm__ && !defined(__ARM_EABI__)
535 1.9 joerg typedef Registers_arm32 NativeUnwindRegisters;
536 1.9 joerg #elif __vax__
537 1.9 joerg typedef Registers_vax NativeUnwindRegisters;
538 1.9 joerg #elif __m68k__
539 1.9 joerg typedef Registers_M68K NativeUnwindRegisters;
540 1.9 joerg #elif __sh3__
541 1.9 joerg typedef Registers_SH3 NativeUnwindRegisters;
542 1.9 joerg #endif
543 1.1 joerg } // namespace _Unwind
544 1.1 joerg
545 1.1 joerg #endif // __REGISTERS_HPP__
546