labath created this revision.
Herald added subscribers: kbarton, kristof.beyls, javed.absar, nemanjai, 
emaste, aemerson.

In https://reviews.llvm.org/D39681, we started using a map instead passing a 
long list of
register sets to the ppc64le register context. However, existing
register sets were still using the old method.

This converts remaining register contexts to use the register set map.
While doing this, I realized that using OS-specific keys for the map was
not a good idea, as sometimes we have a register context shared between
two OSs (e.g. linux and freebsd share the arm/arm64 register contexts).
Therefore, I create a new enum to represent register sets in an
OS-independent manner (the enum contains the generic GPR and FPR values,
but the rest of the values are likely to be architecture-specific).

This saves a bit of code now, but the real impact I see here is that it
can potentially pave the way for reduction of the number of register
context classes (for example RegisterContextPOSIXCore_arm and
RegisterContextPOSIXCore_arm64 are identical except that we initialize
them with a different RegisterInfoInterface object).


https://reviews.llvm.org/D40133

Files:
  source/Plugins/Process/elf-core/ProcessElfCore.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
  source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h
  source/Plugins/Process/elf-core/ThreadElfCore.cpp
  source/Plugins/Process/elf-core/ThreadElfCore.h
  source/Plugins/Process/elf-core/elf-core-enums.h
  source/Plugins/Process/minidump/ThreadMinidump.cpp

Index: source/Plugins/Process/minidump/ThreadMinidump.cpp
===================================================================
--- source/Plugins/Process/minidump/ThreadMinidump.cpp
+++ source/Plugins/Process/minidump/ThreadMinidump.cpp
@@ -17,8 +17,8 @@
 // Other libraries and framework includes
 #include "Plugins/Process/Utility/RegisterContextLinux_i386.h"
 #include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h"
-
 #include "Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 
 #include "lldb/Target/RegisterContext.h"
 #include "lldb/Target/StopInfo.h"
@@ -74,20 +74,20 @@
       reg_interface = new RegisterContextLinux_i386(arch);
       lldb::DataBufferSP buf =
           ConvertMinidumpContext_x86_32(m_gpregset_data, reg_interface);
-      DataExtractor gpregs(buf, lldb::eByteOrderLittle, 4);
-      DataExtractor fpregs;
-      m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64(
-          *this, reg_interface, gpregs, fpregs));
+      CoreRegsetMap regsets;
+      regsets[CoreRegset::GPR] = DataExtractor(buf, lldb::eByteOrderLittle, 4);
+      m_thread_reg_ctx_sp.reset(
+          new RegisterContextCorePOSIX_x86_64(*this, reg_interface, regsets));
       break;
     }
     case llvm::Triple::x86_64: {
       reg_interface = new RegisterContextLinux_x86_64(arch);
       lldb::DataBufferSP buf =
           ConvertMinidumpContext_x86_64(m_gpregset_data, reg_interface);
-      DataExtractor gpregs(buf, lldb::eByteOrderLittle, 8);
-      DataExtractor fpregs;
-      m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64(
-          *this, reg_interface, gpregs, fpregs));
+      CoreRegsetMap regsets;
+      regsets[CoreRegset::GPR] = DataExtractor(buf, lldb::eByteOrderLittle, 8);
+      m_thread_reg_ctx_sp.reset(
+          new RegisterContextCorePOSIX_x86_64(*this, reg_interface, regsets));
       break;
     }
     default:
Index: source/Plugins/Process/elf-core/elf-core-enums.h
===================================================================
--- source/Plugins/Process/elf-core/elf-core-enums.h
+++ source/Plugins/Process/elf-core/elf-core-enums.h
@@ -10,6 +10,9 @@
 #ifndef LLDB_ELF_CORE_ENUMS_H
 #define LLDB_ELF_CORE_ENUMS_H
 
+#include "llvm/ADT/DenseMap.h"
+
+namespace lldb_private {
 /// Core files PT_NOTE segment descriptor types
 
 namespace FREEBSD {
@@ -52,4 +55,17 @@
 };
 }
 
