[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-11-30 Thread Muhammad Omair Javaid via Phabricator via lldb-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGb69c09bf4352: Support custom expedited register set in 
gdb-remote (authored by omjavaid).
Herald added a project: LLDB.

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

Files:
  lldb/include/lldb/Host/common/NativeRegisterContext.h
  lldb/source/Host/common/NativeRegisterContext.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp

Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -503,7 +503,7 @@
   }
 }
 
-static llvm::Expected
+static llvm::Optional
 GetRegistersAsJSON(NativeThreadProtocol ) {
   Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_THREAD));
 
@@ -512,30 +512,16 @@
   json::Object register_object;
 
 #ifdef LLDB_JTHREADSINFO_FULL_REGISTER_SET
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p = reg_ctx_sp->GetRegisterSet(0);
-  if (!reg_set_p)
-return llvm::make_error("failed to get registers",
-   llvm::inconvertibleErrorCode());
-  for (const uint32_t *reg_num_p = reg_set_p->registers;
-   *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
-uint32_t reg_num = *reg_num_p;
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 #else
-  // Expedite only a couple of registers until we figure out why sending
-  // registers is expensive.
-  static const uint32_t k_expedited_registers[] = {
-  LLDB_REGNUM_GENERIC_PC, LLDB_REGNUM_GENERIC_SP, LLDB_REGNUM_GENERIC_FP,
-  LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM};
-
-  for (const uint32_t *generic_reg_p = k_expedited_registers;
-   *generic_reg_p != LLDB_INVALID_REGNUM; ++generic_reg_p) {
-uint32_t reg_num = reg_ctx.ConvertRegisterKindToRegisterNumber(
-eRegisterKindGeneric, *generic_reg_p);
-if (reg_num == LLDB_INVALID_REGNUM)
-  continue; // Target does not support the given register.
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Minimal);
 #endif
+  if (expedited_regs.empty())
+return llvm::None;
 
+  for (auto _num : expedited_regs) {
 const RegisterInfo *const reg_info_p =
 reg_ctx.GetRegisterInfoAtIndex(reg_num);
 if (reg_info_p == nullptr) {
@@ -628,12 +614,8 @@
 json::Object thread_obj;
 
 if (!abridged) {
-  if (llvm::Expected registers =
-  GetRegistersAsJSON(*thread)) {
+  if (llvm::Optional registers = GetRegistersAsJSON(*thread))
 thread_obj.try_emplace("registers", std::move(*registers));
-  } else {
-return registers.takeError();
-  }
 }
 
 thread_obj.try_emplace("tid", static_cast(tid));
@@ -814,46 +796,27 @@
 
   // Grab the register context.
   NativeRegisterContext& reg_ctx = thread->GetRegisterContext();
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p;
-  if (reg_ctx.GetRegisterSetCount() > 0 &&
-  ((reg_set_p = reg_ctx.GetRegisterSet(0)) != nullptr)) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s expediting registers "
-  "from set '%s' (registers set count: %zu)",
-  __FUNCTION__, reg_set_p->name ? reg_set_p->name : "",
-  reg_set_p->num_registers);
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 
-for (const uint32_t *reg_num_p = reg_set_p->registers;
- *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
-  const RegisterInfo *const reg_info_p =
-  reg_ctx.GetRegisterInfoAtIndex(*reg_num_p);
-  if (reg_info_p == nullptr) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s failed to get "
-  "register info for register set '%s', register index "
-  "%" PRIu32,
+  for (auto _num : expedited_regs) {
+const RegisterInfo *const reg_info_p =
+reg_ctx.GetRegisterInfoAtIndex(reg_num);
+// Only expediate registers that are not contained in other registers.
+if (reg_info_p != nullptr && reg_info_p->value_regs == nullptr) {
+  RegisterValue reg_value;
+  Status error = reg_ctx.ReadRegister(reg_info_p, reg_value);
+  if (error.Success()) {
+response.Printf("%.02x:", reg_num);
+WriteRegisterValueInHexFixedWidth(response, reg_ctx, *reg_info_p,
+  _value, lldb::eByteOrderBig);
+response.PutChar(';');
+  } else {
+

[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-08-31 Thread Muhammad Omair Javaid via Phabricator via lldb-commits
omjavaid updated this revision to Diff 288942.
omjavaid added a comment.

Fixed review comments.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

Files:
  lldb/include/lldb/Host/common/NativeRegisterContext.h
  lldb/source/Host/common/NativeRegisterContext.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp

Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -495,7 +495,7 @@
   }
 }
 
-static llvm::Expected
+static llvm::Optional
 GetRegistersAsJSON(NativeThreadProtocol ) {
   Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_THREAD));
 
@@ -504,30 +504,16 @@
   json::Object register_object;
 
 #ifdef LLDB_JTHREADSINFO_FULL_REGISTER_SET
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p = reg_ctx_sp->GetRegisterSet(0);
-  if (!reg_set_p)
-return llvm::make_error("failed to get registers",
-   llvm::inconvertibleErrorCode());
-  for (const uint32_t *reg_num_p = reg_set_p->registers;
-   *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
-uint32_t reg_num = *reg_num_p;
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 #else
-  // Expedite only a couple of registers until we figure out why sending
-  // registers is expensive.
-  static const uint32_t k_expedited_registers[] = {
-  LLDB_REGNUM_GENERIC_PC, LLDB_REGNUM_GENERIC_SP, LLDB_REGNUM_GENERIC_FP,
-  LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM};
-
-  for (const uint32_t *generic_reg_p = k_expedited_registers;
-   *generic_reg_p != LLDB_INVALID_REGNUM; ++generic_reg_p) {
-uint32_t reg_num = reg_ctx.ConvertRegisterKindToRegisterNumber(
-eRegisterKindGeneric, *generic_reg_p);
-if (reg_num == LLDB_INVALID_REGNUM)
-  continue; // Target does not support the given register.
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Minimal);
 #endif
+  if (expedited_regs.empty())
+return llvm::None;
 
+  for (auto _num : expedited_regs) {
 const RegisterInfo *const reg_info_p =
 reg_ctx.GetRegisterInfoAtIndex(reg_num);
 if (reg_info_p == nullptr) {
@@ -620,12 +606,8 @@
 json::Object thread_obj;
 
 if (!abridged) {
-  if (llvm::Expected registers =
-  GetRegistersAsJSON(*thread)) {
+  if (llvm::Optional registers = GetRegistersAsJSON(*thread))
 thread_obj.try_emplace("registers", std::move(*registers));
-  } else {
-return registers.takeError();
-  }
 }
 
 thread_obj.try_emplace("tid", static_cast(tid));
@@ -806,46 +788,27 @@
 
   // Grab the register context.
   NativeRegisterContext& reg_ctx = thread->GetRegisterContext();
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p;
-  if (reg_ctx.GetRegisterSetCount() > 0 &&
-  ((reg_set_p = reg_ctx.GetRegisterSet(0)) != nullptr)) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s expediting registers "
-  "from set '%s' (registers set count: %zu)",
-  __FUNCTION__, reg_set_p->name ? reg_set_p->name : "",
-  reg_set_p->num_registers);
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 
-for (const uint32_t *reg_num_p = reg_set_p->registers;
- *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
-  const RegisterInfo *const reg_info_p =
-  reg_ctx.GetRegisterInfoAtIndex(*reg_num_p);
-  if (reg_info_p == nullptr) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s failed to get "
-  "register info for register set '%s', register index "
-  "%" PRIu32,
+  for (auto _num : expedited_regs) {
+const RegisterInfo *const reg_info_p =
+reg_ctx.GetRegisterInfoAtIndex(reg_num);
+// Only expediate registers that are not contained in other registers.
+if (reg_info_p != nullptr && reg_info_p->value_regs == nullptr) {
+  RegisterValue reg_value;
+  Status error = reg_ctx.ReadRegister(reg_info_p, reg_value);
+  if (error.Success()) {
+response.Printf("%.02x:", reg_num);
+WriteRegisterValueInHexFixedWidth(response, reg_ctx, *reg_info_p,
+  _value, lldb::eByteOrderBig);
+response.PutChar(';');
+  } else {
+LLDB_LOGF(log, "GDBRemoteCommunicationServerLLGS::%s failed to read "
+   "register '%s' index %" PRIu32 ": %s",
   

[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-08-26 Thread Pavel Labath via Phabricator via lldb-commits
labath accepted this revision.
labath added a comment.
This revision is now accepted and ready to land.

I like this a lot. LGTM with some small fixes inline.




Comment at: lldb/source/Host/common/NativeRegisterContext.cpp:428-434
+static const uint32_t k_expedited_registers[] = {
+LLDB_REGNUM_GENERIC_PC, LLDB_REGNUM_GENERIC_SP, LLDB_REGNUM_GENERIC_FP,
+LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM};
+
+std::vector expedited_reg_nums;
+for (const uint32_t *generic_reg_p = k_expedited_registers;
+ *generic_reg_p != LLDB_INVALID_REGNUM; ++generic_reg_p) {

Remove LLDB_INVALID_REGNUM from the list. Then iterate as `for(uint32_t 
gen_reg: k_expedited_registers)`.



Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:513-515
+  if (expedited_regs.empty())
+return llvm::make_error("failed to get registers",
+   llvm::inconvertibleErrorCode());

Let's change the result type to `Optional` and `return None` here -- 
now that we support customizing the expedited registers, I think it's 
reasonable to allow a register context to say it does not want to expedite any 
registers. (The current for of the code already kind of supports that, but the 
use of Expected makes it sound like that is an erroneous state.)



Comment at: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp:798
 
-for (const uint32_t *reg_num_p = reg_set_p->registers;
- *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
+  if (!expedited_regs.empty()) {
+for (auto _num : expedited_regs) {

I don't think this if is needed now -- we could remove it and save one level of 
indentation.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-08-24 Thread Muhammad Omair Javaid via Phabricator via lldb-commits
omjavaid updated this revision to Diff 287323.
omjavaid added a comment.

This reworks previous implementation by returning a vector containing register 
numbers to be expedited. Default case is minimal set of generic registers or 
complete register set 0.

In the child rev D82855  for 
NativeRegisterContextLinux_arm64 we call the base function and push_back vg reg 
num into register number vector before return.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

Files:
  lldb/include/lldb/Host/common/NativeRegisterContext.h
  lldb/source/Host/common/NativeRegisterContext.cpp
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp

Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -504,30 +504,16 @@
   json::Object register_object;
 
 #ifdef LLDB_JTHREADSINFO_FULL_REGISTER_SET
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p = reg_ctx_sp->GetRegisterSet(0);
-  if (!reg_set_p)
-return llvm::make_error("failed to get registers",
-   llvm::inconvertibleErrorCode());
-  for (const uint32_t *reg_num_p = reg_set_p->registers;
-   *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
-uint32_t reg_num = *reg_num_p;
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 #else
-  // Expedite only a couple of registers until we figure out why sending
-  // registers is expensive.
-  static const uint32_t k_expedited_registers[] = {
-  LLDB_REGNUM_GENERIC_PC, LLDB_REGNUM_GENERIC_SP, LLDB_REGNUM_GENERIC_FP,
-  LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM};
-
-  for (const uint32_t *generic_reg_p = k_expedited_registers;
-   *generic_reg_p != LLDB_INVALID_REGNUM; ++generic_reg_p) {
-uint32_t reg_num = reg_ctx.ConvertRegisterKindToRegisterNumber(
-eRegisterKindGeneric, *generic_reg_p);
-if (reg_num == LLDB_INVALID_REGNUM)
-  continue; // Target does not support the given register.
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Minimal);
 #endif
-
+  if (expedited_regs.empty())
+return llvm::make_error("failed to get registers",
+   llvm::inconvertibleErrorCode());
+  for (auto _num : expedited_regs) {
 const RegisterInfo *const reg_info_p =
 reg_ctx.GetRegisterInfoAtIndex(reg_num);
 if (reg_info_p == nullptr) {
@@ -806,35 +792,19 @@
 
   // Grab the register context.
   NativeRegisterContext& reg_ctx = thread->GetRegisterContext();
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p;
-  if (reg_ctx.GetRegisterSetCount() > 0 &&
-  ((reg_set_p = reg_ctx.GetRegisterSet(0)) != nullptr)) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s expediting registers "
-  "from set '%s' (registers set count: %zu)",
-  __FUNCTION__, reg_set_p->name ? reg_set_p->name : "",
-  reg_set_p->num_registers);
+  const auto expedited_regs =
+  reg_ctx.GetExpeditedRegisters(ExpeditedRegs::Full);
 
-for (const uint32_t *reg_num_p = reg_set_p->registers;
- *reg_num_p != LLDB_INVALID_REGNUM; ++reg_num_p) {
+  if (!expedited_regs.empty()) {
+for (auto _num : expedited_regs) {
   const RegisterInfo *const reg_info_p =
-  reg_ctx.GetRegisterInfoAtIndex(*reg_num_p);
-  if (reg_info_p == nullptr) {
-LLDB_LOGF(log,
-  "GDBRemoteCommunicationServerLLGS::%s failed to get "
-  "register info for register set '%s', register index "
-  "%" PRIu32,
-  __FUNCTION__,
-  reg_set_p->name ? reg_set_p->name : "",
-  *reg_num_p);
-  } else if (reg_info_p->value_regs == nullptr) {
-// Only expediate registers that are not contained in other registers.
+  reg_ctx.GetRegisterInfoAtIndex(reg_num);
+  // Only expediate registers that are not contained in other registers.
+  if (reg_info_p != nullptr && reg_info_p->value_regs == nullptr) {
 RegisterValue reg_value;
 Status error = reg_ctx.ReadRegister(reg_info_p, reg_value);
 if (error.Success()) {
-  response.Printf("%.02x:", *reg_num_p);
+  response.Printf("%.02x:", reg_num);
   WriteRegisterValueInHexFixedWidth(response, reg_ctx, *reg_info_p,
 _value, lldb::eByteOrderBig);
   response.PutChar(';');
@@ 

[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-08-19 Thread Pavel Labath via Phabricator via lldb-commits
labath added a comment.

Looking at the dependent patch, I see that you need to conjure up a fake 
register set to make this work. That works, but doesn't seem entirely optimal. 
This expedition function doesn't really care about register sets, it just needs 
a way to get a list of registers. What if we just made the interface return 
that? (e.g. `ArrayRef GetExpeditedRegisters()`)

And instead of handing the nullptr specially in the caller, we could just make 
the default implementation of this function return the first (zeroth) register 
set...


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-08-19 Thread Muhammad Omair Javaid via Phabricator via lldb-commits
omjavaid added a comment.

@labath  ping!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82853/new/

https://reviews.llvm.org/D82853

___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D82853: [LLDB] Support custom expedited register set in gdb-remote

2020-06-30 Thread Muhammad Omair Javaid via Phabricator via lldb-commits
omjavaid created this revision.
omjavaid added a reviewer: labath.
Herald added a subscriber: kristof.beyls.
Herald added a reviewer: rengolin.
omjavaid added parent revisions: D79699: Add ptrace register access for AArch64 
SVE registers, D77047: AArch64 SVE register infos and core file support.

This patch adds capability to introduce a custom expedited register set in gdb 
remote. Currently we sent register set 0 as expedited register but for the case 
of AArch64 SVE we intend to send additional information about register set 
configuration stored in vg register. This will happen only when SVE mode is 
selected so we need a way to inform gdb-remote which register set to use when.


https://reviews.llvm.org/D82853

Files:
  lldb/include/lldb/Host/common/NativeRegisterContext.h
  lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp


Index: 
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -806,11 +806,17 @@
 
   // Grab the register context.
   NativeRegisterContext& reg_ctx = thread->GetRegisterContext();
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p;
-  if (reg_ctx.GetRegisterSetCount() > 0 &&
-  ((reg_set_p = reg_ctx.GetRegisterSet(0)) != nullptr)) {
+  const RegisterSet *reg_set_p = reg_ctx.GetExpeditedRegisterSet();
+
+  if (reg_set_p == nullptr) {
+// Architecture does not specify an expedited register set.
+// Expedite all registers in the first register set (i.e. should be GPRs)
+// that are not contained in other registers.
+if (reg_ctx.GetRegisterSetCount() > 0)
+  reg_set_p = reg_ctx.GetRegisterSet(0);
+  }
+
+  if (reg_set_p != nullptr) {
 LLDB_LOGF(log,
   "GDBRemoteCommunicationServerLLGS::%s expediting registers "
   "from set '%s' (registers set count: %zu)",
Index: lldb/include/lldb/Host/common/NativeRegisterContext.h
===
--- lldb/include/lldb/Host/common/NativeRegisterContext.h
+++ lldb/include/lldb/Host/common/NativeRegisterContext.h
@@ -114,6 +114,8 @@
 
   virtual NativeThreadProtocol () { return m_thread; }
 
+  virtual const RegisterSet *GetExpeditedRegisterSet() const { return nullptr; 
}
+
   const RegisterInfo *GetRegisterInfoByName(llvm::StringRef reg_name,
 uint32_t start_idx = 0);
 


Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
===
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -806,11 +806,17 @@
 
   // Grab the register context.
   NativeRegisterContext& reg_ctx = thread->GetRegisterContext();
-  // Expedite all registers in the first register set (i.e. should be GPRs)
-  // that are not contained in other registers.
-  const RegisterSet *reg_set_p;
-  if (reg_ctx.GetRegisterSetCount() > 0 &&
-  ((reg_set_p = reg_ctx.GetRegisterSet(0)) != nullptr)) {
+  const RegisterSet *reg_set_p = reg_ctx.GetExpeditedRegisterSet();
+
+  if (reg_set_p == nullptr) {
+// Architecture does not specify an expedited register set.
+// Expedite all registers in the first register set (i.e. should be GPRs)
+// that are not contained in other registers.
+if (reg_ctx.GetRegisterSetCount() > 0)
+  reg_set_p = reg_ctx.GetRegisterSet(0);
+  }
+
+  if (reg_set_p != nullptr) {
 LLDB_LOGF(log,
   "GDBRemoteCommunicationServerLLGS::%s expediting registers "
   "from set '%s' (registers set count: %zu)",
Index: lldb/include/lldb/Host/common/NativeRegisterContext.h
===
--- lldb/include/lldb/Host/common/NativeRegisterContext.h
+++ lldb/include/lldb/Host/common/NativeRegisterContext.h
@@ -114,6 +114,8 @@
 
   virtual NativeThreadProtocol () { return m_thread; }
 
+  virtual const RegisterSet *GetExpeditedRegisterSet() const { return nullptr; }
+
   const RegisterInfo *GetRegisterInfoByName(llvm::StringRef reg_name,
 uint32_t start_idx = 0);
 
___
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits