CodeViewRegisterMapping.cpp revision 355940
1//===-- CodeViewRegisterMapping.cpp -----------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "CodeViewRegisterMapping.h"
10
11#include "lldb/lldb-defines.h"
12
13#include "Plugins/Process/Utility/lldb-x86-register-enums.h"
14
15using namespace lldb_private;
16
17static const uint32_t g_code_view_to_lldb_registers_x86[] = {
18    LLDB_INVALID_REGNUM, // NONE
19    lldb_al_i386,        // AL
20    lldb_cl_i386,        // CL
21    lldb_dl_i386,        // DL
22    lldb_bl_i386,        // BL
23    lldb_ah_i386,        // AH
24    lldb_ch_i386,        // CH
25    lldb_dh_i386,        // DH
26    lldb_bh_i386,        // BH
27    lldb_ax_i386,        // AX
28    lldb_cx_i386,        // CX
29    lldb_dx_i386,        // DX
30    lldb_bx_i386,        // BX
31    lldb_sp_i386,        // SP
32    lldb_bp_i386,        // BP
33    lldb_si_i386,        // SI
34    lldb_di_i386,        // DI
35    lldb_eax_i386,       // EAX
36    lldb_ecx_i386,       // ECX
37    lldb_edx_i386,       // EDX
38    lldb_ebx_i386,       // EBX
39    lldb_esp_i386,       // ESP
40    lldb_ebp_i386,       // EBP
41    lldb_esi_i386,       // ESI
42    lldb_edi_i386,       // EDI
43    lldb_es_i386,        // ES
44    lldb_cs_i386,        // CS
45    lldb_ss_i386,        // SS
46    lldb_ds_i386,        // DS
47    lldb_fs_i386,        // FS
48    lldb_gs_i386,        // GS
49    LLDB_INVALID_REGNUM, // IP
50    LLDB_INVALID_REGNUM, // FLAGS
51    lldb_eip_i386,       // EIP
52    lldb_eflags_i386,    // EFLAGS
53    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
54    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
55    LLDB_INVALID_REGNUM, // TEMP
56    LLDB_INVALID_REGNUM, // TEMPH
57    LLDB_INVALID_REGNUM, // QUOTE
58    LLDB_INVALID_REGNUM, // PCDR3
59    LLDB_INVALID_REGNUM, // PCDR4
60    LLDB_INVALID_REGNUM, // PCDR5
61    LLDB_INVALID_REGNUM, // PCDR6
62    LLDB_INVALID_REGNUM, // PCDR7
63    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
64    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
65    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
66    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
67    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
68    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
69    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
70    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
71    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
72    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
73    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
74    LLDB_INVALID_REGNUM, // CR0
75    LLDB_INVALID_REGNUM, // CR1
76    LLDB_INVALID_REGNUM, // CR2
77    LLDB_INVALID_REGNUM, // CR3
78    LLDB_INVALID_REGNUM, // CR4
79    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
80    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
81    lldb_dr0_i386, // DR0
82    lldb_dr1_i386, // DR1
83    lldb_dr2_i386, // DR2
84    lldb_dr3_i386, // DR3
85    lldb_dr4_i386, // DR4
86    lldb_dr5_i386, // DR5
87    lldb_dr6_i386, // DR6
88    lldb_dr7_i386, // DR7
89    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
90    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
91    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
92    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
93    LLDB_INVALID_REGNUM, // GDTR
94    LLDB_INVALID_REGNUM, // GDTL
95    LLDB_INVALID_REGNUM, // IDTR
96    LLDB_INVALID_REGNUM, // IDTL
97    LLDB_INVALID_REGNUM, // LDTR
98    LLDB_INVALID_REGNUM, // TR
99    LLDB_INVALID_REGNUM, // PSEUDO1
100    LLDB_INVALID_REGNUM, // PSEUDO2
101    LLDB_INVALID_REGNUM, // PSEUDO3
102    LLDB_INVALID_REGNUM, // PSEUDO4
103    LLDB_INVALID_REGNUM, // PSEUDO5
104    LLDB_INVALID_REGNUM, // PSEUDO6
105    LLDB_INVALID_REGNUM, // PSEUDO7
106    LLDB_INVALID_REGNUM, // PSEUDO8
107    LLDB_INVALID_REGNUM, // PSEUDO9
108    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
109    lldb_st0_i386,       // ST0
110    lldb_st1_i386,       // ST1
111    lldb_st2_i386,       // ST2
112    lldb_st3_i386,       // ST3
113    lldb_st4_i386,       // ST4
114    lldb_st5_i386,       // ST5
115    lldb_st6_i386,       // ST6
116    lldb_st7_i386,       // ST7
117    LLDB_INVALID_REGNUM, // CTRL
118    LLDB_INVALID_REGNUM, // STAT
119    LLDB_INVALID_REGNUM, // TAG
120    LLDB_INVALID_REGNUM, // FPIP
121    LLDB_INVALID_REGNUM, // FPCS
122    LLDB_INVALID_REGNUM, // FPDO
123    LLDB_INVALID_REGNUM, // FPDS
124    LLDB_INVALID_REGNUM, // ISEM
125    LLDB_INVALID_REGNUM, // FPEIP
126    LLDB_INVALID_REGNUM, // FPEDO
127    lldb_mm0_i386,       // MM0
128    lldb_mm1_i386,       // MM1
129    lldb_mm2_i386,       // MM2
130    lldb_mm3_i386,       // MM3
131    lldb_mm4_i386,       // MM4
132    lldb_mm5_i386,       // MM5
133    lldb_mm6_i386,       // MM6
134    lldb_mm7_i386,       // MM7
135    lldb_xmm0_i386,      // XMM0
136    lldb_xmm1_i386,      // XMM1
137    lldb_xmm2_i386,      // XMM2
138    lldb_xmm3_i386,      // XMM3
139    lldb_xmm4_i386,      // XMM4
140    lldb_xmm5_i386,      // XMM5
141    lldb_xmm6_i386,      // XMM6
142    lldb_xmm7_i386       // XMM7
143};
144
145static const uint32_t g_code_view_to_lldb_registers_x86_64[] = {
146    LLDB_INVALID_REGNUM, // NONE
147    lldb_al_x86_64,      // AL
148    lldb_cl_x86_64,      // CL
149    lldb_dl_x86_64,      // DL
150    lldb_bl_x86_64,      // BL
151    lldb_ah_x86_64,      // AH
152    lldb_ch_x86_64,      // CH
153    lldb_dh_x86_64,      // DH
154    lldb_bh_x86_64,      // BH
155    lldb_ax_x86_64,      // AX
156    lldb_cx_x86_64,      // CX
157    lldb_dx_x86_64,      // DX
158    lldb_bx_x86_64,      // BX
159    lldb_sp_x86_64,      // SP
160    lldb_bp_x86_64,      // BP
161    lldb_si_x86_64,      // SI
162    lldb_di_x86_64,      // DI
163    lldb_eax_x86_64,     // EAX
164    lldb_ecx_x86_64,     // ECX
165    lldb_edx_x86_64,     // EDX
166    lldb_ebx_x86_64,     // EBX
167    lldb_esp_x86_64,     // ESP
168    lldb_ebp_x86_64,     // EBP
169    lldb_esi_x86_64,     // ESI
170    lldb_edi_x86_64,     // EDI
171    lldb_es_x86_64,      // ES
172    lldb_cs_x86_64,      // CS
173    lldb_ss_x86_64,      // SS
174    lldb_ds_x86_64,      // DS
175    lldb_fs_x86_64,      // FS
176    lldb_gs_x86_64,      // GS
177    LLDB_INVALID_REGNUM, // IP
178    LLDB_INVALID_REGNUM, // FLAGS
179    LLDB_INVALID_REGNUM, // EIP
180    LLDB_INVALID_REGNUM, // EFLAGS
181    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
182    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
183    LLDB_INVALID_REGNUM, // TEMP
184    LLDB_INVALID_REGNUM, // TEMPH
185    LLDB_INVALID_REGNUM, // QUOTE
186    LLDB_INVALID_REGNUM, // PCDR3
187    LLDB_INVALID_REGNUM, // PCDR4
188    LLDB_INVALID_REGNUM, // PCDR5
189    LLDB_INVALID_REGNUM, // PCDR6
190    LLDB_INVALID_REGNUM, // PCDR7
191    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
192    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
193    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
194    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
195    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
196    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
197    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
198    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
199    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
200    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
201    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
202    LLDB_INVALID_REGNUM, // CR0
203    LLDB_INVALID_REGNUM, // CR1
204    LLDB_INVALID_REGNUM, // CR2
205    LLDB_INVALID_REGNUM, // CR3
206    LLDB_INVALID_REGNUM, // CR4
207    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
208    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
209    lldb_dr0_x86_64, // DR0
210    lldb_dr1_x86_64, // DR1
211    lldb_dr2_x86_64, // DR2
212    lldb_dr3_x86_64, // DR3
213    lldb_dr4_x86_64, // DR4
214    lldb_dr5_x86_64, // DR5
215    lldb_dr6_x86_64, // DR6
216    lldb_dr7_x86_64, // DR7
217    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
218    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
219    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
220    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
221    LLDB_INVALID_REGNUM, // GDTR
222    LLDB_INVALID_REGNUM, // GDTL
223    LLDB_INVALID_REGNUM, // IDTR
224    LLDB_INVALID_REGNUM, // IDTL
225    LLDB_INVALID_REGNUM, // LDTR
226    LLDB_INVALID_REGNUM, // TR
227    LLDB_INVALID_REGNUM, // PSEUDO1
228    LLDB_INVALID_REGNUM, // PSEUDO2
229    LLDB_INVALID_REGNUM, // PSEUDO3
230    LLDB_INVALID_REGNUM, // PSEUDO4
231    LLDB_INVALID_REGNUM, // PSEUDO5
232    LLDB_INVALID_REGNUM, // PSEUDO6
233    LLDB_INVALID_REGNUM, // PSEUDO7
234    LLDB_INVALID_REGNUM, // PSEUDO8
235    LLDB_INVALID_REGNUM, // PSEUDO9
236    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
237    lldb_st0_x86_64,     // ST0
238    lldb_st1_x86_64,     // ST1
239    lldb_st2_x86_64,     // ST2
240    lldb_st3_x86_64,     // ST3
241    lldb_st4_x86_64,     // ST4
242    lldb_st5_x86_64,     // ST5
243    lldb_st6_x86_64,     // ST6
244    lldb_st7_x86_64,     // ST7
245    LLDB_INVALID_REGNUM, // CTRL
246    LLDB_INVALID_REGNUM, // STAT
247    LLDB_INVALID_REGNUM, // TAG
248    LLDB_INVALID_REGNUM, // FPIP
249    LLDB_INVALID_REGNUM, // FPCS
250    LLDB_INVALID_REGNUM, // FPDO
251    LLDB_INVALID_REGNUM, // FPDS
252    LLDB_INVALID_REGNUM, // ISEM
253    LLDB_INVALID_REGNUM, // FPEIP
254    LLDB_INVALID_REGNUM, // FPEDO
255    lldb_mm0_x86_64,     // MM0
256    lldb_mm1_x86_64,     // MM1
257    lldb_mm2_x86_64,     // MM2
258    lldb_mm3_x86_64,     // MM3
259    lldb_mm4_x86_64,     // MM4
260    lldb_mm5_x86_64,     // MM5
261    lldb_mm6_x86_64,     // MM6
262    lldb_mm7_x86_64,     // MM7
263    lldb_xmm0_x86_64,    // XMM0
264    lldb_xmm1_x86_64,    // XMM1
265    lldb_xmm2_x86_64,    // XMM2
266    lldb_xmm3_x86_64,    // XMM3
267    lldb_xmm4_x86_64,    // XMM4
268    lldb_xmm5_x86_64,    // XMM5
269    lldb_xmm6_x86_64,    // XMM6
270    lldb_xmm7_x86_64,    // XMM7
271    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
272    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
273    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
274    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
275    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
276    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
277    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
278    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
279    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
280    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
281    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
282    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
283    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
284    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
285    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
286    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
287    LLDB_INVALID_REGNUM,
288    lldb_mxcsr_x86_64,   // MXCSR
289    LLDB_INVALID_REGNUM, // EDXEAX
290    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
291    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
292    LLDB_INVALID_REGNUM,
293    LLDB_INVALID_REGNUM, // EMM0L
294    LLDB_INVALID_REGNUM, // EMM1L
295    LLDB_INVALID_REGNUM, // EMM2L
296    LLDB_INVALID_REGNUM, // EMM3L
297    LLDB_INVALID_REGNUM, // EMM4L
298    LLDB_INVALID_REGNUM, // EMM5L
299    LLDB_INVALID_REGNUM, // EMM6L
300    LLDB_INVALID_REGNUM, // EMM7L
301    LLDB_INVALID_REGNUM, // EMM0H
302    LLDB_INVALID_REGNUM, // EMM1H
303    LLDB_INVALID_REGNUM, // EMM2H
304    LLDB_INVALID_REGNUM, // EMM3H
305    LLDB_INVALID_REGNUM, // EMM4H
306    LLDB_INVALID_REGNUM, // EMM5H
307    LLDB_INVALID_REGNUM, // EMM6H
308    LLDB_INVALID_REGNUM, // EMM7H
309    LLDB_INVALID_REGNUM, // MM00
310    LLDB_INVALID_REGNUM, // MM01
311    LLDB_INVALID_REGNUM, // MM10
312    LLDB_INVALID_REGNUM, // MM11
313    LLDB_INVALID_REGNUM, // MM20
314    LLDB_INVALID_REGNUM, // MM21
315    LLDB_INVALID_REGNUM, // MM30
316    LLDB_INVALID_REGNUM, // MM31
317    LLDB_INVALID_REGNUM, // MM40
318    LLDB_INVALID_REGNUM, // MM41
319    LLDB_INVALID_REGNUM, // MM50
320    LLDB_INVALID_REGNUM, // MM51
321    LLDB_INVALID_REGNUM, // MM60
322    LLDB_INVALID_REGNUM, // MM61
323    LLDB_INVALID_REGNUM, // MM70
324    LLDB_INVALID_REGNUM, // MM71
325    lldb_xmm8_x86_64,    // XMM8
326    lldb_xmm9_x86_64,    // XMM9
327    lldb_xmm10_x86_64,   // XMM10
328    lldb_xmm11_x86_64,   // XMM11
329    lldb_xmm12_x86_64,   // XMM12
330    lldb_xmm13_x86_64,   // XMM13
331    lldb_xmm14_x86_64,   // XMM14
332    lldb_xmm15_x86_64,   // XMM15
333    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
334    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
335    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
336    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
337    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
338    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
339    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
340    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
341    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
342    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
343    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
344    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
345    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
346    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
347    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
348    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
349    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
350    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
351    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
352    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
353    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
354    LLDB_INVALID_REGNUM,
355    lldb_sil_x86_64,   // SIL
356    lldb_dil_x86_64,   // DIL
357    lldb_bpl_x86_64,   // BPL
358    lldb_spl_x86_64,   // SPL
359    lldb_rax_x86_64,   // RAX
360    lldb_rbx_x86_64,   // RBX
361    lldb_rcx_x86_64,   // RCX
362    lldb_rdx_x86_64,   // RDX
363    lldb_rsi_x86_64,   // RSI
364    lldb_rdi_x86_64,   // RDI
365    lldb_rbp_x86_64,   // RBP
366    lldb_rsp_x86_64,   // RSP
367    lldb_r8_x86_64,    // R8
368    lldb_r9_x86_64,    // R9
369    lldb_r10_x86_64,   // R10
370    lldb_r11_x86_64,   // R11
371    lldb_r12_x86_64,   // R12
372    lldb_r13_x86_64,   // R13
373    lldb_r14_x86_64,   // R14
374    lldb_r15_x86_64,   // R15
375    lldb_r8l_x86_64,   // R8B
376    lldb_r9l_x86_64,   // R9B
377    lldb_r10l_x86_64,  // R10B
378    lldb_r11l_x86_64,  // R11B
379    lldb_r12l_x86_64,  // R12B
380    lldb_r13l_x86_64,  // R13B
381    lldb_r14l_x86_64,  // R14B
382    lldb_r15l_x86_64,  // R15B
383    lldb_r8w_x86_64,   // R8W
384    lldb_r9w_x86_64,   // R9W
385    lldb_r10w_x86_64,  // R10W
386    lldb_r11w_x86_64,  // R11W
387    lldb_r12w_x86_64,  // R12W
388    lldb_r13w_x86_64,  // R13W
389    lldb_r14w_x86_64,  // R14W
390    lldb_r15w_x86_64,  // R15W
391    lldb_r8d_x86_64,   // R8D
392    lldb_r9d_x86_64,   // R9D
393    lldb_r10d_x86_64,  // R10D
394    lldb_r11d_x86_64,  // R11D
395    lldb_r12d_x86_64,  // R12D
396    lldb_r13d_x86_64,  // R13D
397    lldb_r14d_x86_64,  // R14D
398    lldb_r15d_x86_64,  // R15D
399    lldb_ymm0_x86_64,  // AMD64_YMM0
400    lldb_ymm1_x86_64,  // AMD64_YMM1
401    lldb_ymm2_x86_64,  // AMD64_YMM2
402    lldb_ymm3_x86_64,  // AMD64_YMM3
403    lldb_ymm4_x86_64,  // AMD64_YMM4
404    lldb_ymm5_x86_64,  // AMD64_YMM5
405    lldb_ymm6_x86_64,  // AMD64_YMM6
406    lldb_ymm7_x86_64,  // AMD64_YMM7
407    lldb_ymm8_x86_64,  // AMD64_YMM8
408    lldb_ymm9_x86_64,  // AMD64_YMM9
409    lldb_ymm10_x86_64, // AMD64_YMM10
410    lldb_ymm11_x86_64, // AMD64_YMM11
411    lldb_ymm12_x86_64, // AMD64_YMM12
412    lldb_ymm13_x86_64, // AMD64_YMM13
413    lldb_ymm14_x86_64, // AMD64_YMM14
414    lldb_ymm15_x86_64, // AMD64_YMM15
415    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
416    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
417    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
418    LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
419    lldb_bnd0_x86_64, // BND0
420    lldb_bnd1_x86_64, // BND1
421    lldb_bnd2_x86_64  // BND2
422};
423
424uint32_t lldb_private::npdb::GetLLDBRegisterNumber(
425    llvm::Triple::ArchType arch_type, llvm::codeview::RegisterId register_id) {
426  switch (arch_type) {
427  case llvm::Triple::x86:
428    if (static_cast<uint16_t>(register_id) <
429        sizeof(g_code_view_to_lldb_registers_x86) /
430            sizeof(g_code_view_to_lldb_registers_x86[0]))
431      return g_code_view_to_lldb_registers_x86[static_cast<uint16_t>(
432          register_id)];
433
434    switch (register_id) {
435    case llvm::codeview::RegisterId::MXCSR:
436      return lldb_mxcsr_i386;
437    case llvm::codeview::RegisterId::BND0:
438      return lldb_bnd0_i386;
439    case llvm::codeview::RegisterId::BND1:
440      return lldb_bnd1_i386;
441    case llvm::codeview::RegisterId::BND2:
442      return lldb_bnd2_i386;
443    default:
444      return LLDB_INVALID_REGNUM;
445    }
446  case llvm::Triple::x86_64:
447    if (static_cast<uint16_t>(register_id) <
448        sizeof(g_code_view_to_lldb_registers_x86_64) /
449            sizeof(g_code_view_to_lldb_registers_x86_64[0]))
450      return g_code_view_to_lldb_registers_x86_64[static_cast<uint16_t>(
451          register_id)];
452
453    return LLDB_INVALID_REGNUM;
454  default:
455    return LLDB_INVALID_REGNUM;
456  }
457}
458