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:


_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to