1 //===-- ARM_DWARF_Registers.c -----------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "ARM_DWARF_Registers.h"
16 using namespace lldb_private;
19 GetARMDWARFRegisterName (unsigned reg_num)
23 case dwarf_r0: return "r0";
24 case dwarf_r1: return "r1";
25 case dwarf_r2: return "r2";
26 case dwarf_r3: return "r3";
27 case dwarf_r4: return "r4";
28 case dwarf_r5: return "r5";
29 case dwarf_r6: return "r6";
30 case dwarf_r7: return "r7";
31 case dwarf_r8: return "r8";
32 case dwarf_r9: return "r9";
33 case dwarf_r10: return "r10";
34 case dwarf_r11: return "r11";
35 case dwarf_r12: return "r12";
36 case dwarf_sp: return "sp";
37 case dwarf_lr: return "lr";
38 case dwarf_pc: return "pc";
39 case dwarf_cpsr:return "cpsr";
41 case dwarf_s0: return "s0";
42 case dwarf_s1: return "s1";
43 case dwarf_s2: return "s2";
44 case dwarf_s3: return "s3";
45 case dwarf_s4: return "s4";
46 case dwarf_s5: return "s5";
47 case dwarf_s6: return "s6";
48 case dwarf_s7: return "s7";
49 case dwarf_s8: return "s8";
50 case dwarf_s9: return "s9";
51 case dwarf_s10: return "s10";
52 case dwarf_s11: return "s11";
53 case dwarf_s12: return "s12";
54 case dwarf_s13: return "s13";
55 case dwarf_s14: return "s14";
56 case dwarf_s15: return "s15";
57 case dwarf_s16: return "s16";
58 case dwarf_s17: return "s17";
59 case dwarf_s18: return "s18";
60 case dwarf_s19: return "s19";
61 case dwarf_s20: return "s20";
62 case dwarf_s21: return "s21";
63 case dwarf_s22: return "s22";
64 case dwarf_s23: return "s23";
65 case dwarf_s24: return "s24";
66 case dwarf_s25: return "s25";
67 case dwarf_s26: return "s26";
68 case dwarf_s27: return "s27";
69 case dwarf_s28: return "s28";
70 case dwarf_s29: return "s29";
71 case dwarf_s30: return "s30";
72 case dwarf_s31: return "s31";
75 case dwarf_f0: return "f0";
76 case dwarf_f1: return "f1";
77 case dwarf_f2: return "f2";
78 case dwarf_f3: return "f3";
79 case dwarf_f4: return "f4";
80 case dwarf_f5: return "f5";
81 case dwarf_f6: return "f6";
82 case dwarf_f7: return "f7";
84 // Intel wireless MMX general purpose registers 0 - 7
85 // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
86 case dwarf_wCGR0: return "wCGR0/ACC0";
87 case dwarf_wCGR1: return "wCGR1/ACC1";
88 case dwarf_wCGR2: return "wCGR2/ACC2";
89 case dwarf_wCGR3: return "wCGR3/ACC3";
90 case dwarf_wCGR4: return "wCGR4/ACC4";
91 case dwarf_wCGR5: return "wCGR5/ACC5";
92 case dwarf_wCGR6: return "wCGR6/ACC6";
93 case dwarf_wCGR7: return "wCGR7/ACC7";
95 // Intel wireless MMX data registers 0 - 15
96 case dwarf_wR0: return "wR0";
97 case dwarf_wR1: return "wR1";
98 case dwarf_wR2: return "wR2";
99 case dwarf_wR3: return "wR3";
100 case dwarf_wR4: return "wR4";
101 case dwarf_wR5: return "wR5";
102 case dwarf_wR6: return "wR6";
103 case dwarf_wR7: return "wR7";
104 case dwarf_wR8: return "wR8";
105 case dwarf_wR9: return "wR9";
106 case dwarf_wR10: return "wR10";
107 case dwarf_wR11: return "wR11";
108 case dwarf_wR12: return "wR12";
109 case dwarf_wR13: return "wR13";
110 case dwarf_wR14: return "wR14";
111 case dwarf_wR15: return "wR15";
113 case dwarf_spsr: return "spsr";
114 case dwarf_spsr_fiq: return "spsr_fiq";
115 case dwarf_spsr_irq: return "spsr_irq";
116 case dwarf_spsr_abt: return "spsr_abt";
117 case dwarf_spsr_und: return "spsr_und";
118 case dwarf_spsr_svc: return "spsr_svc";
120 case dwarf_r8_usr: return "r8_usr";
121 case dwarf_r9_usr: return "r9_usr";
122 case dwarf_r10_usr: return "r10_usr";
123 case dwarf_r11_usr: return "r11_usr";
124 case dwarf_r12_usr: return "r12_usr";
125 case dwarf_r13_usr: return "r13_usr";
126 case dwarf_r14_usr: return "r14_usr";
127 case dwarf_r8_fiq: return "r8_fiq";
128 case dwarf_r9_fiq: return "r9_fiq";
129 case dwarf_r10_fiq: return "r10_fiq";
130 case dwarf_r11_fiq: return "r11_fiq";
131 case dwarf_r12_fiq: return "r12_fiq";
132 case dwarf_r13_fiq: return "r13_fiq";
133 case dwarf_r14_fiq: return "r14_fiq";
134 case dwarf_r13_irq: return "r13_irq";
135 case dwarf_r14_irq: return "r14_irq";
136 case dwarf_r13_abt: return "r13_abt";
137 case dwarf_r14_abt: return "r14_abt";
138 case dwarf_r13_und: return "r13_und";
139 case dwarf_r14_und: return "r14_und";
140 case dwarf_r13_svc: return "r13_svc";
141 case dwarf_r14_svc: return "r14_svc";
143 // Intel wireless MMX control register in co-processor 0 - 7
144 case dwarf_wC0: return "wC0";
145 case dwarf_wC1: return "wC1";
146 case dwarf_wC2: return "wC2";
147 case dwarf_wC3: return "wC3";
148 case dwarf_wC4: return "wC4";
149 case dwarf_wC5: return "wC5";
150 case dwarf_wC6: return "wC6";
151 case dwarf_wC7: return "wC7";
154 case dwarf_d0: return "d0";
155 case dwarf_d1: return "d1";
156 case dwarf_d2: return "d2";
157 case dwarf_d3: return "d3";
158 case dwarf_d4: return "d4";
159 case dwarf_d5: return "d5";
160 case dwarf_d6: return "d6";
161 case dwarf_d7: return "d7";
162 case dwarf_d8: return "d8";
163 case dwarf_d9: return "d9";
164 case dwarf_d10: return "d10";
165 case dwarf_d11: return "d11";
166 case dwarf_d12: return "d12";
167 case dwarf_d13: return "d13";
168 case dwarf_d14: return "d14";
169 case dwarf_d15: return "d15";
170 case dwarf_d16: return "d16";
171 case dwarf_d17: return "d17";
172 case dwarf_d18: return "d18";
173 case dwarf_d19: return "d19";
174 case dwarf_d20: return "d20";
175 case dwarf_d21: return "d21";
176 case dwarf_d22: return "d22";
177 case dwarf_d23: return "d23";
178 case dwarf_d24: return "d24";
179 case dwarf_d25: return "d25";
180 case dwarf_d26: return "d26";
181 case dwarf_d27: return "d27";
182 case dwarf_d28: return "d28";
183 case dwarf_d29: return "d29";
184 case dwarf_d30: return "d30";
185 case dwarf_d31: return "d31";
187 // NEON 128-bit vector registers (overlays the d registers)
188 case dwarf_q0: return "q0";
189 case dwarf_q1: return "q1";
190 case dwarf_q2: return "q2";
191 case dwarf_q3: return "q3";
192 case dwarf_q4: return "q4";
193 case dwarf_q5: return "q5";
194 case dwarf_q6: return "q6";
195 case dwarf_q7: return "q7";
196 case dwarf_q8: return "q8";
197 case dwarf_q9: return "q9";
198 case dwarf_q10: return "q10";
199 case dwarf_q11: return "q11";
200 case dwarf_q12: return "q12";
201 case dwarf_q13: return "q13";
202 case dwarf_q14: return "q14";
203 case dwarf_q15: return "q15";
209 GetARMDWARFRegisterInfo (unsigned reg_num, RegisterInfo ®_info)
211 ::memset (®_info, 0, sizeof(RegisterInfo));
212 ::memset (reg_info.kinds, LLDB_INVALID_REGNUM, sizeof(reg_info.kinds));
214 if (reg_num >= dwarf_q0 && reg_num <= dwarf_q15)
216 reg_info.byte_size = 16;
217 reg_info.format = eFormatVectorOfUInt8;
218 reg_info.encoding = eEncodingVector;
221 if (reg_num >= dwarf_d0 && reg_num <= dwarf_d31)
223 reg_info.byte_size = 8;
224 reg_info.format = eFormatFloat;
225 reg_info.encoding = eEncodingIEEE754;
227 else if (reg_num >= dwarf_s0 && reg_num <= dwarf_s31)
229 reg_info.byte_size = 4;
230 reg_info.format = eFormatFloat;
231 reg_info.encoding = eEncodingIEEE754;
233 else if (reg_num >= dwarf_f0 && reg_num <= dwarf_f7)
235 reg_info.byte_size = 12;
236 reg_info.format = eFormatFloat;
237 reg_info.encoding = eEncodingIEEE754;
241 reg_info.byte_size = 4;
242 reg_info.format = eFormatHex;
243 reg_info.encoding = eEncodingUint;
246 reg_info.kinds[eRegisterKindDWARF] = reg_num;
250 case dwarf_r0: reg_info.name = "r0"; break;
251 case dwarf_r1: reg_info.name = "r1"; break;
252 case dwarf_r2: reg_info.name = "r2"; break;
253 case dwarf_r3: reg_info.name = "r3"; break;
254 case dwarf_r4: reg_info.name = "r4"; break;
255 case dwarf_r5: reg_info.name = "r5"; break;
256 case dwarf_r6: reg_info.name = "r6"; break;
257 case dwarf_r7: reg_info.name = "r7"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP; break;
258 case dwarf_r8: reg_info.name = "r8"; break;
259 case dwarf_r9: reg_info.name = "r9"; break;
260 case dwarf_r10: reg_info.name = "r10"; break;
261 case dwarf_r11: reg_info.name = "r11"; break;
262 case dwarf_r12: reg_info.name = "r12"; break;
263 case dwarf_sp: reg_info.name = "sp"; reg_info.alt_name = "r13"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; break;
264 case dwarf_lr: reg_info.name = "lr"; reg_info.alt_name = "r14"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; break;
265 case dwarf_pc: reg_info.name = "pc"; reg_info.alt_name = "r15"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; break;
266 case dwarf_cpsr:reg_info.name = "cpsr"; reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS; break;
268 case dwarf_s0: reg_info.name = "s0"; break;
269 case dwarf_s1: reg_info.name = "s1"; break;
270 case dwarf_s2: reg_info.name = "s2"; break;
271 case dwarf_s3: reg_info.name = "s3"; break;
272 case dwarf_s4: reg_info.name = "s4"; break;
273 case dwarf_s5: reg_info.name = "s5"; break;
274 case dwarf_s6: reg_info.name = "s6"; break;
275 case dwarf_s7: reg_info.name = "s7"; break;
276 case dwarf_s8: reg_info.name = "s8"; break;
277 case dwarf_s9: reg_info.name = "s9"; break;
278 case dwarf_s10: reg_info.name = "s10"; break;
279 case dwarf_s11: reg_info.name = "s11"; break;
280 case dwarf_s12: reg_info.name = "s12"; break;
281 case dwarf_s13: reg_info.name = "s13"; break;
282 case dwarf_s14: reg_info.name = "s14"; break;
283 case dwarf_s15: reg_info.name = "s15"; break;
284 case dwarf_s16: reg_info.name = "s16"; break;
285 case dwarf_s17: reg_info.name = "s17"; break;
286 case dwarf_s18: reg_info.name = "s18"; break;
287 case dwarf_s19: reg_info.name = "s19"; break;
288 case dwarf_s20: reg_info.name = "s20"; break;
289 case dwarf_s21: reg_info.name = "s21"; break;
290 case dwarf_s22: reg_info.name = "s22"; break;
291 case dwarf_s23: reg_info.name = "s23"; break;
292 case dwarf_s24: reg_info.name = "s24"; break;
293 case dwarf_s25: reg_info.name = "s25"; break;
294 case dwarf_s26: reg_info.name = "s26"; break;
295 case dwarf_s27: reg_info.name = "s27"; break;
296 case dwarf_s28: reg_info.name = "s28"; break;
297 case dwarf_s29: reg_info.name = "s29"; break;
298 case dwarf_s30: reg_info.name = "s30"; break;
299 case dwarf_s31: reg_info.name = "s31"; break;
302 case dwarf_f0: reg_info.name = "f0"; break;
303 case dwarf_f1: reg_info.name = "f1"; break;
304 case dwarf_f2: reg_info.name = "f2"; break;
305 case dwarf_f3: reg_info.name = "f3"; break;
306 case dwarf_f4: reg_info.name = "f4"; break;
307 case dwarf_f5: reg_info.name = "f5"; break;
308 case dwarf_f6: reg_info.name = "f6"; break;
309 case dwarf_f7: reg_info.name = "f7"; break;
311 // Intel wireless MMX general purpose registers 0 - 7
312 // XScale accumulator register 0 - 7 (they do overlap with wCGR0 - wCGR7)
313 case dwarf_wCGR0: reg_info.name = "wCGR0/ACC0"; break;
314 case dwarf_wCGR1: reg_info.name = "wCGR1/ACC1"; break;
315 case dwarf_wCGR2: reg_info.name = "wCGR2/ACC2"; break;
316 case dwarf_wCGR3: reg_info.name = "wCGR3/ACC3"; break;
317 case dwarf_wCGR4: reg_info.name = "wCGR4/ACC4"; break;
318 case dwarf_wCGR5: reg_info.name = "wCGR5/ACC5"; break;
319 case dwarf_wCGR6: reg_info.name = "wCGR6/ACC6"; break;
320 case dwarf_wCGR7: reg_info.name = "wCGR7/ACC7"; break;
322 // Intel wireless MMX data registers 0 - 15
323 case dwarf_wR0: reg_info.name = "wR0"; break;
324 case dwarf_wR1: reg_info.name = "wR1"; break;
325 case dwarf_wR2: reg_info.name = "wR2"; break;
326 case dwarf_wR3: reg_info.name = "wR3"; break;
327 case dwarf_wR4: reg_info.name = "wR4"; break;
328 case dwarf_wR5: reg_info.name = "wR5"; break;
329 case dwarf_wR6: reg_info.name = "wR6"; break;
330 case dwarf_wR7: reg_info.name = "wR7"; break;
331 case dwarf_wR8: reg_info.name = "wR8"; break;
332 case dwarf_wR9: reg_info.name = "wR9"; break;
333 case dwarf_wR10: reg_info.name = "wR10"; break;
334 case dwarf_wR11: reg_info.name = "wR11"; break;
335 case dwarf_wR12: reg_info.name = "wR12"; break;
336 case dwarf_wR13: reg_info.name = "wR13"; break;
337 case dwarf_wR14: reg_info.name = "wR14"; break;
338 case dwarf_wR15: reg_info.name = "wR15"; break;
340 case dwarf_spsr: reg_info.name = "spsr"; break;
341 case dwarf_spsr_fiq: reg_info.name = "spsr_fiq"; break;
342 case dwarf_spsr_irq: reg_info.name = "spsr_irq"; break;
343 case dwarf_spsr_abt: reg_info.name = "spsr_abt"; break;
344 case dwarf_spsr_und: reg_info.name = "spsr_und"; break;
345 case dwarf_spsr_svc: reg_info.name = "spsr_svc"; break;
347 case dwarf_r8_usr: reg_info.name = "r8_usr"; break;
348 case dwarf_r9_usr: reg_info.name = "r9_usr"; break;
349 case dwarf_r10_usr: reg_info.name = "r10_usr"; break;
350 case dwarf_r11_usr: reg_info.name = "r11_usr"; break;
351 case dwarf_r12_usr: reg_info.name = "r12_usr"; break;
352 case dwarf_r13_usr: reg_info.name = "r13_usr"; break;
353 case dwarf_r14_usr: reg_info.name = "r14_usr"; break;
354 case dwarf_r8_fiq: reg_info.name = "r8_fiq"; break;
355 case dwarf_r9_fiq: reg_info.name = "r9_fiq"; break;
356 case dwarf_r10_fiq: reg_info.name = "r10_fiq"; break;
357 case dwarf_r11_fiq: reg_info.name = "r11_fiq"; break;
358 case dwarf_r12_fiq: reg_info.name = "r12_fiq"; break;
359 case dwarf_r13_fiq: reg_info.name = "r13_fiq"; break;
360 case dwarf_r14_fiq: reg_info.name = "r14_fiq"; break;
361 case dwarf_r13_irq: reg_info.name = "r13_irq"; break;
362 case dwarf_r14_irq: reg_info.name = "r14_irq"; break;
363 case dwarf_r13_abt: reg_info.name = "r13_abt"; break;
364 case dwarf_r14_abt: reg_info.name = "r14_abt"; break;
365 case dwarf_r13_und: reg_info.name = "r13_und"; break;
366 case dwarf_r14_und: reg_info.name = "r14_und"; break;
367 case dwarf_r13_svc: reg_info.name = "r13_svc"; break;
368 case dwarf_r14_svc: reg_info.name = "r14_svc"; break;
370 // Intel wireless MMX control register in co-processor 0 - 7
371 case dwarf_wC0: reg_info.name = "wC0"; break;
372 case dwarf_wC1: reg_info.name = "wC1"; break;
373 case dwarf_wC2: reg_info.name = "wC2"; break;
374 case dwarf_wC3: reg_info.name = "wC3"; break;
375 case dwarf_wC4: reg_info.name = "wC4"; break;
376 case dwarf_wC5: reg_info.name = "wC5"; break;
377 case dwarf_wC6: reg_info.name = "wC6"; break;
378 case dwarf_wC7: reg_info.name = "wC7"; break;
381 case dwarf_d0: reg_info.name = "d0"; break;
382 case dwarf_d1: reg_info.name = "d1"; break;
383 case dwarf_d2: reg_info.name = "d2"; break;
384 case dwarf_d3: reg_info.name = "d3"; break;
385 case dwarf_d4: reg_info.name = "d4"; break;
386 case dwarf_d5: reg_info.name = "d5"; break;
387 case dwarf_d6: reg_info.name = "d6"; break;
388 case dwarf_d7: reg_info.name = "d7"; break;
389 case dwarf_d8: reg_info.name = "d8"; break;
390 case dwarf_d9: reg_info.name = "d9"; break;
391 case dwarf_d10: reg_info.name = "d10"; break;
392 case dwarf_d11: reg_info.name = "d11"; break;
393 case dwarf_d12: reg_info.name = "d12"; break;
394 case dwarf_d13: reg_info.name = "d13"; break;
395 case dwarf_d14: reg_info.name = "d14"; break;
396 case dwarf_d15: reg_info.name = "d15"; break;
397 case dwarf_d16: reg_info.name = "d16"; break;
398 case dwarf_d17: reg_info.name = "d17"; break;
399 case dwarf_d18: reg_info.name = "d18"; break;
400 case dwarf_d19: reg_info.name = "d19"; break;
401 case dwarf_d20: reg_info.name = "d20"; break;
402 case dwarf_d21: reg_info.name = "d21"; break;
403 case dwarf_d22: reg_info.name = "d22"; break;
404 case dwarf_d23: reg_info.name = "d23"; break;
405 case dwarf_d24: reg_info.name = "d24"; break;
406 case dwarf_d25: reg_info.name = "d25"; break;
407 case dwarf_d26: reg_info.name = "d26"; break;
408 case dwarf_d27: reg_info.name = "d27"; break;
409 case dwarf_d28: reg_info.name = "d28"; break;
410 case dwarf_d29: reg_info.name = "d29"; break;
411 case dwarf_d30: reg_info.name = "d30"; break;
412 case dwarf_d31: reg_info.name = "d31"; break;
414 // NEON 128-bit vector registers (overlays the d registers)
415 case dwarf_q0: reg_info.name = "q0"; break;
416 case dwarf_q1: reg_info.name = "q1"; break;
417 case dwarf_q2: reg_info.name = "q2"; break;
418 case dwarf_q3: reg_info.name = "q3"; break;
419 case dwarf_q4: reg_info.name = "q4"; break;
420 case dwarf_q5: reg_info.name = "q5"; break;
421 case dwarf_q6: reg_info.name = "q6"; break;
422 case dwarf_q7: reg_info.name = "q7"; break;
423 case dwarf_q8: reg_info.name = "q8"; break;
424 case dwarf_q9: reg_info.name = "q9"; break;
425 case dwarf_q10: reg_info.name = "q10"; break;
426 case dwarf_q11: reg_info.name = "q11"; break;
427 case dwarf_q12: reg_info.name = "q12"; break;
428 case dwarf_q13: reg_info.name = "q13"; break;
429 case dwarf_q14: reg_info.name = "q14"; break;
430 case dwarf_q15: reg_info.name = "q15"; break;
432 default: return false;