diff options
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote')
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp | 123 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h | 23 |
2 files changed, 43 insertions, 103 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp index 841efa207db..bf1a00c8fdb 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp @@ -14,6 +14,7 @@ // Other libraries and framework includes #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/DataExtractor.h" +#include "lldb/Core/RegisterValue.h" #include "lldb/Core/Scalar.h" #include "lldb/Core/StreamString.h" // Project includes @@ -115,65 +116,14 @@ GDBRemoteRegisterContext::GetRegisterSet (uint32_t reg_set) bool -GDBRemoteRegisterContext::ReadRegisterValue (uint32_t reg, Scalar &value) +GDBRemoteRegisterContext::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value) { // Read the register - if (ReadRegisterBytes (reg, m_reg_data)) + if (ReadRegisterBytes (reg_info, value, m_reg_data)) { - const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); - uint32_t offset = reg_info->byte_offset; - switch (reg_info->encoding) - { - case eEncodingUint: - switch (reg_info->byte_size) - { - case 1: - case 2: - case 4: - value = m_reg_data.GetMaxU32 (&offset, reg_info->byte_size); - return true; - - case 8: - value = m_reg_data.GetMaxU64 (&offset, reg_info->byte_size); - return true; - } - break; - - case eEncodingSint: - switch (reg_info->byte_size) - { - case 1: - case 2: - case 4: - value = (int32_t)m_reg_data.GetMaxU32 (&offset, reg_info->byte_size); - return true; - - case 8: - value = m_reg_data.GetMaxS64 (&offset, reg_info->byte_size); - return true; - } - break; - - case eEncodingIEEE754: - switch (reg_info->byte_size) - { - case sizeof (float): - value = m_reg_data.GetFloat (&offset); - return true; - - case sizeof (double): - value = m_reg_data.GetDouble (&offset); - return true; - - case sizeof (long double): - value = m_reg_data.GetLongDouble (&offset); - return true; - } - break; - - default: - break; - } + const bool partial_data_ok = false; + Error error (value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok)); + return error.Success(); } return false; } @@ -206,14 +156,14 @@ GDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor bool -GDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data) +GDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, DataExtractor &data) { GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); InvalidateIfNeeded(false); - const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); - assert (reg_info); + const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; + if (!m_reg_valid[reg]) { Mutex::Locker locker; @@ -243,6 +193,7 @@ GDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data) else { // Get each register individually + if (thread_suffix_supported) packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4x;", reg, m_thread.GetID()); else @@ -274,21 +225,18 @@ GDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data) bool -GDBRemoteRegisterContext::WriteRegisterValue (uint32_t reg, const Scalar &value) +GDBRemoteRegisterContext::WriteRegister (const RegisterInfo *reg_info, + const RegisterValue &value) { - const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); - if (reg_info) - { - DataExtractor data; - if (value.GetData (data, reg_info->byte_size)) - return WriteRegisterBytes (reg, data, 0); - } + DataExtractor data; + if (value.GetData (data)) + return WriteRegisterBytes (reg_info, value, data, 0); return false; } bool -GDBRemoteRegisterContext::WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset) +GDBRemoteRegisterContext::WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, const RegisterValue &value, DataExtractor &data, uint32_t data_offset) { GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); // FIXME: This check isn't right because IsRunning checks the Public state, but this @@ -297,34 +245,21 @@ GDBRemoteRegisterContext::WriteRegisterBytes (uint32_t reg, DataExtractor &data, // if (gdb_comm.IsRunning()) // return false; - const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); - - if (reg_info) - { - // Grab a pointer to where we are going to put this register - uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); - - if (dst == NULL) - return false; - - // Grab a pointer to where we are going to grab the new value from - const uint8_t *src = data.PeekData(0, reg_info->byte_size); + const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; - if (src == NULL) - return false; - - if (data.GetByteOrder() == m_reg_data.GetByteOrder()) - { - // No swapping, just copy the bytes - ::memcpy (dst, src, reg_info->byte_size); - } - else - { - // Swap the bytes - for (uint32_t i=0; i<reg_info->byte_size; ++i) - dst[i] = src[reg_info->byte_size - 1 - i]; - } + // Grab a pointer to where we are going to put this register + uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); + if (dst == NULL) + return false; + + + if (data.CopyByteOrderedData (data_offset, // src offset + reg_info->byte_size, // src length + dst, // dst + reg_info->byte_size, // dst length + m_reg_data.GetByteOrder())) // dst byte order + { Mutex::Locker locker; if (gdb_comm.GetSequenceMutex (locker)) { diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h index 3848ffcd50d..315284780a4 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h @@ -208,21 +208,15 @@ public: GetRegisterSet (uint32_t reg_set); virtual bool - ReadRegisterValue (uint32_t reg, lldb_private::Scalar &value); + ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value); virtual bool - ReadRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data); - + WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value); + virtual bool ReadAllRegisterValues (lldb::DataBufferSP &data_sp); virtual bool - WriteRegisterValue (uint32_t reg, const lldb_private::Scalar &value); - - virtual bool - WriteRegisterBytes (uint32_t reg, lldb_private::DataExtractor &data, uint32_t data_offset); - - virtual bool WriteAllRegisterValues (const lldb::DataBufferSP &data_sp); virtual uint32_t @@ -232,6 +226,17 @@ protected: friend class ThreadGDBRemote; bool + ReadRegisterBytes (const lldb_private::RegisterInfo *reg_info, + lldb_private::RegisterValue &value, + lldb_private::DataExtractor &data); + + bool + WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, + const lldb_private::RegisterValue &value, + lldb_private::DataExtractor &data, + uint32_t data_offset); + + bool PrivateSetRegisterValue (uint32_t reg, StringExtractor &response); void |