Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.h =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.h +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.h @@ -33,8 +33,8 @@ CopyHardwareWatchpointsFrom(NativeRegisterContextFreeBSD &source) = 0; protected: - virtual NativeProcessFreeBSD &GetProcess(); - virtual ::pid_t GetProcessPid(); + virtual NativeProcessFreeBSD &GetProcess() const; + virtual ::pid_t GetProcessPid() const; }; } // namespace process_freebsd Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.cpp =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.cpp +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.cpp @@ -20,10 +20,10 @@ #include // clang-format on -NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() { +NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() const { return static_cast(m_thread.GetProcess()); } -::pid_t NativeRegisterContextFreeBSD::GetProcessPid() { +::pid_t NativeRegisterContextFreeBSD::GetProcessPid() const { return GetProcess().GetID(); } Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h @@ -86,6 +86,7 @@ void *ymm_hi; }; llvm::Optional GetYMMSplitReg(uint32_t reg); + bool IsRegisterSetAvailable(uint32_t set_index) const; }; } // namespace process_freebsd Index: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp =================================================================== --- lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp +++ lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp @@ -289,7 +289,7 @@ uint32_t NativeRegisterContextFreeBSD_x86_64::GetRegisterSetCount() const { uint32_t sets = 0; for (uint32_t set_index = 0; set_index < k_num_register_sets; ++set_index) { - if (GetSetForNativeRegNum(set_index)) + if (IsRegisterSetAvailable(set_index)) ++sets; } @@ -298,6 +298,9 @@ const RegisterSet * NativeRegisterContextFreeBSD_x86_64::GetRegisterSet(uint32_t set_index) const { + if (!IsRegisterSetAvailable(set_index)) + return nullptr; + switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) { case llvm::Triple::x86: return &g_reg_sets_i386[set_index]; @@ -648,4 +651,28 @@ return YMMSplitPtr{&fpreg->sv_xmm[reg_index], &ymmreg[reg_index]}; } +bool NativeRegisterContextFreeBSD_x86_64::IsRegisterSetAvailable( + uint32_t set_index) const { + switch (static_cast(set_index)) { + case GPRegSet: + case FPRegSet: + case DBRegSet: + return true; + case YMMRegSet: { + struct ptrace_xstate_info info; + Status ret = NativeProcessFreeBSD::PtraceWrapper( + PT_GETXSTATE_INFO, GetProcessPid(), &info, sizeof(info)); + if (!ret.Success()) + return false; + + assert(info.xsave_mask & XFEATURE_ENABLED_X87); + assert(info.xsave_mask & XFEATURE_ENABLED_SSE); + return !!(info.xsave_mask & XFEATURE_ENABLED_YMM_HI128); + } + case MPXRegSet: + return false; + } + llvm_unreachable("Unknown register set"); +} + #endif // defined(__x86_64__)