9#if defined(__x86_64__) || defined(_M_X64)
22#include "llvm/ADT/STLExtras.h"
27#define DEFINE_GPR(reg, alt, generic) \
29 #reg, alt, 8, 0, eEncodingUint, eFormatHexUppercase, \
30 {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, generic, \
31 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
35#define DEFINE_GPR_BIN(reg, alt) #reg, alt, 8, 0, eEncodingUint, eFormatBinary
36#define DEFINE_FPU_XMM(reg) \
37 #reg, NULL, 16, 0, eEncodingUint, eFormatVectorOfUInt64, \
38 {dwarf_##reg##_x86_64, dwarf_##reg##_x86_64, LLDB_INVALID_REGNUM, \
39 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64}, \
42#define DEFINE_GPR_PSEUDO_32(reg) \
44 #reg, nullptr, 4, 0, eEncodingUint, eFormatHexUppercase, \
45 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
46 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
50#define DEFINE_GPR_PSEUDO_16(reg) \
52 #reg, nullptr, 2, 0, eEncodingUint, eFormatHexUppercase, \
53 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
54 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
58#define DEFINE_GPR_PSEUDO_8(reg) \
60 #reg, nullptr, 1, 0, eEncodingUint, eFormatHexUppercase, \
61 {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \
62 LLDB_INVALID_REGNUM, lldb_##reg##_x86_64 }, \
190 DEFINE_GPR_BIN(eflags,
"flags"),
196 DEFINE_GPR_PSEUDO_32(
eax),
197 DEFINE_GPR_PSEUDO_32(
ebx),
198 DEFINE_GPR_PSEUDO_32(
ecx),
199 DEFINE_GPR_PSEUDO_32(
edx),
200 DEFINE_GPR_PSEUDO_32(
edi),
201 DEFINE_GPR_PSEUDO_32(
esi),
202 DEFINE_GPR_PSEUDO_32(
ebp),
203 DEFINE_GPR_PSEUDO_32(
esp),
204 DEFINE_GPR_PSEUDO_32(r8d),
205 DEFINE_GPR_PSEUDO_32(r9d),
206 DEFINE_GPR_PSEUDO_32(r10d),
207 DEFINE_GPR_PSEUDO_32(r11d),
208 DEFINE_GPR_PSEUDO_32(r12d),
209 DEFINE_GPR_PSEUDO_32(r13d),
210 DEFINE_GPR_PSEUDO_32(r14d),
211 DEFINE_GPR_PSEUDO_32(r15d),
212 DEFINE_GPR_PSEUDO_16(ax),
213 DEFINE_GPR_PSEUDO_16(bx),
214 DEFINE_GPR_PSEUDO_16(cx),
215 DEFINE_GPR_PSEUDO_16(dx),
216 DEFINE_GPR_PSEUDO_16(di),
217 DEFINE_GPR_PSEUDO_16(si),
218 DEFINE_GPR_PSEUDO_16(bp),
219 DEFINE_GPR_PSEUDO_16(
sp),
220 DEFINE_GPR_PSEUDO_16(r8w),
221 DEFINE_GPR_PSEUDO_16(r9w),
222 DEFINE_GPR_PSEUDO_16(r10w),
223 DEFINE_GPR_PSEUDO_16(r11w),
224 DEFINE_GPR_PSEUDO_16(r12w),
225 DEFINE_GPR_PSEUDO_16(r13w),
226 DEFINE_GPR_PSEUDO_16(r14w),
227 DEFINE_GPR_PSEUDO_16(r15w),
228 DEFINE_GPR_PSEUDO_8(ah),
229 DEFINE_GPR_PSEUDO_8(bh),
230 DEFINE_GPR_PSEUDO_8(ch),
231 DEFINE_GPR_PSEUDO_8(dh),
232 DEFINE_GPR_PSEUDO_8(al),
233 DEFINE_GPR_PSEUDO_8(bl),
234 DEFINE_GPR_PSEUDO_8(cl),
235 DEFINE_GPR_PSEUDO_8(dl),
236 DEFINE_GPR_PSEUDO_8(dil),
237 DEFINE_GPR_PSEUDO_8(sil),
238 DEFINE_GPR_PSEUDO_8(bpl),
239 DEFINE_GPR_PSEUDO_8(spl),
240 DEFINE_GPR_PSEUDO_8(r8l),
241 DEFINE_GPR_PSEUDO_8(r9l),
242 DEFINE_GPR_PSEUDO_8(r10l),
243 DEFINE_GPR_PSEUDO_8(r11l),
244 DEFINE_GPR_PSEUDO_8(r12l),
245 DEFINE_GPR_PSEUDO_8(r13l),
246 DEFINE_GPR_PSEUDO_8(r14l),
247 DEFINE_GPR_PSEUDO_8(r15l),
248 {DEFINE_FPU_XMM(xmm0)},
249 {DEFINE_FPU_XMM(xmm1)},
250 {DEFINE_FPU_XMM(xmm2)},
251 {DEFINE_FPU_XMM(xmm3)},
252 {DEFINE_FPU_XMM(xmm4)},
253 {DEFINE_FPU_XMM(xmm5)},
254 {DEFINE_FPU_XMM(xmm6)},
255 {DEFINE_FPU_XMM(xmm7)},
256 {DEFINE_FPU_XMM(xmm8)},
257 {DEFINE_FPU_XMM(xmm9)},
258 {DEFINE_FPU_XMM(xmm10)},
259 {DEFINE_FPU_XMM(xmm11)},
260 {DEFINE_FPU_XMM(xmm12)},
261 {DEFINE_FPU_XMM(xmm13)},
262 {DEFINE_FPU_XMM(xmm14)},
263 {DEFINE_FPU_XMM(xmm15)}};
270 eRegisterIndexRax, eRegisterIndexRbx, eRegisterIndexRcx,
271 eRegisterIndexRdx, eRegisterIndexRdi, eRegisterIndexRsi,
272 eRegisterIndexRbp, eRegisterIndexRsp, eRegisterIndexR8,
273 eRegisterIndexR9, eRegisterIndexR10, eRegisterIndexR11,
274 eRegisterIndexR12, eRegisterIndexR13, eRegisterIndexR14,
275 eRegisterIndexR15, eRegisterIndexRip, eRegisterIndexRflags,
276 eRegisterIndexEax, eRegisterIndexEbx, eRegisterIndexEcx,
277 eRegisterIndexEdx, eRegisterIndexEdi, eRegisterIndexEsi,
278 eRegisterIndexEbp, eRegisterIndexEsp, eRegisterIndexR8d,
279 eRegisterIndexR9d, eRegisterIndexR10d, eRegisterIndexR11d,
280 eRegisterIndexR12d, eRegisterIndexR13d, eRegisterIndexR14d,
281 eRegisterIndexR15d, eRegisterIndexAx, eRegisterIndexBx,
282 eRegisterIndexCx, eRegisterIndexDx, eRegisterIndexDi,
283 eRegisterIndexSi, eRegisterIndexBp, eRegisterIndexSp,
284 eRegisterIndexR8w, eRegisterIndexR9w, eRegisterIndexR10w,
285 eRegisterIndexR11w, eRegisterIndexR12w, eRegisterIndexR13w,
286 eRegisterIndexR14w, eRegisterIndexR15w, eRegisterIndexAh,
287 eRegisterIndexBh, eRegisterIndexCh, eRegisterIndexDh,
288 eRegisterIndexAl, eRegisterIndexBl, eRegisterIndexCl,
289 eRegisterIndexDl, eRegisterIndexDil, eRegisterIndexSil,
290 eRegisterIndexBpl, eRegisterIndexSpl, eRegisterIndexR8l,
291 eRegisterIndexR9l, eRegisterIndexR10l, eRegisterIndexR11l,
292 eRegisterIndexR12l, eRegisterIndexR13l, eRegisterIndexR14l,
297 eRegisterIndexXmm0, eRegisterIndexXmm1, eRegisterIndexXmm2,
298 eRegisterIndexXmm3, eRegisterIndexXmm4, eRegisterIndexXmm5,
299 eRegisterIndexXmm6, eRegisterIndexXmm7, eRegisterIndexXmm8,
300 eRegisterIndexXmm9, eRegisterIndexXmm10, eRegisterIndexXmm11,
301 eRegisterIndexXmm12, eRegisterIndexXmm13, eRegisterIndexXmm14,
305RegisterSet g_register_sets[] = {
306 {
"General Purpose Registers",
"gpr", std::size(g_gpr_reg_indices),
308 {
"Floating Point Registers",
"fpu", std::size(g_fpu_reg_indices),
313RegisterContextWindows_x64::RegisterContextWindows_x64(
317RegisterContextWindows_x64::~RegisterContextWindows_x64() {}
319size_t RegisterContextWindows_x64::GetRegisterCount() {
324RegisterContextWindows_x64::GetRegisterInfoAtIndex(
size_t reg) {
330size_t RegisterContextWindows_x64::GetRegisterSetCount() {
331 return std::size(g_register_sets);
334const RegisterSet *RegisterContextWindows_x64::GetRegisterSet(
size_t reg_set) {
335 return &g_register_sets[reg_set];
338bool RegisterContextWindows_x64::ReadRegister(
const RegisterInfo *reg_info,
340 if (!CacheAllRegisterValues())
343 if (reg_info ==
nullptr)
349#define GPR_CASE(size, reg_case, reg_val) \
351 reg_value.SetUInt##size(reg_val); \
354 GPR_CASE(64, lldb_rax_x86_64, m_context.Rax);
355 GPR_CASE(64, lldb_rbx_x86_64, m_context.Rbx);
356 GPR_CASE(64, lldb_rcx_x86_64, m_context.Rcx);
357 GPR_CASE(64, lldb_rdx_x86_64, m_context.Rdx);
358 GPR_CASE(64, lldb_rdi_x86_64, m_context.Rdi);
359 GPR_CASE(64, lldb_rsi_x86_64, m_context.Rsi);
360 GPR_CASE(64, lldb_r8_x86_64, m_context.R8);
361 GPR_CASE(64, lldb_r9_x86_64, m_context.R9);
362 GPR_CASE(64, lldb_r10_x86_64, m_context.R10);
363 GPR_CASE(64, lldb_r11_x86_64, m_context.R11);
364 GPR_CASE(64, lldb_r12_x86_64, m_context.R12);
365 GPR_CASE(64, lldb_r13_x86_64, m_context.R13);
366 GPR_CASE(64, lldb_r14_x86_64, m_context.R14);
367 GPR_CASE(64, lldb_r15_x86_64, m_context.R15);
368 GPR_CASE(64, lldb_rbp_x86_64, m_context.Rbp);
369 GPR_CASE(64, lldb_rsp_x86_64, m_context.Rsp);
370 GPR_CASE(64, lldb_rip_x86_64, m_context.Rip);
371 GPR_CASE(64, lldb_rflags_x86_64, m_context.EFlags);
372 GPR_CASE(32, lldb_eax_x86_64,
static_cast<uint32_t>(m_context.Rax));
373 GPR_CASE(32, lldb_ebx_x86_64,
static_cast<uint32_t>(m_context.Rbx));
374 GPR_CASE(32, lldb_ecx_x86_64,
static_cast<uint32_t>(m_context.Rcx));
375 GPR_CASE(32, lldb_edx_x86_64,
static_cast<uint32_t>(m_context.Rdx));
376 GPR_CASE(32, lldb_edi_x86_64,
static_cast<uint32_t>(m_context.Rdi));
377 GPR_CASE(32, lldb_esi_x86_64,
static_cast<uint32_t>(m_context.Rsi));
378 GPR_CASE(32, lldb_ebp_x86_64,
static_cast<uint32_t>(m_context.Rbp));
379 GPR_CASE(32, lldb_esp_x86_64,
static_cast<uint32_t>(m_context.Rsp));
380 GPR_CASE(32, lldb_r8d_x86_64,
static_cast<uint32_t>(m_context.R8));
381 GPR_CASE(32, lldb_r9d_x86_64,
static_cast<uint32_t>(m_context.R9));
382 GPR_CASE(32, lldb_r10d_x86_64,
static_cast<uint32_t>(m_context.R10));
383 GPR_CASE(32, lldb_r11d_x86_64,
static_cast<uint32_t>(m_context.R11));
384 GPR_CASE(32, lldb_r12d_x86_64,
static_cast<uint32_t>(m_context.R12));
385 GPR_CASE(32, lldb_r13d_x86_64,
static_cast<uint32_t>(m_context.R13));
386 GPR_CASE(32, lldb_r14d_x86_64,
static_cast<uint32_t>(m_context.R14));
387 GPR_CASE(32, lldb_r15d_x86_64,
static_cast<uint32_t>(m_context.R15));
388 GPR_CASE(16, lldb_ax_x86_64,
static_cast<uint16_t>(m_context.Rax));
389 GPR_CASE(16, lldb_bx_x86_64,
static_cast<uint16_t>(m_context.Rbx));
390 GPR_CASE(16, lldb_cx_x86_64,
static_cast<uint16_t>(m_context.Rcx));
391 GPR_CASE(16, lldb_dx_x86_64,
static_cast<uint16_t>(m_context.Rdx));
392 GPR_CASE(16, lldb_di_x86_64,
static_cast<uint16_t>(m_context.Rdi));
393 GPR_CASE(16, lldb_si_x86_64,
static_cast<uint16_t>(m_context.Rsi));
394 GPR_CASE(16, lldb_bp_x86_64,
static_cast<uint16_t>(m_context.Rbp));
395 GPR_CASE(16, lldb_sp_x86_64,
static_cast<uint16_t>(m_context.Rsp));
396 GPR_CASE(16, lldb_r8w_x86_64,
static_cast<uint16_t>(m_context.R8));
397 GPR_CASE(16, lldb_r9w_x86_64,
static_cast<uint16_t>(m_context.R9));
398 GPR_CASE(16, lldb_r10w_x86_64,
static_cast<uint16_t>(m_context.R10));
399 GPR_CASE(16, lldb_r11w_x86_64,
static_cast<uint16_t>(m_context.R11));
400 GPR_CASE(16, lldb_r12w_x86_64,
static_cast<uint16_t>(m_context.R12));
401 GPR_CASE(16, lldb_r13w_x86_64,
static_cast<uint16_t>(m_context.R13));
402 GPR_CASE(16, lldb_r14w_x86_64,
static_cast<uint16_t>(m_context.R14));
403 GPR_CASE(16, lldb_r15w_x86_64,
static_cast<uint16_t>(m_context.R15));
404 GPR_CASE(8, lldb_ah_x86_64,
static_cast<uint16_t>(m_context.Rax) >> 8);
405 GPR_CASE(8, lldb_bh_x86_64,
static_cast<uint16_t>(m_context.Rbx) >> 8);
406 GPR_CASE(8, lldb_ch_x86_64,
static_cast<uint16_t>(m_context.Rcx) >> 8);
407 GPR_CASE(8, lldb_dh_x86_64,
static_cast<uint16_t>(m_context.Rdx) >> 8);
408 GPR_CASE(8, lldb_al_x86_64,
static_cast<uint8_t
>(m_context.Rax));
409 GPR_CASE(8, lldb_bl_x86_64,
static_cast<uint8_t
>(m_context.Rbx));
410 GPR_CASE(8, lldb_cl_x86_64,
static_cast<uint8_t
>(m_context.Rcx));
411 GPR_CASE(8, lldb_dl_x86_64,
static_cast<uint8_t
>(m_context.Rdx));
412 GPR_CASE(8, lldb_dil_x86_64,
static_cast<uint8_t
>(m_context.Rdi));
413 GPR_CASE(8, lldb_sil_x86_64,
static_cast<uint8_t
>(m_context.Rsi));
414 GPR_CASE(8, lldb_bpl_x86_64,
static_cast<uint8_t
>(m_context.Rbp));
415 GPR_CASE(8, lldb_spl_x86_64,
static_cast<uint8_t
>(m_context.Rsp));
416 GPR_CASE(8, lldb_r8l_x86_64,
static_cast<uint8_t
>(m_context.R8));
417 GPR_CASE(8, lldb_r9l_x86_64,
static_cast<uint8_t
>(m_context.R9));
418 GPR_CASE(8, lldb_r10l_x86_64,
static_cast<uint8_t
>(m_context.R10));
419 GPR_CASE(8, lldb_r11l_x86_64,
static_cast<uint8_t
>(m_context.R11));
420 GPR_CASE(8, lldb_r12l_x86_64,
static_cast<uint8_t
>(m_context.R12));
421 GPR_CASE(8, lldb_r13l_x86_64,
static_cast<uint8_t
>(m_context.R13));
422 GPR_CASE(8, lldb_r14l_x86_64,
static_cast<uint8_t
>(m_context.R14));
423 GPR_CASE(8, lldb_r15l_x86_64,
static_cast<uint8_t
>(m_context.R15));
427 reg_info->byte_size, endian::InlHostByteOrder());
431 reg_info->byte_size, endian::InlHostByteOrder());
435 reg_info->byte_size, endian::InlHostByteOrder());
439 reg_info->byte_size, endian::InlHostByteOrder());
443 reg_info->byte_size, endian::InlHostByteOrder());
447 reg_info->byte_size, endian::InlHostByteOrder());
451 reg_info->byte_size, endian::InlHostByteOrder());
455 reg_info->byte_size, endian::InlHostByteOrder());
459 reg_info->byte_size, endian::InlHostByteOrder());
463 reg_info->byte_size, endian::InlHostByteOrder());
466 reg_value.
SetBytes(&m_context.Xmm10,
467 reg_info->byte_size, endian::InlHostByteOrder());
470 reg_value.
SetBytes(&m_context.Xmm11,
471 reg_info->byte_size, endian::InlHostByteOrder());
474 reg_value.
SetBytes(&m_context.Xmm12,
475 reg_info->byte_size, endian::InlHostByteOrder());
478 reg_value.
SetBytes(&m_context.Xmm13,
479 reg_info->byte_size, endian::InlHostByteOrder());
482 reg_value.
SetBytes(&m_context.Xmm14,
483 reg_info->byte_size, endian::InlHostByteOrder());
486 reg_value.
SetBytes(&m_context.Xmm15,
487 reg_info->byte_size, endian::InlHostByteOrder());
493bool RegisterContextWindows_x64::WriteRegister(
const RegisterInfo *reg_info,
499 if (!CacheAllRegisterValues())
502 switch (reg_info->kinds[eRegisterKindLLDB]) {
558 memcpy(&m_context.Xmm0, reg_value.
GetBytes(), 16);
561 memcpy(&m_context.Xmm1, reg_value.
GetBytes(), 16);
564 memcpy(&m_context.Xmm2, reg_value.
GetBytes(), 16);
567 memcpy(&m_context.Xmm3, reg_value.
GetBytes(), 16);
570 memcpy(&m_context.Xmm4, reg_value.
GetBytes(), 16);
573 memcpy(&m_context.Xmm5, reg_value.
GetBytes(), 16);
576 memcpy(&m_context.Xmm6, reg_value.
GetBytes(), 16);
579 memcpy(&m_context.Xmm7, reg_value.
GetBytes(), 16);
582 memcpy(&m_context.Xmm8, reg_value.
GetBytes(), 16);
585 memcpy(&m_context.Xmm9, reg_value.
GetBytes(), 16);
588 memcpy(&m_context.Xmm10, reg_value.
GetBytes(), 16);
591 memcpy(&m_context.Xmm11, reg_value.
GetBytes(), 16);
594 memcpy(&m_context.Xmm12, reg_value.
GetBytes(), 16);
597 memcpy(&m_context.Xmm13, reg_value.
GetBytes(), 16);
600 memcpy(&m_context.Xmm14, reg_value.
GetBytes(), 16);
603 memcpy(&m_context.Xmm15, reg_value.
GetBytes(), 16);
608 return ApplyAllRegisterValues();
static const uint32_t k_num_register_infos
static const RegisterInfo g_register_infos[]
#define DEFINE_GPR(reg, alt, kind1, kind2, kind3, kind4)
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
void SetBytes(const void *bytes, size_t length, lldb::ByteOrder byte_order)
const void * GetBytes() const
#define LLDB_REGNUM_GENERIC_SP
#define LLDB_REGNUM_GENERIC_ARG4
#define LLDB_REGNUM_GENERIC_ARG3
#define LLDB_REGNUM_GENERIC_ARG1
#define LLDB_REGNUM_GENERIC_FLAGS
#define LLDB_INVALID_REGNUM
#define LLDB_REGNUM_GENERIC_ARG2
#define LLDB_REGNUM_GENERIC_PC
#define LLDB_REGNUM_GENERIC_FP
A class that represents a running process on the host machine.
@ eRegisterKindLLDB
lldb's internal register numbers