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