+enum class CoreRegset : uint8_t { GPR, FPR, PPC_VMX, PPC_VSX };
+
+struct CoreRegsetInfo {
+  static inline CoreRegset getEmptyKey() { return CoreRegset(-1); }
+  static inline CoreRegset getTombstoneKey() { return CoreRegset(-2); }
+  static inline unsigned getHashValue(CoreRegset set) { return unsigned(set); }
+  static bool isEqual(CoreRegset s1, CoreRegset s2) { return s1 == s2; }
+};
+
+using CoreRegsetMap = llvm::DenseMap<CoreRegset, DataExtractor, CoreRegsetInfo>;
+
+} // namespace lldb_private
+
 #endif // #ifndef LLDB_ELF_CORE_ENUMS_H
Index: source/Plugins/Process/elf-core/ThreadElfCore.h
===================================================================
--- source/Plugins/Process/elf-core/ThreadElfCore.h
+++ source/Plugins/Process/elf-core/ThreadElfCore.h
@@ -10,15 +10,11 @@
 #ifndef liblldb_ThreadElfCore_h_
 #define liblldb_ThreadElfCore_h_
 
-// C Includes
-// C++ Includes
-#include <string>
-
-// Other libraries and framework includes
-// Project includes
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Target/Thread.h"
 #include "lldb/Utility/DataExtractor.h"
 #include "llvm/ADT/DenseMap.h"
+#include <string>
 
 struct compat_timeval {
   alignas(8) uint64_t tv_sec;
@@ -129,10 +125,7 @@
               "sizeof ELFLinuxPrPsInfo is not correct!");
 
 struct ThreadData {
-  lldb_private::DataExtractor gpregset;
-  lldb_private::DataExtractor fpregset;
-  lldb_private::DataExtractor vregset;
-  llvm::DenseMap<uint32_t, lldb_private::DataExtractor> regsets;
+  lldb_private::CoreRegsetMap regsets;
   lldb::tid_t tid;
   int signo = 0;
   int prstatus_sig = 0;
@@ -178,10 +171,7 @@
 
   int m_signo;
 
-  lldb_private::DataExtractor m_gpregset_data;
-  lldb_private::DataExtractor m_fpregset_data;
-  lldb_private::DataExtractor m_vregset_data;
-  llvm::DenseMap<uint32_t, lldb_private::DataExtractor> m_regsets_data;
+  lldb_private::CoreRegsetMap m_regsets_data;
 
   bool CalculateStopInfo() override;
 };
Index: source/Plugins/Process/elf-core/ThreadElfCore.cpp
===================================================================
--- source/Plugins/Process/elf-core/ThreadElfCore.cpp
+++ source/Plugins/Process/elf-core/ThreadElfCore.cpp
@@ -47,9 +47,7 @@
 //----------------------------------------------------------------------
 ThreadElfCore::ThreadElfCore(Process &process, const ThreadData &td)
     : Thread(process, td.tid), m_thread_name(td.name), m_thread_reg_ctx_sp(),
-      m_signo(td.signo), m_gpregset_data(td.gpregset),
-      m_fpregset_data(td.fpregset), m_vregset_data(td.vregset),
-      m_regsets_data(td.regsets) {}
+      m_signo(td.signo), m_regsets_data(td.regsets) {}
 
 ThreadElfCore::~ThreadElfCore() { DestroyThread(); }
 
