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