[Lldb-commits] [lldb] r228304 - Fix "-data-list-register-values" MI commands.

Hafiz Abid Qadeer hafiz_abid at mentor.com
Thu Feb 5 07:55:43 PST 2015


Author: abidh
Date: Thu Feb  5 09:55:43 2015
New Revision: 228304

URL: http://llvm.org/viewvc/llvm-project?rev=228304&view=rev
Log:
Fix "-data-list-register-values" MI commands.

If register numbers are not provided then this commands is supposed
to return all the register values. But it was returning nothing in
that case.

More details about this command at
https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Data-Manipulation.html#GDB_002fMI-Data-Manipulation


Modified:
    lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp
    lldb/trunk/tools/lldb-mi/MICmdCmdData.h

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp?rev=228304&r1=228303&r2=228304&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdData.cpp Thu Feb  5 09:55:43 2015
@@ -982,24 +982,41 @@ CMICmdCmdDataListRegisterValues::Execute
     }
 
     const CMICmdArgValListBase::VecArgObjPtr_t &rVecRegNo(pArgRegNo->GetExpectedOptions());
-    CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecRegNo.begin();
-    while (it != rVecRegNo.end())
+    if (!rVecRegNo.empty ())
     {
-        const CMICmdArgValNumber *pRegNo = static_cast<CMICmdArgValNumber *>(*it);
-        const MIuint nReg = pRegNo->GetValue();
-        lldb::SBValue regValue = GetRegister(nReg);
-        const CMIUtilString strRegValue(CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted(regValue, eFormat));
-
-        const CMICmnMIValueConst miValueConst(CMIUtilString::Format("%u", nReg));
-        const CMICmnMIValueResult miValueResult("number", miValueConst);
-        CMICmnMIValueTuple miValueTuple(miValueResult);
-        const CMICmnMIValueConst miValueConst2(strRegValue);
-        const CMICmnMIValueResult miValueResult2("value", miValueConst2);
-        miValueTuple.Add(miValueResult2);
-        m_miValueList.Add(miValueTuple);
-
-        // Next
-        ++it;
+        CMICmdArgValListBase::VecArgObjPtr_t::const_iterator it = rVecRegNo.begin();
+        while (it != rVecRegNo.end ())
+        {
+            const CMICmdArgValNumber *pRegNo = static_cast<CMICmdArgValNumber *>(*it);
+            const MIuint nReg = pRegNo->GetValue ();
+            lldb::SBValue regValue = GetRegister (nReg);
+            AddToOutput (regValue, nReg, eFormat);
+            // Next
+            ++it;
+        }
+    }
+    else
+    {
+        // No register numbers are provided. Output all registers.
+        lldb::SBThread thread = sbProcess.GetSelectedThread ();
+        lldb::SBFrame frame = thread.GetSelectedFrame ();
+        lldb::SBValueList registers = frame.GetRegisters ();
+        const MIuint nRegisters = registers.GetSize ();
+        MIuint index = 0;
+        for (MIuint i = 0; i < nRegisters; i++)
+        {
+            lldb::SBValue value = registers.GetValueAtIndex (i);
+            const MIuint nRegChildren = value.GetNumChildren ();
+            for (MIuint j = 0; j < nRegChildren; j++)
+            {
+                lldb::SBValue reg_value = value.GetChildAtIndex (j);
+                if (reg_value.IsValid ())
+                {
+                    AddToOutput (reg_value, index, eFormat);
+                    index++;
+                }
+            }
+        }
     }
 
     return MIstatus::success;
@@ -1070,6 +1087,28 @@ CMICmdCmdDataListRegisterValues::GetRegi
     return lldb::SBValue();
 }
 
+//++ ------------------------------------------------------------------------------------
+// Details: Adds the register value to the output list.
+// Type:    Method.
+// Args:    Value of the register, its index and output format.
+// Return:  None
+// Throws:  None.
+//--
+void
+CMICmdCmdDataListRegisterValues::AddToOutput (const lldb::SBValue& value, MIuint index,
+	    CMICmnLLDBDebugSessionInfoVarObj::varFormat_e eFormat)
+{
+    const CMICmnMIValueConst miValueConst (CMIUtilString::Format ("%u", index));
+    const CMICmnMIValueResult miValueResult ("number", miValueConst);
+    const CMIUtilString strRegValue (CMICmnLLDBDebugSessionInfoVarObj::GetValueStringFormatted (value, eFormat));
+    const CMICmnMIValueConst miValueConst2 (strRegValue);
+    const CMICmnMIValueResult miValueResult2 ("value", miValueConst2);
+
+    CMICmnMIValueTuple miValueTuple (miValueResult);
+    miValueTuple.Add (miValueResult2);
+    m_miValueList.Add (miValueTuple);
+}
+
 //---------------------------------------------------------------------------------------
 //---------------------------------------------------------------------------------------
 //---------------------------------------------------------------------------------------

Modified: lldb/trunk/tools/lldb-mi/MICmdCmdData.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-mi/MICmdCmdData.h?rev=228304&r1=228303&r2=228304&view=diff
==============================================================================
--- lldb/trunk/tools/lldb-mi/MICmdCmdData.h (original)
+++ lldb/trunk/tools/lldb-mi/MICmdCmdData.h Thu Feb  5 09:55:43 2015
@@ -42,6 +42,7 @@
 #include "MICmdBase.h"
 #include "MICmnMIValueTuple.h"
 #include "MICmnMIValueList.h"
+#include "MICmnLLDBDebugSessionInfoVarObj.h"
 
 //++ ============================================================================
 // Details: MI command class. MI commands derived from the command base class.
@@ -255,6 +256,7 @@ class CMICmdCmdDataListRegisterValues :
     // Methods:
   private:
     lldb::SBValue GetRegister(const MIuint vRegisterIndex) const;
+    void AddToOutput (const lldb::SBValue& value, MIuint index, CMICmnLLDBDebugSessionInfoVarObj::varFormat_e eFormat);
 
     // Attributes:
   private:





More information about the lldb-commits mailing list