omjavaid updated this revision to Diff 263937.
omjavaid added a comment.

This updated diff reduces impact of register numbering correction on LLGS code 
by removing UserRegIndexToRegInfosIndex out of the code and instead overriding 
GetRegisterInfoAtIndex in NativeRegisterContextLinux_arm64.


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

https://reviews.llvm.org/D77043

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

Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
===================================================================
--- lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
+++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
@@ -242,11 +242,15 @@
       // Index of the primordial register.
       bool success = true;
       for (uint32_t idx = 0; success; ++idx) {
-        const uint32_t prim_reg = reg_info->value_regs[idx];
+        uint32_t prim_reg = reg_info->value_regs[idx];
         if (prim_reg == LLDB_INVALID_REGNUM)
           break;
         // We have a valid primordial register as our constituent. Grab the
         // corresponding register info.
+        uint32_t regnum = ConvertRegisterKindToRegisterNumber(
+            eRegisterKindProcessPlugin, prim_reg);
+        if (regnum != LLDB_INVALID_REGNUM)
+          prim_reg = regnum;
         const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg);
         if (prim_reg_info == nullptr)
           success = false;
@@ -375,11 +379,15 @@
           // Invalidate this composite register first.
 
           for (uint32_t idx = 0; success; ++idx) {
-            const uint32_t reg = reg_info->value_regs[idx];
+            uint32_t reg = reg_info->value_regs[idx];
             if (reg == LLDB_INVALID_REGNUM)
               break;
             // We have a valid primordial register as our constituent. Grab the
             // corresponding register info.
+            uint32_t lldb_regnum = ConvertRegisterKindToRegisterNumber(
+                eRegisterKindProcessPlugin, reg);
+            if (lldb_regnum != LLDB_INVALID_REGNUM)
+              reg = lldb_regnum;
             const RegisterInfo *value_reg_info = GetRegisterInfoAtIndex(reg);
             if (value_reg_info == nullptr)
               success = false;
@@ -397,6 +405,10 @@
           for (uint32_t idx = 0, reg = reg_info->invalidate_regs[0];
                reg != LLDB_INVALID_REGNUM;
                reg = reg_info->invalidate_regs[++idx]) {
+            uint32_t lldb_regnum = ConvertRegisterKindToRegisterNumber(
+                eRegisterKindProcessPlugin, reg);
+            if (lldb_regnum != LLDB_INVALID_REGNUM)
+              reg = lldb_regnum;
             SetRegisterIsValid(reg, false);
           }
         }
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
@@ -458,15 +458,18 @@
   }
 }
 
-static void CollectRegNums(const uint32_t *reg_num, StreamString &response,
+static void CollectRegNums(NativeRegisterContext &reg_context,
+                           const uint32_t *reg_num, StreamString &response,
                            bool usehex) {
+  uint32_t reg_index = 0;
   for (int i = 0; *reg_num != LLDB_INVALID_REGNUM; ++reg_num, ++i) {
+    reg_index = reg_context.RegInfosIndexToUserRegIndex(*reg_num);
     if (i > 0)
       response.PutChar(',');
     if (usehex)
-      response.Printf("%" PRIx32, *reg_num);
+      response.Printf("%" PRIx32, reg_index);
     else
-      response.Printf("%" PRIu32, *reg_num);
+      response.Printf("%" PRIu32, reg_index);
   }
 }
 
@@ -1820,13 +1823,13 @@
 
   if (reg_info->value_regs && reg_info->value_regs[0] != LLDB_INVALID_REGNUM) {
     response.PutCString("container-regs:");
-    CollectRegNums(reg_info->value_regs, response, true);
+    CollectRegNums(reg_context, reg_info->value_regs, response, true);
     response.PutChar(';');
   }
 
   if (reg_info->invalidate_regs && reg_info->invalidate_regs[0]) {
     response.PutCString("invalidate-regs:");
-    CollectRegNums(reg_info->invalidate_regs, response, true);
+    CollectRegNums(reg_context, reg_info->invalidate_regs, response, true);
     response.PutChar(';');
   }
 
@@ -2811,13 +2814,13 @@
     if (reg_info->value_regs &&
         reg_info->value_regs[0] != LLDB_INVALID_REGNUM) {
       response.PutCString("value_regnums=\"");
-      CollectRegNums(reg_info->value_regs, response, false);
+      CollectRegNums(reg_context, reg_info->value_regs, response, false);
       response.Printf("\" ");
     }
 
     if (reg_info->invalidate_regs && reg_info->invalidate_regs[0]) {
       response.PutCString("invalidate_regnums=\"");
-      CollectRegNums(reg_info->invalidate_regs, response, false);
+      CollectRegNums(reg_context, reg_info->invalidate_regs, response, false);
       response.Printf("\" ");
     }
 
Index: lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.h
===================================================================
--- lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.h
+++ lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.h
@@ -29,6 +29,8 @@
 
   uint32_t GetUserRegisterCount() const override;
 
+  uint32_t RegInfosIndexToUserRegIndex(uint32_t user_reg_index) const override;
+
   const RegisterInfo *GetRegisterInfoAtIndex(uint32_t reg_index) const override;
 
   const RegisterInfoInterface &GetRegisterInfoInterface() const;
Index: lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.cpp
===================================================================
--- lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.cpp
+++ lldb/source/Plugins/Process/Utility/NativeRegisterContextRegisterInfo.cpp
@@ -28,6 +28,11 @@
   return m_register_info_interface_up->GetUserRegisterCount();
 }
 
+uint32_t NativeRegisterContextRegisterInfo::RegInfosIndexToUserRegIndex(
+    uint32_t reg_infos_index) const {
+  return reg_infos_index;
+}
+
 const RegisterInfo *NativeRegisterContextRegisterInfo::GetRegisterInfoAtIndex(
     uint32_t reg_index) const {
   if (reg_index <= GetRegisterCount())
Index: lldb/include/lldb/Host/common/NativeRegisterContext.h
===================================================================
--- lldb/include/lldb/Host/common/NativeRegisterContext.h
+++ lldb/include/lldb/Host/common/NativeRegisterContext.h
@@ -35,6 +35,9 @@
 
   virtual uint32_t GetUserRegisterCount() const = 0;
 
+  virtual uint32_t
+  RegInfosIndexToUserRegIndex(uint32_t user_reg_index) const = 0;
+
   virtual const RegisterInfo *GetRegisterInfoAtIndex(uint32_t reg) const = 0;
 
   const char *GetRegisterSetNameForRegisterAtIndex(uint32_t reg_index) const;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to