[Lldb-commits] [PATCH] D91422: [lldb] [Process/FreeBSDRemote] Check for regset support early [WIP]
Michał Górny via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Fri Nov 13 07:15:33 PST 2020
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();
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D91422.305138.patch
Type: text/x-patch
Size: 3709 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20201113/7f2ecc46/attachment.bin>
More information about the lldb-commits
mailing list