1 //===-- RegisterInfos_x86_64_with_base_shared.cpp--------------------------===//
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 "RegisterInfos_x86_64_with_base_shared.h"
10 
11 #include "lldb/lldb-defines.h"
12 #include <mutex>
13 
14 using namespace lldb;
15 
16 namespace lldb_private {
17 
18 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_eax[] = {
19     lldb_eax_i386, LLDB_INVALID_REGNUM};
20 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_ebx[] = {
21     lldb_ebx_i386, LLDB_INVALID_REGNUM};
22 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_ecx[] = {
23     lldb_ecx_i386, LLDB_INVALID_REGNUM};
24 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_edx[] = {
25     lldb_edx_i386, LLDB_INVALID_REGNUM};
26 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_edi[] = {
27     lldb_edi_i386, LLDB_INVALID_REGNUM};
28 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_esi[] = {
29     lldb_esi_i386, LLDB_INVALID_REGNUM};
30 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_ebp[] = {
31     lldb_ebp_i386, LLDB_INVALID_REGNUM};
32 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_esp[] = {
33     lldb_esp_i386, LLDB_INVALID_REGNUM};
34 
35 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_eax[] = {
36     lldb_eax_i386, lldb_ax_i386, lldb_ah_i386, lldb_al_i386,
37     LLDB_INVALID_REGNUM};
38 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_ebx[] = {
39     lldb_ebx_i386, lldb_bx_i386, lldb_bh_i386, lldb_bl_i386,
40     LLDB_INVALID_REGNUM};
41 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_ecx[] = {
42     lldb_ecx_i386, lldb_cx_i386, lldb_ch_i386, lldb_cl_i386,
43     LLDB_INVALID_REGNUM};
44 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_edx[] = {
45     lldb_edx_i386, lldb_dx_i386, lldb_dh_i386, lldb_dl_i386,
46     LLDB_INVALID_REGNUM};
47 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_edi[] = {
48     lldb_edi_i386, lldb_di_i386, LLDB_INVALID_REGNUM};
49 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_esi[] = {
50     lldb_esi_i386, lldb_si_i386, LLDB_INVALID_REGNUM};
51 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_ebp[] = {
52     lldb_ebp_i386, lldb_bp_i386, LLDB_INVALID_REGNUM};
53 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_esp[] = {
54     lldb_esp_i386, lldb_sp_i386, LLDB_INVALID_REGNUM};
55 
56 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rax[] = {
57     x86_64_with_base::lldb_rax, LLDB_INVALID_REGNUM};
58 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rbx[] = {
59     x86_64_with_base::lldb_rbx, LLDB_INVALID_REGNUM};
60 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rcx[] = {
61     x86_64_with_base::lldb_rcx, LLDB_INVALID_REGNUM};
62 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rdx[] = {
63     x86_64_with_base::lldb_rdx, LLDB_INVALID_REGNUM};
64 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rdi[] = {
65     x86_64_with_base::lldb_rdi, LLDB_INVALID_REGNUM};
66 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rsi[] = {
67     x86_64_with_base::lldb_rsi, LLDB_INVALID_REGNUM};
68 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rbp[] = {
69     x86_64_with_base::lldb_rbp, LLDB_INVALID_REGNUM};
70 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_rsp[] = {
71     x86_64_with_base::lldb_rsp, LLDB_INVALID_REGNUM};
72 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r8[] = {
73     x86_64_with_base::lldb_r8, LLDB_INVALID_REGNUM};
74 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r9[] = {
75     x86_64_with_base::lldb_r9, LLDB_INVALID_REGNUM};
76 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r10[] = {
77     x86_64_with_base::lldb_r10, LLDB_INVALID_REGNUM};
78 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r11[] = {
79     x86_64_with_base::lldb_r11, LLDB_INVALID_REGNUM};
80 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r12[] = {
81     x86_64_with_base::lldb_r12, LLDB_INVALID_REGNUM};
82 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r13[] = {
83     x86_64_with_base::lldb_r13, LLDB_INVALID_REGNUM};
84 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r14[] = {
85     x86_64_with_base::lldb_r14, LLDB_INVALID_REGNUM};
86 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_r15[] = {
87     x86_64_with_base::lldb_r15, LLDB_INVALID_REGNUM};
88 
89 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rax[] = {
90     x86_64_with_base::lldb_rax, x86_64_with_base::lldb_eax,
91     x86_64_with_base::lldb_ax,  x86_64_with_base::lldb_ah,
92     x86_64_with_base::lldb_al,  LLDB_INVALID_REGNUM};
93 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rbx[] = {
94     x86_64_with_base::lldb_rbx, x86_64_with_base::lldb_ebx,
95     x86_64_with_base::lldb_bx,  x86_64_with_base::lldb_bh,
96     x86_64_with_base::lldb_bl,  LLDB_INVALID_REGNUM};
97 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rcx[] = {
98     x86_64_with_base::lldb_rcx, x86_64_with_base::lldb_ecx,
99     x86_64_with_base::lldb_cx,  x86_64_with_base::lldb_ch,
100     x86_64_with_base::lldb_cl,  LLDB_INVALID_REGNUM};
101 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rdx[] = {
102     x86_64_with_base::lldb_rdx, x86_64_with_base::lldb_edx,
103     x86_64_with_base::lldb_dx,  x86_64_with_base::lldb_dh,
104     x86_64_with_base::lldb_dl,  LLDB_INVALID_REGNUM};
105 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rdi[] = {
106     x86_64_with_base::lldb_rdi, x86_64_with_base::lldb_edi,
107     x86_64_with_base::lldb_di, x86_64_with_base::lldb_dil, LLDB_INVALID_REGNUM};
108 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rsi[] = {
109     x86_64_with_base::lldb_rsi, x86_64_with_base::lldb_esi,
110     x86_64_with_base::lldb_si, x86_64_with_base::lldb_sil, LLDB_INVALID_REGNUM};
111 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rbp[] = {
112     x86_64_with_base::lldb_rbp, x86_64_with_base::lldb_ebp,
113     x86_64_with_base::lldb_bp, x86_64_with_base::lldb_bpl, LLDB_INVALID_REGNUM};
114 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_rsp[] = {
115     x86_64_with_base::lldb_rsp, x86_64_with_base::lldb_esp,
116     x86_64_with_base::lldb_sp, x86_64_with_base::lldb_spl, LLDB_INVALID_REGNUM};
117 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r8[] = {
118     x86_64_with_base::lldb_r8, x86_64_with_base::lldb_r8d,
119     x86_64_with_base::lldb_r8w, x86_64_with_base::lldb_r8l,
120     LLDB_INVALID_REGNUM};
121 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r9[] = {
122     x86_64_with_base::lldb_r9, x86_64_with_base::lldb_r9d,
123     x86_64_with_base::lldb_r9w, x86_64_with_base::lldb_r9l,
124     LLDB_INVALID_REGNUM};
125 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r10[] = {
126     x86_64_with_base::lldb_r10, x86_64_with_base::lldb_r10d,
127     x86_64_with_base::lldb_r10w, x86_64_with_base::lldb_r10l,
128     LLDB_INVALID_REGNUM};
129 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r11[] = {
130     x86_64_with_base::lldb_r11, x86_64_with_base::lldb_r11d,
131     x86_64_with_base::lldb_r11w, x86_64_with_base::lldb_r11l,
132     LLDB_INVALID_REGNUM};
133 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r12[] = {
134     x86_64_with_base::lldb_r12, x86_64_with_base::lldb_r12d,
135     x86_64_with_base::lldb_r12w, x86_64_with_base::lldb_r12l,
136     LLDB_INVALID_REGNUM};
137 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r13[] = {
138     x86_64_with_base::lldb_r13, x86_64_with_base::lldb_r13d,
139     x86_64_with_base::lldb_r13w, x86_64_with_base::lldb_r13l,
140     LLDB_INVALID_REGNUM};
141 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r14[] = {
142     x86_64_with_base::lldb_r14, x86_64_with_base::lldb_r14d,
143     x86_64_with_base::lldb_r14w, x86_64_with_base::lldb_r14l,
144     LLDB_INVALID_REGNUM};
145 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_r15[] = {
146     x86_64_with_base::lldb_r15, x86_64_with_base::lldb_r15d,
147     x86_64_with_base::lldb_r15w, x86_64_with_base::lldb_r15l,
148     LLDB_INVALID_REGNUM};
149 
150 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_fip[] = {
151     x86_64_with_base::lldb_fip, LLDB_INVALID_REGNUM};
152 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_fdp[] = {
153     x86_64_with_base::lldb_fdp, LLDB_INVALID_REGNUM};
154 
155 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_fip[] = {
156     x86_64_with_base::lldb_fip, x86_64_with_base::lldb_fioff,
157     x86_64_with_base::lldb_fiseg, LLDB_INVALID_REGNUM};
158 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_fdp[] = {
159     x86_64_with_base::lldb_fdp, x86_64_with_base::lldb_fooff,
160     x86_64_with_base::lldb_foseg, LLDB_INVALID_REGNUM};
161 
162 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st0_32[] = {
163     lldb_st0_i386, LLDB_INVALID_REGNUM};
164 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st1_32[] = {
165     lldb_st1_i386, LLDB_INVALID_REGNUM};
166 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st2_32[] = {
167     lldb_st2_i386, LLDB_INVALID_REGNUM};
168 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st3_32[] = {
169     lldb_st3_i386, LLDB_INVALID_REGNUM};
170 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st4_32[] = {
171     lldb_st4_i386, LLDB_INVALID_REGNUM};
172 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st5_32[] = {
173     lldb_st5_i386, LLDB_INVALID_REGNUM};
174 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st6_32[] = {
175     lldb_st6_i386, LLDB_INVALID_REGNUM};
176 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st7_32[] = {
177     lldb_st7_i386, LLDB_INVALID_REGNUM};
178 
179 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st0_32[] = {
180     lldb_st0_i386, lldb_mm0_i386, LLDB_INVALID_REGNUM};
181 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st1_32[] = {
182     lldb_st1_i386, lldb_mm1_i386, LLDB_INVALID_REGNUM};
183 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st2_32[] = {
184     lldb_st2_i386, lldb_mm2_i386, LLDB_INVALID_REGNUM};
185 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st3_32[] = {
186     lldb_st3_i386, lldb_mm3_i386, LLDB_INVALID_REGNUM};
187 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st4_32[] = {
188     lldb_st4_i386, lldb_mm4_i386, LLDB_INVALID_REGNUM};
189 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st5_32[] = {
190     lldb_st5_i386, lldb_mm5_i386, LLDB_INVALID_REGNUM};
191 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st6_32[] = {
192     lldb_st6_i386, lldb_mm6_i386, LLDB_INVALID_REGNUM};
193 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st7_32[] = {
194     lldb_st7_i386, lldb_mm7_i386, LLDB_INVALID_REGNUM};
195 
196 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st0_64[] = {
197     x86_64_with_base::lldb_st0, LLDB_INVALID_REGNUM};
198 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st1_64[] = {
199     x86_64_with_base::lldb_st1, LLDB_INVALID_REGNUM};
200 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st2_64[] = {
201     x86_64_with_base::lldb_st2, LLDB_INVALID_REGNUM};
202 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st3_64[] = {
203     x86_64_with_base::lldb_st3, LLDB_INVALID_REGNUM};
204 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st4_64[] = {
205     x86_64_with_base::lldb_st4, LLDB_INVALID_REGNUM};
206 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st5_64[] = {
207     x86_64_with_base::lldb_st5, LLDB_INVALID_REGNUM};
208 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st6_64[] = {
209     x86_64_with_base::lldb_st6, LLDB_INVALID_REGNUM};
210 uint32_t RegisterInfos_x86_64_with_base_shared::g_contained_st7_64[] = {
211     x86_64_with_base::lldb_st7, LLDB_INVALID_REGNUM};
212 
213 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st0_64[] = {
214     x86_64_with_base::lldb_st0, x86_64_with_base::lldb_mm0,
215     LLDB_INVALID_REGNUM};
216 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st1_64[] = {
217     x86_64_with_base::lldb_st1, x86_64_with_base::lldb_mm1,
218     LLDB_INVALID_REGNUM};
219 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st2_64[] = {
220     x86_64_with_base::lldb_st2, x86_64_with_base::lldb_mm2,
221     LLDB_INVALID_REGNUM};
222 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st3_64[] = {
223     x86_64_with_base::lldb_st3, x86_64_with_base::lldb_mm3,
224     LLDB_INVALID_REGNUM};
225 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st4_64[] = {
226     x86_64_with_base::lldb_st4, x86_64_with_base::lldb_mm4,
227     LLDB_INVALID_REGNUM};
228 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st5_64[] = {
229     x86_64_with_base::lldb_st5, x86_64_with_base::lldb_mm5,
230     LLDB_INVALID_REGNUM};
231 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st6_64[] = {
232     x86_64_with_base::lldb_st6, x86_64_with_base::lldb_mm6,
233     LLDB_INVALID_REGNUM};
234 uint32_t RegisterInfos_x86_64_with_base_shared::g_invalidate_st7_64[] = {
235     x86_64_with_base::lldb_st7, x86_64_with_base::lldb_mm7,
236     LLDB_INVALID_REGNUM};
237 
238 RegInfo &GetRegInfoShared(llvm::Triple::ArchType arch_type, bool with_base) {
239   static std::once_flag once_flag_x86, once_flag_x86_64,
240       once_flag_x86_64_with_base;
241   static RegInfo reg_info_x86, reg_info_x86_64, reg_info_x86_64_with_base, reg_info_invalid;
242 
243   switch (arch_type) {
244   case llvm::Triple::x86:
245     std::call_once(once_flag_x86, []() {
246       reg_info_x86.num_registers = k_num_registers_i386;
247       reg_info_x86.num_gpr_registers = k_num_gpr_registers_i386;
248       reg_info_x86.num_fpr_registers = k_num_fpr_registers_i386;
249       reg_info_x86.num_avx_registers = k_num_avx_registers_i386;
250       reg_info_x86.last_gpr = k_last_gpr_i386;
251       reg_info_x86.first_fpr = k_first_fpr_i386;
252       reg_info_x86.last_fpr = k_last_fpr_i386;
253       reg_info_x86.first_st = lldb_st0_i386;
254       reg_info_x86.last_st = lldb_st7_i386;
255       reg_info_x86.first_mm = lldb_mm0_i386;
256       reg_info_x86.last_mm = lldb_mm7_i386;
257       reg_info_x86.first_xmm = lldb_xmm0_i386;
258       reg_info_x86.last_xmm = lldb_xmm7_i386;
259       reg_info_x86.first_ymm = lldb_ymm0_i386;
260       reg_info_x86.last_ymm = lldb_ymm7_i386;
261       reg_info_x86.first_dr = lldb_dr0_i386;
262       reg_info_x86.gpr_flags = lldb_eflags_i386;
263     });
264 
265     return reg_info_x86;
266   case llvm::Triple::x86_64:
267     if (with_base) {
268       std::call_once(once_flag_x86_64_with_base, []() {
269         reg_info_x86_64_with_base.num_registers =
270             x86_64_with_base::k_num_registers;
271         reg_info_x86_64_with_base.num_gpr_registers =
272             x86_64_with_base::k_num_gpr_registers;
273         reg_info_x86_64_with_base.num_fpr_registers =
274             x86_64_with_base::k_num_fpr_registers;
275         reg_info_x86_64_with_base.num_avx_registers =
276             x86_64_with_base::k_num_avx_registers;
277         reg_info_x86_64_with_base.last_gpr = x86_64_with_base::k_last_gpr;
278         reg_info_x86_64_with_base.first_fpr = x86_64_with_base::k_first_fpr;
279         reg_info_x86_64_with_base.last_fpr = x86_64_with_base::k_last_fpr;
280         reg_info_x86_64_with_base.first_st = x86_64_with_base::lldb_st0;
281         reg_info_x86_64_with_base.last_st = x86_64_with_base::lldb_st7;
282         reg_info_x86_64_with_base.first_mm = x86_64_with_base::lldb_mm0;
283         reg_info_x86_64_with_base.last_mm = x86_64_with_base::lldb_mm7;
284         reg_info_x86_64_with_base.first_xmm = x86_64_with_base::lldb_xmm0;
285         reg_info_x86_64_with_base.last_xmm = x86_64_with_base::lldb_xmm15;
286         reg_info_x86_64_with_base.first_ymm = x86_64_with_base::lldb_ymm0;
287         reg_info_x86_64_with_base.last_ymm = x86_64_with_base::lldb_ymm15;
288         reg_info_x86_64_with_base.first_dr = x86_64_with_base::lldb_dr0;
289         reg_info_x86_64_with_base.gpr_flags = x86_64_with_base::lldb_rflags;
290       });
291 
292       return reg_info_x86_64_with_base;
293     } else {
294       std::call_once(once_flag_x86_64, []() {
295         reg_info_x86_64.num_registers = k_num_registers_x86_64;
296         reg_info_x86_64.num_gpr_registers = k_num_gpr_registers_x86_64;
297         reg_info_x86_64.num_fpr_registers = k_num_fpr_registers_x86_64;
298         reg_info_x86_64.num_avx_registers = k_num_avx_registers_x86_64;
299         reg_info_x86_64.last_gpr = k_last_gpr_x86_64;
300         reg_info_x86_64.first_fpr = k_first_fpr_x86_64;
301         reg_info_x86_64.last_fpr = k_last_fpr_x86_64;
302         reg_info_x86_64.first_st = lldb_st0_x86_64;
303         reg_info_x86_64.last_st = lldb_st7_x86_64;
304         reg_info_x86_64.first_mm = lldb_mm0_x86_64;
305         reg_info_x86_64.last_mm = lldb_mm7_x86_64;
306         reg_info_x86_64.first_xmm = lldb_xmm0_x86_64;
307         reg_info_x86_64.last_xmm = lldb_xmm15_x86_64;
308         reg_info_x86_64.first_ymm = lldb_ymm0_x86_64;
309         reg_info_x86_64.last_ymm = lldb_ymm15_x86_64;
310         reg_info_x86_64.first_dr = lldb_dr0_x86_64;
311         reg_info_x86_64.gpr_flags = lldb_rflags_x86_64;
312       });
313       return reg_info_x86_64;
314     }
315   default:
316     assert(false && "Unhandled target architecture.");
317     return reg_info_invalid;
318   }
319 }
320 
321 } // namespace lldb_private
322