9#if defined(__i386__) || defined(__x86_64__)
27static inline int get_cpuid_count(
unsigned int __leaf,
28 unsigned int __subleaf,
29 unsigned int *__eax,
unsigned int *__ebx,
30 unsigned int *__ecx,
unsigned int *__edx)
32 unsigned int __max_leaf = __get_cpuid_max(__leaf & 0x80000000,
nullptr);
34 if (__max_leaf == 0 || __max_leaf < __leaf)
37 __cpuid_count(__leaf, __subleaf, *__eax, *__ebx, *__ecx, *__edx);
59 "g_gpr_regnums_i386 has wrong number of register infos");
62static const uint32_t g_fpu_regnums_i386[] = {
74static_assert((
sizeof(g_fpu_regnums_i386) /
sizeof(g_fpu_regnums_i386[0])) -
77 "g_fpu_regnums_i386 has wrong number of register infos");
88 " g_avx_regnums_i386 has wrong number of register infos");
91static const uint32_t g_mpx_regnums_i386[] = {
96static_assert((
sizeof(g_mpx_regnums_i386) /
sizeof(g_mpx_regnums_i386[0])) -
99 "g_mpx_regnums_x86_64 has wrong number of register infos");
146 "g_gpr_regnums_x86_64 has wrong number of register infos");
149static const uint32_t g_fpu_regnums_x86_64[] = {
167static_assert((
sizeof(g_fpu_regnums_x86_64) /
sizeof(g_fpu_regnums_x86_64[0])) -
170 "g_fpu_regnums_x86_64 has wrong number of register infos");
183 "g_avx_regnums_x86_64 has wrong number of register infos");
186static const uint32_t g_mpx_regnums_x86_64[] = {
191static_assert((
sizeof(g_mpx_regnums_x86_64) /
sizeof(g_mpx_regnums_x86_64[0])) -
194 "g_mpx_regnums_x86_64 has wrong number of register infos");
208 g_mpx_regnums_i386}};
215 g_fpu_regnums_x86_64},
219 g_mpx_regnums_x86_64}};
221#define REG_CONTEXT_SIZE (GetRegisterInfoInterface().GetGPRSize() + sizeof(FPR))
227#define NT_X86_XSTATE 0x202
230#define NT_PRXFPREG 0x46e62b7f
235static inline unsigned int fxsr_regset(
const ArchSpec &arch) {
236 return arch.GetAddressByteSize() == 8 ? NT_PRFPREG : NT_PRXFPREG;
243#define bit_MPX 0x4000
247#define mask_XSTATE_AVX (1ULL << 2)
248#define mask_XSTATE_BNDREGS (1ULL << 3)
249#define mask_XSTATE_BNDCFG (1ULL << 4)
250#define mask_XSTATE_MPX (mask_XSTATE_BNDREGS | mask_XSTATE_BNDCFG)
252std::unique_ptr<NativeRegisterContextLinux>
255 return std::unique_ptr<NativeRegisterContextLinux>(
256 new NativeRegisterContextLinux_x86(target_arch, native_thread));
259llvm::Expected<ArchSpec>
261 return DetermineArchitectureViaGPR(
267static std::unique_ptr<RegisterContextLinux_x86>
268CreateRegisterInfoInterface(
const ArchSpec &target_arch) {
269 if (HostInfo::GetArchitecture().GetAddressByteSize() == 4) {
271 return std::make_unique<RegisterContextLinux_i386>(target_arch);
273 assert((HostInfo::GetArchitecture().GetAddressByteSize() == 8) &&
274 "Register setting path assumes this is a 64-bit host");
277 return std::make_unique<RegisterContextLinux_x86_64>(target_arch);
286static std::size_t GetXSTATESize() {
295 return std::max<std::size_t>(
ecx,
sizeof(
FPR));
298NativeRegisterContextLinux_x86::NativeRegisterContextLinux_x86(
301 native_thread, CreateRegisterInfoInterface(target_arch).release()),
303 m_xstate_type(XStateType::
Invalid), m_ymm_set(), m_mpx_set(),
304 m_reg_info(), m_gpr_x86_64() {
306 switch (target_arch.GetMachine()) {
307 case llvm::Triple::x86:
308 m_reg_info.num_registers = k_num_registers_i386;
309 m_reg_info.num_gpr_registers = k_num_gpr_registers_i386;
310 m_reg_info.num_fpr_registers = k_num_fpr_registers_i386;
311 m_reg_info.num_avx_registers = k_num_avx_registers_i386;
312 m_reg_info.num_mpx_registers = k_num_mpx_registers_i386;
313 m_reg_info.last_gpr = k_last_gpr_i386;
314 m_reg_info.first_fpr = k_first_fpr_i386;
315 m_reg_info.last_fpr = k_last_fpr_i386;
316 m_reg_info.first_st = lldb_st0_i386;
317 m_reg_info.last_st = lldb_st7_i386;
318 m_reg_info.first_mm = lldb_mm0_i386;
319 m_reg_info.last_mm = lldb_mm7_i386;
320 m_reg_info.first_xmm = lldb_xmm0_i386;
321 m_reg_info.last_xmm = lldb_xmm7_i386;
322 m_reg_info.first_ymm = lldb_ymm0_i386;
323 m_reg_info.last_ymm = lldb_ymm7_i386;
324 m_reg_info.first_mpxr = lldb_bnd0_i386;
325 m_reg_info.last_mpxr = lldb_bnd3_i386;
326 m_reg_info.first_mpxc = lldb_bndcfgu_i386;
327 m_reg_info.last_mpxc = lldb_bndstatus_i386;
328 m_reg_info.first_dr = lldb_dr0_i386;
329 m_reg_info.last_dr = lldb_dr7_i386;
330 m_reg_info.gpr_flags = lldb_eflags_i386;
332 case llvm::Triple::x86_64:
333 m_reg_info.num_registers = x86_64_with_base::k_num_registers;
334 m_reg_info.num_gpr_registers = x86_64_with_base::k_num_gpr_registers;
335 m_reg_info.num_fpr_registers = x86_64_with_base::k_num_fpr_registers;
336 m_reg_info.num_avx_registers = x86_64_with_base::k_num_avx_registers;
337 m_reg_info.num_mpx_registers = x86_64_with_base::k_num_mpx_registers;
338 m_reg_info.last_gpr = x86_64_with_base::k_last_gpr;
339 m_reg_info.first_fpr = x86_64_with_base::k_first_fpr;
340 m_reg_info.last_fpr = x86_64_with_base::k_last_fpr;
341 m_reg_info.first_st = x86_64_with_base::lldb_st0;
342 m_reg_info.last_st = x86_64_with_base::lldb_st7;
343 m_reg_info.first_mm = x86_64_with_base::lldb_mm0;
344 m_reg_info.last_mm = x86_64_with_base::lldb_mm7;
345 m_reg_info.first_xmm = x86_64_with_base::lldb_xmm0;
346 m_reg_info.last_xmm = x86_64_with_base::lldb_xmm15;
347 m_reg_info.first_ymm = x86_64_with_base::lldb_ymm0;
348 m_reg_info.last_ymm = x86_64_with_base::lldb_ymm15;
349 m_reg_info.first_mpxr = x86_64_with_base::lldb_bnd0;
350 m_reg_info.last_mpxr = x86_64_with_base::lldb_bnd3;
351 m_reg_info.first_mpxc = x86_64_with_base::lldb_bndcfgu;
352 m_reg_info.last_mpxc = x86_64_with_base::lldb_bndstatus;
353 m_reg_info.first_dr = x86_64_with_base::lldb_dr0;
354 m_reg_info.last_dr = x86_64_with_base::lldb_dr7;
355 m_reg_info.gpr_flags = x86_64_with_base::lldb_rflags;
358 assert(false &&
"Unhandled target architecture.");
362 std::size_t xstate_size = GetXSTATESize();
363 m_xstate.reset(
static_cast<FPR *
>(std::malloc(xstate_size)));
364 m_iovec.iov_base = m_xstate.get();
365 m_iovec.iov_len = xstate_size;
368 ::memset(m_xstate.get(), 0, xstate_size);
371 const RegisterInfo *reg_info_fctrl = GetRegisterInfoByName(
"fctrl");
372 m_fctrl_offset_in_userarea = reg_info_fctrl->
byte_offset;
377uint32_t NativeRegisterContextLinux_x86::GetRegisterSetCount()
const {
380 if (IsRegisterSetAvailable(set_index))
387uint32_t NativeRegisterContextLinux_x86::GetUserRegisterCount()
const {
390 const RegisterSet *set = GetRegisterSet(set_index);
398NativeRegisterContextLinux_x86::GetRegisterSet(uint32_t set_index)
const {
399 if (!IsRegisterSetAvailable(set_index))
402 switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) {
403 case llvm::Triple::x86:
405 case llvm::Triple::x86_64:
408 assert(
false &&
"Unhandled target architecture.");
416NativeRegisterContextLinux_x86::ReadRegister(
const RegisterInfo *reg_info,
430 "register \"%s\" is an internal-only lldb "
431 "register, cannot read directly",
436 if (IsFPR(reg) || IsAVX(reg) || IsMPX(reg)) {
441 uint32_t full_reg = reg;
450 error = ReadRegisterRaw(full_reg, reg_value);
452 if (
error.Success()) {
471 if (reg >= m_reg_info.first_st && reg <= m_reg_info.last_st)
473 m_xstate->fxsave.stmm[reg - m_reg_info.first_st].bytes,
475 if (reg >= m_reg_info.first_mm && reg <= m_reg_info.last_mm)
477 m_xstate->fxsave.stmm[reg - m_reg_info.first_mm].bytes,
479 if (reg >= m_reg_info.first_xmm && reg <= m_reg_info.last_xmm)
481 m_xstate->fxsave.xmm[reg - m_reg_info.first_xmm].bytes,
483 if (reg >= m_reg_info.first_ymm && reg <= m_reg_info.last_ymm) {
486 if (CopyXSTATEtoYMM(reg, byte_order))
487 reg_value.
SetBytes(m_ymm_set.ymm[reg - m_reg_info.first_ymm].bytes,
494 if (reg >= m_reg_info.first_mpxr && reg <= m_reg_info.last_mpxr) {
495 if (CopyXSTATEtoMPX(reg))
496 reg_value.
SetBytes(m_mpx_set.mpxr[reg - m_reg_info.first_mpxr].bytes,
503 if (reg >= m_reg_info.first_mpxc && reg <= m_reg_info.last_mpxc) {
504 if (CopyXSTATEtoMPX(reg))
505 reg_value.
SetBytes(m_mpx_set.mpxc[reg - m_reg_info.first_mpxc].bytes,
515 "write failed - type was expected to be RegisterValue::eTypeBytes");
535 assert((reg_info->
byte_offset - m_fctrl_offset_in_userarea) <
sizeof(
FPR));
536 uint8_t *src = (uint8_t *)m_xstate.get() + reg_info->
byte_offset -
537 m_fctrl_offset_in_userarea;
539 if (src ==
reinterpret_cast<uint8_t *
>(&m_xstate->fxsave.ftag)) {
541 m_xstate->fxsave.ftag, m_xstate->fxsave.fstat, m_xstate->fxsave.stmm));
547 reg_value.
SetUInt8(*(uint8_t *)src);
559 assert(
false &&
"Unhandled data size.");
568void NativeRegisterContextLinux_x86::UpdateXSTATEforWrite(
569 uint32_t reg_index) {
571 if (IsFPR(reg_index)) {
575 }
else if (IsAVX(reg_index)) {
578 }
else if (IsMPX(reg_index)) {
584Status NativeRegisterContextLinux_x86::WriteRegister(
586 assert(reg_info &&
"reg_info is null");
591 "no lldb regnum for %s",
592 reg_info && reg_info->
name ? reg_info->
name :
"<unknown register>");
594 UpdateXSTATEforWrite(reg_index);
596 if (IsGPR(reg_index) || IsDR(reg_index))
597 return WriteRegisterRaw(reg_index, reg_value);
599 if (IsFPR(reg_index) || IsAVX(reg_index) || IsMPX(reg_index)) {
601 if (reg_index >= m_reg_info.first_st && reg_index <= m_reg_info.last_st)
602 ::memcpy(m_xstate->fxsave.stmm[reg_index - m_reg_info.first_st].bytes,
605 if (reg_index >= m_reg_info.first_mm && reg_index <= m_reg_info.last_mm)
606 ::memcpy(m_xstate->fxsave.stmm[reg_index - m_reg_info.first_mm].bytes,
609 if (reg_index >= m_reg_info.first_xmm && reg_index <= m_reg_info.last_xmm)
610 ::memcpy(m_xstate->fxsave.xmm[reg_index - m_reg_info.first_xmm].bytes,
613 if (reg_index >= m_reg_info.first_ymm &&
614 reg_index <= m_reg_info.last_ymm) {
617 ::memcpy(m_ymm_set.ymm[reg_index - m_reg_info.first_ymm].bytes,
619 if (!CopyYMMtoXSTATE(reg_index, GetByteOrder()))
623 if (reg_index >= m_reg_info.first_mpxr &&
624 reg_index <= m_reg_info.last_mpxr) {
625 ::memcpy(m_mpx_set.mpxr[reg_index - m_reg_info.first_mpxr].bytes,
627 if (!CopyMPXtoXSTATE(reg_index))
631 if (reg_index >= m_reg_info.first_mpxc &&
632 reg_index <= m_reg_info.last_mpxc) {
633 ::memcpy(m_mpx_set.mpxc[reg_index - m_reg_info.first_mpxc].bytes,
635 if (!CopyMPXtoXSTATE(reg_index))
650 assert((reg_info->
byte_offset - m_fctrl_offset_in_userarea) <
652 uint8_t *dst = (uint8_t *)m_xstate.get() + reg_info->
byte_offset -
653 m_fctrl_offset_in_userarea;
655 if (dst ==
reinterpret_cast<uint8_t *
>(&m_xstate->fxsave.ftag))
672 assert(
false &&
"Unhandled data size.");
674 "unhandled register data size %" PRIu32, reg_info->
byte_size);
683 if (IsAVX(reg_index)) {
684 if (!CopyYMMtoXSTATE(reg_index, GetByteOrder()))
688 if (IsMPX(reg_index)) {
689 if (!CopyMPXtoXSTATE(reg_index))
695 "failed - register wasn't recognized to be a GPR or an FPR, "
696 "write strategy unknown");
699Status NativeRegisterContextLinux_x86::ReadAllRegisterValues(
712 uint8_t *dst = data_sp->GetBytes();
713 ::memcpy(dst, &m_gpr_x86_64, GetRegisterInfoInterface().GetGPRSize());
714 dst += GetRegisterInfoInterface().GetGPRSize();
715 if (m_xstate_type == XStateType::FXSAVE)
716 ::memcpy(dst, &m_xstate->fxsave,
sizeof(m_xstate->fxsave));
717 else if (m_xstate_type == XStateType::XSAVE) {
720 if (IsCPUFeatureAvailable(RegSet::avx)) {
722 for (uint32_t reg = m_reg_info.first_ymm; reg <= m_reg_info.last_ymm;
724 if (!CopyXSTATEtoYMM(reg, byte_order)) {
726 "NativeRegisterContextLinux_x86::%s "
727 "CopyXSTATEtoYMM() failed for reg num "
735 if (IsCPUFeatureAvailable(RegSet::mpx)) {
736 for (uint32_t reg = m_reg_info.first_mpxr; reg <= m_reg_info.last_mpxc;
738 if (!CopyXSTATEtoMPX(reg)) {
740 "NativeRegisterContextLinux_x86::%s "
741 "CopyXSTATEtoMPX() failed for reg num "
749 ::memcpy(dst, m_xstate.get(),
sizeof(
FPR));
751 assert(
false &&
"how do we save the floating point registers?");
753 "unsure how to save the floating point registers");
763 const RegisterInfo &info = GetRegisterInfo().GetOrigAxInfo();
769Status NativeRegisterContextLinux_x86::WriteAllRegisterValues(
775 "NativeRegisterContextLinux_x86::%s invalid data_sp provided",
782 "data_sp contained mismatched data size, expected {0}, actual {1}",
787 const uint8_t *src = data_sp->GetBytes();
788 if (src ==
nullptr) {
790 "NativeRegisterContextLinux_x86::%s "
791 "DataBuffer::GetBytes() returned a null "
796 ::memcpy(&m_gpr_x86_64, src, GetRegisterInfoInterface().GetGPRSize());
802 src += GetRegisterInfoInterface().GetGPRSize();
803 if (m_xstate_type == XStateType::FXSAVE)
804 ::memcpy(&m_xstate->fxsave, src,
sizeof(m_xstate->fxsave));
805 else if (m_xstate_type == XStateType::XSAVE)
806 ::memcpy(&m_xstate->xsave, src,
sizeof(m_xstate->xsave));
812 if (m_xstate_type == XStateType::XSAVE) {
815 if (IsCPUFeatureAvailable(RegSet::avx)) {
817 for (uint32_t reg = m_reg_info.first_ymm; reg <= m_reg_info.last_ymm;
819 if (!CopyYMMtoXSTATE(reg, byte_order)) {
821 "NativeRegisterContextLinux_x86::%s "
822 "CopyYMMtoXSTATE() failed for reg num "
830 if (IsCPUFeatureAvailable(RegSet::mpx)) {
831 for (uint32_t reg = m_reg_info.first_mpxr; reg <= m_reg_info.last_mpxc;
833 if (!CopyMPXtoXSTATE(reg)) {
835 "NativeRegisterContextLinux_x86::%s "
836 "CopyMPXtoXSTATE() failed for reg num "
848bool NativeRegisterContextLinux_x86::IsCPUFeatureAvailable(
849 RegSet feature_code)
const {
850 if (m_xstate_type == XStateType::Invalid) {
851 if (
const_cast<NativeRegisterContextLinux_x86 *
>(
this)->ReadFPR().Fail())
854 switch (feature_code) {
860 if ((m_xstate->xsave.i387.xcr0 & mask_XSTATE_AVX) == mask_XSTATE_AVX)
865 if ((m_xstate->xsave.i387.xcr0 & mask_XSTATE_MPX) == mask_XSTATE_MPX)
872bool NativeRegisterContextLinux_x86::IsRegisterSetAvailable(
873 uint32_t set_index)
const {
876 switch (
static_cast<RegSet
>(set_index)) {
879 return (set_index < num_sets);
881 return IsCPUFeatureAvailable(RegSet::avx);
883 return IsCPUFeatureAvailable(RegSet::mpx);
888bool NativeRegisterContextLinux_x86::IsGPR(uint32_t reg_index)
const {
890 return reg_index <= m_reg_info.last_gpr;
893bool NativeRegisterContextLinux_x86::IsFPR(uint32_t reg_index)
const {
894 return (m_reg_info.first_fpr <= reg_index &&
895 reg_index <= m_reg_info.last_fpr);
898bool NativeRegisterContextLinux_x86::IsDR(uint32_t reg_index)
const {
899 return (m_reg_info.first_dr <= reg_index &&
900 reg_index <= m_reg_info.last_dr);
903Status NativeRegisterContextLinux_x86::WriteFPR() {
904 switch (m_xstate_type) {
905 case XStateType::FXSAVE:
906 return WriteRegisterSet(
907 &m_iovec,
sizeof(m_xstate->fxsave),
908 fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture()));
909 case XStateType::XSAVE:
910 return WriteRegisterSet(&m_iovec,
sizeof(m_xstate->xsave), NT_X86_XSTATE);
916bool NativeRegisterContextLinux_x86::IsAVX(uint32_t reg_index)
const {
917 if (!IsCPUFeatureAvailable(RegSet::avx))
919 return (m_reg_info.first_ymm <= reg_index &&
920 reg_index <= m_reg_info.last_ymm);
923bool NativeRegisterContextLinux_x86::CopyXSTATEtoYMM(
925 if (!IsAVX(reg_index))
929 uint32_t reg_no = reg_index - m_reg_info.first_ymm;
931 m_xstate->fxsave.xmm[reg_no].bytes,
932 m_xstate->xsave.ymmh[reg_no].bytes);
939bool NativeRegisterContextLinux_x86::CopyYMMtoXSTATE(
945 uint32_t reg_no = reg - m_reg_info.first_ymm;
947 m_xstate->fxsave.xmm[reg_no].bytes,
948 m_xstate->xsave.ymmh[reg_no].bytes);
955void *NativeRegisterContextLinux_x86::GetFPRBuffer() {
956 switch (m_xstate_type) {
957 case XStateType::FXSAVE:
958 return &m_xstate->fxsave;
959 case XStateType::XSAVE:
966size_t NativeRegisterContextLinux_x86::GetFPRSize() {
967 switch (m_xstate_type) {
968 case XStateType::FXSAVE:
969 return sizeof(m_xstate->fxsave);
970 case XStateType::XSAVE:
971 return sizeof(m_iovec);
977Status NativeRegisterContextLinux_x86::ReadFPR() {
981 if (m_xstate_type != XStateType::FXSAVE) {
982 error = ReadRegisterSet(&m_iovec,
sizeof(m_xstate->xsave), NT_X86_XSTATE);
984 m_xstate_type = XStateType::XSAVE;
988 error = ReadRegisterSet(
989 &m_iovec,
sizeof(m_xstate->xsave),
990 fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture()));
992 m_xstate_type = XStateType::FXSAVE;
998bool NativeRegisterContextLinux_x86::IsMPX(uint32_t reg_index)
const {
999 if (!IsCPUFeatureAvailable(RegSet::mpx))
1001 return (m_reg_info.first_mpxr <= reg_index &&
1002 reg_index <= m_reg_info.last_mpxc);
1005bool NativeRegisterContextLinux_x86::CopyXSTATEtoMPX(uint32_t reg) {
1009 if (reg >= m_reg_info.first_mpxr && reg <= m_reg_info.last_mpxr) {
1010 ::memcpy(m_mpx_set.mpxr[reg - m_reg_info.first_mpxr].bytes,
1011 m_xstate->xsave.mpxr[reg - m_reg_info.first_mpxr].bytes,
1014 ::memcpy(m_mpx_set.mpxc[reg - m_reg_info.first_mpxc].bytes,
1015 m_xstate->xsave.mpxc[reg - m_reg_info.first_mpxc].bytes,
1021bool NativeRegisterContextLinux_x86::CopyMPXtoXSTATE(uint32_t reg) {
1025 if (reg >= m_reg_info.first_mpxr && reg <= m_reg_info.last_mpxr) {
1026 ::memcpy(m_xstate->xsave.mpxr[reg - m_reg_info.first_mpxr].bytes,
1027 m_mpx_set.mpxr[reg - m_reg_info.first_mpxr].bytes,
sizeof(
MPXReg));
1029 ::memcpy(m_xstate->xsave.mpxc[reg - m_reg_info.first_mpxc].bytes,
1030 m_mpx_set.mpxc[reg - m_reg_info.first_mpxc].bytes,
sizeof(
MPXCsr));
1036NativeRegisterContextLinux_x86::GetPtraceOffset(uint32_t reg_index) {
1038 return GetRegisterInfoAtIndex(reg_index)->byte_offset -
1039 (IsMPX(reg_index) ? 128 : 0);
1042std::optional<NativeRegisterContextLinux::SyscallData>
1043NativeRegisterContextLinux_x86::GetSyscallData() {
1044 switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) {
1045 case llvm::Triple::x86: {
1046 static const uint8_t Int80[] = {0xcd, 0x80};
1052 case llvm::Triple::x86_64: {
1053 static const uint8_t Syscall[] = {0x0f, 0x05};
1054 static const uint32_t
Args[] = {
1060 llvm_unreachable(
"Unhandled architecture!");
1064std::optional<NativeRegisterContextLinux::MmapData>
1065NativeRegisterContextLinux_x86::GetMmapData() {
1066 switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) {
1067 case llvm::Triple::x86:
1068 return MmapData{192, 91};
1069 case llvm::Triple::x86_64:
1070 return MmapData{9, 11};
1072 llvm_unreachable(
"Unhandled architecture!");
1076const RegisterInfo *NativeRegisterContextLinux_x86::GetDR(
int num)
const {
1077 assert(num >= 0 && num <= 7);
1078 switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) {
1079 case llvm::Triple::x86:
1081 case llvm::Triple::x86_64:
1084 llvm_unreachable(
"Unhandled target architecture.");
static llvm::raw_ostream & error(Stream &strm)
static const RegisterSet g_reg_sets_i386[]
static const uint32_t g_gpr_regnums_x86_64[]
const uint32_t g_gpr_regnums_i386[]
static const RegisterSet g_reg_sets_x86_64[]
const uint32_t g_avx_regnums_i386[]
static const uint32_t g_avx_regnums_x86_64[]
@ k_num_extended_register_sets
static size_t GetGPRSizeStatic()
A subclass of DataBuffer that stores a data buffer on the heap.
uint16_t GetAsUInt16(uint16_t fail_value=UINT16_MAX, bool *success_ptr=nullptr) const
void SetUInt64(uint64_t uint, Type t=eTypeUInt64)
uint8_t GetAsUInt8(uint8_t fail_value=UINT8_MAX, bool *success_ptr=nullptr) const
void SetUInt16(uint16_t uint)
uint64_t GetAsUInt64(uint64_t fail_value=UINT64_MAX, bool *success_ptr=nullptr) const
void SetUInt8(uint8_t uint)
void SetBytes(const void *bytes, size_t length, lldb::ByteOrder byte_order)
const void * GetBytes() const
RegisterValue::Type GetType() const
void SetType(RegisterValue::Type type)
uint32_t GetAsUInt32(uint32_t fail_value=UINT32_MAX, bool *success_ptr=nullptr) const
void SetUInt32(uint32_t uint, Type t=eTypeUInt32)
uint32_t GetByteSize() const
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static std::unique_ptr< NativeRegisterContextLinux > CreateHostNativeRegisterContextLinux(const ArchSpec &target_arch, NativeThreadLinux &native_thread)
static llvm::Expected< ArchSpec > DetermineArchitecture(lldb::tid_t tid)
#define LLDB_INVALID_REGNUM
A class that represents a running process on the host machine.
void YMMToXState(const YMMReg &input, void *xmm_bytes, void *ymmh_bytes)
uint16_t AbridgedToFullTagWord(uint8_t abridged_tw, uint16_t sw, llvm::ArrayRef< MMSReg > st_regs)
YMMReg XStateToYMM(const void *xmm_bytes, const void *ymmh_bytes)
uint8_t FullToAbridgedTagWord(uint16_t tw)
@ k_num_avx_registers_i386
@ k_num_fpr_registers_i386
@ k_num_mpx_registers_i386
@ k_num_gpr_registers_i386
@ eEncodingVector
vector registers
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
uint32_t byte_offset
The byte offset in the register context data where this register's value is found.
uint32_t byte_size
Size in bytes of the register.
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
const char * name
Name of this register, can't be NULL.
uint32_t * invalidate_regs
List of registers (terminated with LLDB_INVALID_REGNUM).
Registers are grouped into register sets.
size_t num_registers
The number of registers in REGISTERS array below.