mgorny created this revision. mgorny added reviewers: labath, krytarowski, emaste. mgorny requested review of this revision.
@labath, I'm trying to copy the logic from Linux here but for some reason unsupported regsets are now reported as 'unknown' instead of not all. Any clue what I'm doing wrong? https://reviews.llvm.org/D91422 Files: lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.cpp lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD.h lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.cpp lldb/source/Plugins/Process/FreeBSDRemote/NativeRegisterContextFreeBSD_x86_64.h 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<YMMSplitPtr> 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<RegSetKind>(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__) 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 <sys/ptrace.h> // clang-format on -NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() { +NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() const { return static_cast<NativeProcessFreeBSD &>(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<YMMSplitPtr> 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<RegSetKind>(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__) 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 <sys/ptrace.h> // clang-format on -NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() { +NativeProcessFreeBSD &NativeRegisterContextFreeBSD::GetProcess() const { return static_cast<NativeProcessFreeBSD &>(m_thread.GetProcess()); } -::pid_t NativeRegisterContextFreeBSD::GetProcessPid() { +::pid_t NativeRegisterContextFreeBSD::GetProcessPid() const { return GetProcess().GetID(); }
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits