GDBRemoteRegisterContext.cpp revision c71899ef308e6134d1b0ca5f30cbc64414855e1a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- GDBRemoteRegisterContext.cpp ----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "GDBRemoteRegisterContext.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/StringExtractorGDBRemote.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ProcessGDBRemote.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ThreadGDBRemote.h" 2354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_GCC_Registers.h" 2454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_DWARF_Registers.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GDBRemoteRegisterContext constructor 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GDBRemoteRegisterContext 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadGDBRemote &thread, 3508d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton uint32_t concrete_frame_idx, 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo ®_info, 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool read_all_at_once 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) : 3908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton RegisterContext (thread, concrete_frame_idx), 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_info (reg_info), 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid (), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data (), 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_read_all_at_once (read_all_at_once) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resize our vector of bools to contain one bool for every register. 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We will use these boolean values to know when a register value 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is valid in m_reg_data. 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid.resize (reg_info.GetNumRegisters()); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a heap based buffer that is big enough to store all registers 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP reg_data_sp(new DataBufferHeap (reg_info.GetRegisterDataByteSize(), 0)); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.SetData (reg_data_sp); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::~GDBRemoteRegisterContext() 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessGDBRemote & 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetGDBProcess() 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<ProcessGDBRemote &>(m_thread.GetProcess()); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadGDBRemote & 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetGDBThread() 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<ThreadGDBRemote &>(m_thread); 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 76a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::InvalidateAllRegisters () 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::SetAllRegisterValid (bool b) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<bool>::iterator pos, end = m_reg_valid.end(); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_reg_valid.begin(); pos != end; ++pos) 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *pos = b; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterCount () 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisters (); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb::RegisterInfo * 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterInfoAtIndex (uint32_t reg) 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterInfoAtIndex (reg); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSetCount () 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisterSets (); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst lldb::RegisterSet * 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSet (uint32_t reg_set) 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterSet (reg_set); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadRegisterValue (uint32_t reg, Scalar &value) 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the register 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ReadRegisterBytes (reg, m_reg_data)) 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t offset = reg_info->byte_offset; 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (reg_info->encoding) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingUint: 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (reg_info->byte_size) 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 1: 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 2: 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 4: 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetMaxU32 (&offset, reg_info->byte_size); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 8: 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetMaxU64 (&offset, reg_info->byte_size); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingSint: 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (reg_info->byte_size) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 1: 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 2: 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 4: 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = (int32_t)m_reg_data.GetMaxU32 (&offset, reg_info->byte_size); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 8: 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetMaxS64 (&offset, reg_info->byte_size); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eEncodingIEEE754: 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (reg_info->byte_size) 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case sizeof (float): 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetFloat (&offset); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case sizeof (double): 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetDouble (&offset); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case sizeof (long double): 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner value = m_reg_data.GetLongDouble (&offset); 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 17354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 17454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton default: 17554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton break; 17654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton } 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Claytonvoid 182a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response) 183a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{ 184a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 185a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton assert (reg_info); 186a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 187a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Invalidate if needed 188a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 189a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 190a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 191a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const size_t bytes_copied = response.GetHexBytes (const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_byte_size)), reg_byte_size, '\xcc'); 192a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton bool success = bytes_copied == reg_byte_size; 193a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (success) 194a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 195a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = true; 196a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 197a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else if (bytes_copied > 0) 198a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 199a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Only set register is valid to false if we copied some bytes, else 200a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // leave it as it was. 201a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = false; 202a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 203a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton} 204a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data) 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteCommunication &gdb_comm = GetGDBProcess().GetGDBRemote(); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 211a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 212a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (reg_info); 215a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 220c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 221c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported || GetGDBProcess().SetCurrentGDBRemoteThread(m_thread.GetID())) 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[64]; 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 225c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 229c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 230c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4x;", m_thread.GetID()); 231c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 232c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (packet_len < (sizeof(packet) - 1)); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet, response, 1, false)) 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.IsNormalPacket()) 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.GetHexBytes ((void *)m_reg_data.GetDataStart(), m_reg_data.GetByteSize(), '\xcc') == m_reg_data.GetByteSize()) 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (true); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get each register individually 244c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 245c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4x;", reg, m_thread.GetID()); 246c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 247c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (packet_len < (sizeof(packet) - 1)); 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet, response, 1, false)) 250a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton PrivateSetRegisterValue (reg, response); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 254a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 255a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Make sure we got a valid register value after reading it 256a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 257a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 260a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (&data != &m_reg_data) 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 262a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // If we aren't extracting into our own buffer (which 263a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // only happens when this function is called from 264a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // ReadRegisterValue(uint32_t, Scalar&)) then 265a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // we transfer bytes from our buffer into the data 266a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // buffer that was passed in 267a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetByteOrder (m_reg_data.GetByteOrder()); 268a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return true; 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteRegisterValue (uint32_t reg, const Scalar &value) 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataExtractor data; 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (value.GetData (data, reg_info->byte_size)) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return WriteRegisterBytes (reg, data, 0); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteRegisterBytes (uint32_t reg, DataExtractor &data, uint32_t data_offset) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteCommunication &gdb_comm = GetGDBProcess().GetGDBRemote(); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: This check isn't right because IsRunning checks the Public state, but this 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// is work you need to do - for instance in ShouldStop & friends - before the public 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// state has been changed. 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (gdb_comm.IsRunning()) 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (reg_info) 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Grab a pointer to where we are going to put this register 30354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst == NULL) 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Grab a pointer to where we are going to grab the new value from 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *src = data.PeekData(0, reg_info->byte_size); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src == NULL) 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (data.GetByteOrder() == m_reg_data.GetByteOrder()) 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No swapping, just copy the bytes 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::memcpy (dst, src, reg_info->byte_size); 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Swap the bytes 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<reg_info->byte_size; ++i) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst[i] = src[reg_info->byte_size - 1 - i]; 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 329c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 330c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported || GetGDBProcess().SetCurrentGDBRemoteThread(m_thread.GetID())) 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t offset, end_offset; 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString packet; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutChar ('G'); 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset = 0; 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner end_offset = m_reg_data.GetByteSize(); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(), 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.GetByteSize(), 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eByteOrderHost, 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eByteOrderHost); 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 347c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 348c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet.Printf (";thread:%4.4x;", m_thread.GetID()); 349c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate all register values 351a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded (true); 352a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.IsOKPacket()) 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get each register individually 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.Printf ("P%x=", reg); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size), 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_info->byte_size, 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eByteOrderHost, 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eByteOrderHost); 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 375c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 376c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet.Printf (";thread:%4.4x;", m_thread.GetID()); 377c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate just this register 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid[reg] = false; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.IsOKPacket()) 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp) 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteCommunication &gdb_comm = GetGDBProcess().GetGDBRemote(); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 4044912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton 4054912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 4064912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 408c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[32]; 409c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 410c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported || GetGDBProcess().SetCurrentGDBRemoteThread(m_thread.GetID())) 4114912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 412c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 413c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 414c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4x", m_thread.GetID()); 415c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 416c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 417c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton assert (packet_len < (sizeof(packet) - 1)); 418c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 419c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, 1, false)) 4204912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 4214912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (response.IsErrorPacket()) 4224912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return false; 423c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 4244912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton response.GetStringRef().insert(0, 1, 'G'); 425c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 426c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton { 427c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char thread_id_cstr[64]; 428c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4x;", m_thread.GetID()); 429c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton response.GetStringRef().append (thread_id_cstr); 430c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton } 431c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton data_sp.reset (new DataBufferHeap (response.GetStringRef().c_str(), 432c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton response.GetStringRef().size())); 4334912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 4344912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 4354912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 443f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) 444f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteCommunication &gdb_comm = GetGDBProcess().GetGDBRemote(); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 4484912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 4494912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 451c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 452c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported || GetGDBProcess().SetCurrentGDBRemoteThread(m_thread.GetID())) 4534912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 4544912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse((const char *)data_sp->GetBytes(), 4554912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton data_sp->GetByteSize(), 4564912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton response, 4574912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton 1, 4584912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton false)) 4594912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 4604912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (response.IsOKPacket()) 4614912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 4624912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 4634912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num); 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteDynamicRegisterInfo::HardcodeARMRegisters() 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb::RegisterInfo 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_register_infos[] = 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4813a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda // NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB NATIVE 4823a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda // ====== ======= == ==== ============= ============ =============== =============== ========= ===== =========== 4833a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r0", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r0, dwarf_r0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 0 }}, 4843a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r1", NULL, 4, 4, eEncodingUint, eFormatHex, { gcc_r1, dwarf_r1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 1 }}, 4853a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r2", NULL, 4, 8, eEncodingUint, eFormatHex, { gcc_r2, dwarf_r2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 2 }}, 4863a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r3", NULL, 4, 12, eEncodingUint, eFormatHex, { gcc_r3, dwarf_r3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 3 }}, 4873a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r4", NULL, 4, 16, eEncodingUint, eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 4 }}, 4883a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r5", NULL, 4, 20, eEncodingUint, eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 5 }}, 4893a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r6", NULL, 4, 24, eEncodingUint, eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 6 }}, 4903a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r7", NULL, 4, 28, eEncodingUint, eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM, 7 }}, 4913a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r8", NULL, 4, 32, eEncodingUint, eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 8 }}, 4923a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r9", NULL, 4, 36, eEncodingUint, eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 9 }}, 4933a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r10", NULL, 4, 40, eEncodingUint, eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 10 }}, 4943a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r11", NULL, 4, 44, eEncodingUint, eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 11 }}, 4953a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "r12", NULL, 4, 48, eEncodingUint, eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 12 }}, 4963a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "sp", "r13", 4, 52, eEncodingUint, eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM, 13 }}, 4973a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "lr", "r14", 4, 56, eEncodingUint, eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM, 14 }}, 4983a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "pc", "r15", 4, 60, eEncodingUint, eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM, 15 }}, 4993a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 64, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 16 }}, 5003a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 76, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 17 }}, 5013a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 88, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 18 }}, 5023a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 100, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 19 }}, 5033a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 112, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 20 }}, 5043a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 124, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 21 }}, 5053a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 136, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 22 }}, 5063a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 148, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 23 }}, 5073a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { NULL, NULL, 12, 160, eEncodingIEEE754, eFormatFloat, { LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 24 }}, 5083a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "cpsr", "psr", 4, 172, eEncodingUint, eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 25 }}, 5093a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s0", NULL, 4, 176, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 26 }}, 5103a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s1", NULL, 4, 180, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 27 }}, 5113a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s2", NULL, 4, 184, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 28 }}, 5123a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s3", NULL, 4, 188, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 29 }}, 5133a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s4", NULL, 4, 192, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 30 }}, 5143a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s5", NULL, 4, 196, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 31 }}, 5153a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s6", NULL, 4, 200, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 32 }}, 5163a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s7", NULL, 4, 204, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 33 }}, 5173a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s8", NULL, 4, 208, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 34 }}, 5183a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s9", NULL, 4, 212, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 35 }}, 5193a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s10", NULL, 4, 216, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 36 }}, 5203a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s11", NULL, 4, 220, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 37 }}, 5213a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s12", NULL, 4, 224, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 38 }}, 5223a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s13", NULL, 4, 228, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 39 }}, 5233a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s14", NULL, 4, 232, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 40 }}, 5243a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s15", NULL, 4, 236, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 41 }}, 5253a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s16", NULL, 4, 240, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 42 }}, 5263a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s17", NULL, 4, 244, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 43 }}, 5273a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s18", NULL, 4, 248, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 44 }}, 5283a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s19", NULL, 4, 252, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 45 }}, 5293a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s20", NULL, 4, 256, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 46 }}, 5303a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s21", NULL, 4, 260, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 47 }}, 5313a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s22", NULL, 4, 264, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 48 }}, 5323a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s23", NULL, 4, 268, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 49 }}, 5333a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s24", NULL, 4, 272, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 50 }}, 5343a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s25", NULL, 4, 276, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 51 }}, 5353a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s26", NULL, 4, 280, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 52 }}, 5363a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s27", NULL, 4, 284, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 53 }}, 5373a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s28", NULL, 4, 288, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 54 }}, 5383a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s29", NULL, 4, 292, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 55 }}, 5393a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s30", NULL, 4, 296, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 56 }}, 5403a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "s31", NULL, 4, 300, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 57 }}, 5413a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "fpscr", NULL, 4, 304, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 58 }}, 5423a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d16", NULL, 8, 308, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 59 }}, 5433a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d17", NULL, 8, 316, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 60 }}, 5443a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d18", NULL, 8, 324, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 61 }}, 5453a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d19", NULL, 8, 332, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 62 }}, 5463a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d20", NULL, 8, 340, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 63 }}, 5473a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d21", NULL, 8, 348, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 64 }}, 5483a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d22", NULL, 8, 356, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 65 }}, 5493a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d23", NULL, 8, 364, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 66 }}, 5503a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d24", NULL, 8, 372, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 67 }}, 5513a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d25", NULL, 8, 380, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 68 }}, 5523a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d26", NULL, 8, 388, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 69 }}, 5533a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d27", NULL, 8, 396, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 70 }}, 5543a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d28", NULL, 8, 404, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 71 }}, 5553a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d29", NULL, 8, 412, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 72 }}, 5563a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d30", NULL, 8, 420, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 73 }}, 5573a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda { "d31", NULL, 8, 428, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 74 }}, 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const uint32_t num_registers = sizeof (g_register_infos)/sizeof (lldb::RegisterInfo); 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString gpr_reg_set ("General Purpose Registers"); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString vfp_reg_set ("Floating Point Registers"); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<num_registers; ++i) 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name; 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString alt_name; 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].name && g_register_infos[i].name[0]) 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.SetCString(g_register_infos[i].name); 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0]) 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner alt_name.SetCString(g_register_infos[i].alt_name); 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner AddRegister (g_register_infos[i], name, alt_name, i < 26 ? gpr_reg_set : vfp_reg_set); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 575