@@ -197,40 +195,39 @@
     switch (arch.GetMachine()) {
     case llvm::Triple::aarch64:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_arm64(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::arm:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_arm(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::mipsel:
     case llvm::Triple::mips:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64(
-         *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::mips64:
     case llvm::Triple::mips64el:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_mips64(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::ppc:
     case llvm::Triple::ppc64:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data,
-          m_vregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::ppc64le:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_ppc64le(
           *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::systemz:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_s390x(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     case llvm::Triple::x86:
     case llvm::Triple::x86_64:
       m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64(
-          *this, reg_interface, m_gpregset_data, m_fpregset_data));
+          *this, reg_interface, m_regsets_data));
       break;
     default:
       break;
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h
@@ -10,19 +10,15 @@
 #ifndef liblldb_RegisterContextCorePOSIX_x86_64_h_
 #define liblldb_RegisterContextCorePOSIX_x86_64_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_x86.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 
 class RegisterContextCorePOSIX_x86_64 : public RegisterContextPOSIX_x86 {
 public:
   RegisterContextCorePOSIX_x86_64(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
                     lldb_private::RegisterValue &value) override;
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp
@@ -16,17 +16,19 @@
 
 RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_x86(thread, 0, register_info) {
   size_t size, len;
 
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   size = GetGPRSize();
   m_gpregset.reset(new uint8_t[size]);
   len =
       gpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_gpregset.get());
   if (len != size)
     m_gpregset.reset();
 
+  DataExtractor fpregset = regsets.lookup(CoreRegset::FPR);
   size = sizeof(FXSAVE);
   m_fpregset.reset(new uint8_t[size]);
   len =
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.h
@@ -10,20 +10,16 @@
 #ifndef liblldb_RegisterContextCorePOSIX_s390x_h_
 #define liblldb_RegisterContextCorePOSIX_s390x_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_s390x.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataExtractor.h"
 
 class RegisterContextCorePOSIX_s390x : public RegisterContextPOSIX_s390x {
 public:
   RegisterContextCorePOSIX_s390x(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   ~RegisterContextCorePOSIX_s390x() override;
 
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_s390x.cpp
@@ -17,13 +17,15 @@
 
 RegisterContextCorePOSIX_s390x::RegisterContextCorePOSIX_s390x(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_s390x(thread, 0, register_info) {
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
   m_gpr.SetByteOrder(gpregset.GetByteOrder());
 
+  DataExtractor fpregset = regsets.lookup(CoreRegset::GPR);
   m_fpr_buffer.reset(
       new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize()));
   m_fpr.SetData(m_fpr_buffer);
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.h
@@ -10,20 +10,16 @@
 #ifndef liblldb_RegisterContextCorePOSIX_ppc64le_h_
 #define liblldb_RegisterContextCorePOSIX_ppc64le_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_ppc64le.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataExtractor.h"
-#include "llvm/ADT/DenseMap.h"
 
 class RegisterContextCorePOSIX_ppc64le : public RegisterContextPOSIX_ppc64le {
 public:
   RegisterContextCorePOSIX_ppc64le(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const llvm::DenseMap<uint32_t, lldb_private::DataExtractor> &regsets);
+      const lldb_private::CoreRegsetMap &regsets);
 
   bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
                     lldb_private::RegisterValue &value) override;
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_ppc64le.cpp
@@ -20,27 +20,27 @@
 
 RegisterContextCorePOSIX_ppc64le::RegisterContextCorePOSIX_ppc64le(
     Thread &thread, RegisterInfoInterface *register_info,
-    const llvm::DenseMap<uint32_t, lldb_private::DataExtractor> &regsets)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_ppc64le(thread, 0, register_info) {
-  DataExtractor gpregset = regsets.lookup(LINUX::NT_PRSTATUS);
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
   m_gpr.SetByteOrder(gpregset.GetByteOrder());
 
-  DataExtractor fpregset = regsets.lookup(LINUX::NT_FPREGSET);
+  DataExtractor fpregset = regsets.lookup(CoreRegset::FPR);
   m_fpr_buffer.reset(
       new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize()));
   m_fpr.SetData(m_fpr_buffer);
   m_fpr.SetByteOrder(fpregset.GetByteOrder());
 
-  DataExtractor vmxregset = regsets.lookup(LINUX::NT_PPC_VMX);
+  DataExtractor vmxregset = regsets.lookup(CoreRegset::PPC_VMX);
   m_vmx_buffer.reset(
       new DataBufferHeap(vmxregset.GetDataStart(), vmxregset.GetByteSize()));
   m_vmx.SetData(m_vmx_buffer);
   m_vmx.SetByteOrder(vmxregset.GetByteOrder());
 
-  DataExtractor vsxregset = regsets.lookup(LINUX::NT_PPC_VSX);
+  DataExtractor vsxregset = regsets.lookup(CoreRegset::PPC_VSX);
   m_vsx_buffer.reset(
       new DataBufferHeap(vsxregset.GetDataStart(), vsxregset.GetByteSize()));
   m_vsx.SetData(m_vsx_buffer);
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h
@@ -10,21 +10,16 @@
 #ifndef liblldb_RegisterContextCorePOSIX_powerpc_h_
 #define liblldb_RegisterContextCorePOSIX_powerpc_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_powerpc.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataExtractor.h"
 
 class RegisterContextCorePOSIX_powerpc : public RegisterContextPOSIX_powerpc {
 public:
   RegisterContextCorePOSIX_powerpc(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset,
-      const lldb_private::DataExtractor &vregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   ~RegisterContextCorePOSIX_powerpc() override;
 
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp
@@ -17,17 +17,21 @@
 
 RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset,
-    const DataExtractor &vregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_powerpc(thread, 0, register_info) {
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
   m_gpr.SetByteOrder(gpregset.GetByteOrder());
+
+  DataExtractor fpregset = regsets.lookup(CoreRegset::FPR);
   m_fpr_buffer.reset(
       new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize()));
   m_fpr.SetData(m_fpr_buffer);
   m_fpr.SetByteOrder(fpregset.GetByteOrder());
+
+  DataExtractor vregset = regsets.lookup(CoreRegset::PPC_VMX);
   m_vec_buffer.reset(
       new DataBufferHeap(vregset.GetDataStart(), vregset.GetByteSize()));
   m_vec.SetData(m_vec_buffer);
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.h
@@ -10,21 +10,17 @@
 #ifndef liblldb_RegisterContextCorePOSIX_mips64_h_
 #define liblldb_RegisterContextCorePOSIX_mips64_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_mips64.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataBufferHeap.h"
 #include "lldb/Utility/DataExtractor.h"
 
 class RegisterContextCorePOSIX_mips64 : public RegisterContextPOSIX_mips64 {
 public:
   RegisterContextCorePOSIX_mips64(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   ~RegisterContextCorePOSIX_mips64() override;
 
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_mips64.cpp
@@ -16,12 +16,15 @@
 
 RegisterContextCorePOSIX_mips64::RegisterContextCorePOSIX_mips64(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_mips64(thread, 0, register_info) {
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
   m_gpr.SetByteOrder(gpregset.GetByteOrder());
+
+  DataExtractor fpregset = regsets.lookup(CoreRegset::FPR);
   m_fpr_buffer.reset(
       new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize()));
   m_fpr.SetData(m_fpr_buffer);
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.h
@@ -10,21 +10,17 @@
 #ifndef liblldb_RegisterContextCorePOSIX_arm64_h_
 #define liblldb_RegisterContextCorePOSIX_arm64_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_arm64.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataBufferHeap.h"
 #include "lldb/Utility/DataExtractor.h"
 
 class RegisterContextCorePOSIX_arm64 : public RegisterContextPOSIX_arm64 {
 public:
   RegisterContextCorePOSIX_arm64(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   ~RegisterContextCorePOSIX_arm64() override;
 
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm64.cpp
@@ -9,15 +9,17 @@
 
 #include "RegisterContextPOSIXCore_arm64.h"
 
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Core/RegisterValue.h"
 #include "lldb/Target/Thread.h"
 
 using namespace lldb_private;
 
 RegisterContextCorePOSIX_arm64::RegisterContextCorePOSIX_arm64(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_arm64(thread, 0, register_info) {
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.h
@@ -10,21 +10,17 @@
 #ifndef liblldb_RegisterContextCorePOSIX_arm_h_
 #define liblldb_RegisterContextCorePOSIX_arm_h_
 
-// C Includes
-// C++ Includes
-// Other libraries and framework includes
-// Project includes
 #include "Plugins/Process/Utility/RegisterContextPOSIX_arm.h"
+#include "Plugins/Process/elf-core/elf-core-enums.h"
 #include "lldb/Utility/DataBufferHeap.h"
 #include "lldb/Utility/DataExtractor.h"
 
 class RegisterContextCorePOSIX_arm : public RegisterContextPOSIX_arm {
 public:
   RegisterContextCorePOSIX_arm(
       lldb_private::Thread &thread,
       lldb_private::RegisterInfoInterface *register_info,
-      const lldb_private::DataExtractor &gpregset,
-      const lldb_private::DataExtractor &fpregset);
+      const lldb_private::CoreRegsetMap &regsets);
 
   ~RegisterContextCorePOSIX_arm() override;
 
Index: source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp
===================================================================
--- source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp
+++ source/Plugins/Process/elf-core/RegisterContextPOSIXCore_arm.cpp
@@ -16,8 +16,9 @@
 
 RegisterContextCorePOSIX_arm::RegisterContextCorePOSIX_arm(
     Thread &thread, RegisterInfoInterface *register_info,
-    const DataExtractor &gpregset, const DataExtractor &fpregset)
+    const CoreRegsetMap &regsets)
     : RegisterContextPOSIX_arm(thread, 0, register_info) {
+  DataExtractor gpregset = regsets.lookup(CoreRegset::GPR);
   m_gpr_buffer.reset(
       new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize()));
   m_gpr.SetData(m_gpr_buffer);
Index: source/Plugins/Process/elf-core/ProcessElfCore.cpp
===================================================================
--- source/Plugins/Process/elf-core/ProcessElfCore.cpp
+++ source/Plugins/Process/elf-core/ProcessElfCore.cpp
@@ -456,7 +456,7 @@
     offset += 4;
 
   size_t len = data.GetByteSize() - offset;
-  thread_data.gpregset = DataExtractor(data, offset, len);
+  thread_data.regsets[CoreRegset::GPR] = DataExtractor(data, offset, len);
 }
 
 static void ParseFreeBSDThrMisc(ThreadData &thread_data, DataExtractor &data) {
@@ -536,7 +536,8 @@
         ((note.n_type == LINUX::NT_PRPSINFO ||
           note.n_type == FREEBSD::NT_PRPSINFO) &&
          have_prpsinfo)) {
-      assert(thread_data->gpregset.GetByteSize() > 0);
+      assert(thread_data->regsets.find(CoreRegset::GPR) !=
+             thread_data->regsets.end());
       // Add the new thread to thread list
       m_thread_data.push_back(*thread_data);
       *thread_data = ThreadData();
@@ -560,7 +561,10 @@
         ParseFreeBSDPrStatus(*thread_data, note_data, arch);
         break;
       case FREEBSD::NT_FPREGSET:
-        thread_data->fpregset = note_data;
+        thread_data->regsets[CoreRegset::FPR] = note_data;
+        break;
+      case FREEBSD::NT_PPC_VMX:
+        thread_data->regsets[CoreRegset::PPC_VMX] = note_data;
         break;
       case FREEBSD::NT_PRPSINFO:
         have_prpsinfo = true;
@@ -572,9 +576,6 @@
         // FIXME: FreeBSD sticks an int at the beginning of the note
         m_auxv = DataExtractor(segment_data, note_start + 4, note_size - 4);
         break;
-      case FREEBSD::NT_PPC_VMX:
-        thread_data->vregset = note_data;
-        break;
       default:
         break;
       }
@@ -586,12 +587,15 @@
         ParseNetBSDProcInfo(*thread_data, note_data);
       } else if (note.n_type == NETBSD::NT_AUXV) {
         m_auxv = DataExtractor(note_data);
-      } else if (arch.GetMachine() == llvm::Triple::x86_64 &&
-                 note.n_type == NETBSD::NT_AMD64_REGS) {
-        thread_data->gpregset = note_data;
-      } else if (arch.GetMachine() == llvm::Triple::x86_64 &&
-                 note.n_type == NETBSD::NT_AMD64_FPREGS) {
-        thread_data->fpregset = note_data;
+      } else if (arch.GetMachine() == llvm::Triple::x86_64) {
+        switch (note.n_type) {
+        case NETBSD::NT_AMD64_REGS:
+          thread_data->regsets[CoreRegset::GPR] = note_data;
+          break;
+        case NETBSD::NT_AMD64_FPREGS:
+          thread_data->regsets[CoreRegset::FPR] = note_data;
+          break;
+        }
       }
     } else if (note.n_name.substr(0, 7) == "OpenBSD") {
       // OpenBSD per-thread information is stored in notes named
@@ -605,10 +609,10 @@
         m_auxv = DataExtractor(note_data);
         break;
       case OPENBSD::NT_REGS:
-        thread_data->gpregset = note_data;
+        thread_data->regsets[CoreRegset::GPR] = note_data;
         break;
       case OPENBSD::NT_FPREGS:
-        thread_data->fpregset = note_data;
+        thread_data->regsets[CoreRegset::FPR] = note_data;
         break;
       }
     } else if (note.n_name == "CORE") {
@@ -622,21 +626,14 @@
         thread_data->tid = prstatus.pr_pid;
         header_size = ELFLinuxPrStatus::GetSize(arch);
         len = note_data.GetByteSize() - header_size;
-        thread_data->gpregset = DataExtractor(note_data, header_size, len);
-
-        if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic)
-          thread_data->regsets.insert(
-              std::make_pair(note.n_type, thread_data->gpregset));
+        thread_data->regsets[CoreRegset::GPR] =
+            DataExtractor(note_data, header_size, len);
         break;
       case LINUX::NT_FPREGSET:
         // In a i386 core file NT_FPREGSET is present, but it's not the result
         // of the FXSAVE instruction like in 64 bit files.
         // The result from FXSAVE is in NT_PRXFPREG for i386 core files
-        if (arch.GetCore() == ArchSpec::eCore_x86_64_x86_64 || arch.IsMIPS())
-          thread_data->fpregset = note_data;
-        else if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic) {
-          thread_data->regsets.insert(std::make_pair(note.n_type, note_data));
-        }
+        thread_data->regsets[CoreRegset::FPR] = note_data;
         break;
       case LINUX::NT_PRPSINFO:
         have_prpsinfo = true;
@@ -678,21 +675,22 @@
       }
     } else if (note.n_name == "LINUX") {
       switch (note.n_type) {
-      case LINUX::NT_PRXFPREG:
-        thread_data->fpregset = note_data;
-        break;
       case LINUX::NT_PPC_VMX:
+        thread_data->regsets[CoreRegset::PPC_VMX] = note_data;
+        break;
       case LINUX::NT_PPC_VSX:
-        if (arch.GetCore() == ArchSpec::eCore_ppc64le_generic)
-          thread_data->regsets.insert(std::make_pair(note.n_type, note_data));
+        thread_data->regsets[CoreRegset::PPC_VSX] = note_data;
+        break;
+      case LINUX::NT_PRXFPREG:
+        thread_data->regsets[CoreRegset::FPR] = note_data;
         break;
       }
     }
 
     offset += note_size;
   }
   // Add last entry in the note section
-  if (thread_data && thread_data->gpregset.GetByteSize() > 0) {
+  if (thread_data && have_prstatus) {
     m_thread_data.push_back(*thread_data);
   }
 
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] ... Pavel Labath via Phabricator via lldb-commits

Reply via email to