[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