diff options
Diffstat (limited to 'source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp')
| -rw-r--r-- | source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp | 66 | 
1 files changed, 34 insertions, 32 deletions
diff --git a/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp b/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp index e58f47f4befe..a77e659a55fa 100644 --- a/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp +++ b/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp @@ -1,9 +1,8 @@  //===-- GDBRemoteRegisterContext.cpp ----------------------------*- C++ -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===// @@ -23,13 +22,13 @@  #include "Utility/ARM_ehframe_Registers.h"  #include "lldb/Utility/StringExtractorGDBRemote.h" +#include <memory> +  using namespace lldb;  using namespace lldb_private;  using namespace lldb_private::process_gdb_remote; -//----------------------------------------------------------------------  // GDBRemoteRegisterContext constructor -//----------------------------------------------------------------------  GDBRemoteRegisterContext::GDBRemoteRegisterContext(      ThreadGDBRemote &thread, uint32_t concrete_frame_idx,      GDBRemoteDynamicRegisterInfo ®_info, bool read_all_at_once) @@ -47,9 +46,7 @@ GDBRemoteRegisterContext::GDBRemoteRegisterContext(    m_reg_data.SetByteOrder(thread.GetProcess()->GetByteOrder());  } -//----------------------------------------------------------------------  // Destructor -//----------------------------------------------------------------------  GDBRemoteRegisterContext::~GDBRemoteRegisterContext() {}  void GDBRemoteRegisterContext::InvalidateAllRegisters() { @@ -101,7 +98,7 @@ bool GDBRemoteRegisterContext::ReadRegister(const RegisterInfo *reg_info,  bool GDBRemoteRegisterContext::PrivateSetRegisterValue(      uint32_t reg, llvm::ArrayRef<uint8_t> data) {    const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); -  if (reg_info == NULL) +  if (reg_info == nullptr)      return false;    // Invalidate if needed @@ -125,7 +122,7 @@ bool GDBRemoteRegisterContext::PrivateSetRegisterValue(  bool GDBRemoteRegisterContext::PrivateSetRegisterValue(uint32_t reg,                                                         uint64_t new_reg_val) {    const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg); -  if (reg_info == NULL) +  if (reg_info == nullptr)      return false;    // Early in process startup, we can get a thread that has an invalid byte @@ -151,7 +148,7 @@ bool GDBRemoteRegisterContext::PrivateSetRegisterValue(uint32_t reg,    uint8_t *dst = const_cast<uint8_t *>(        m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); -  if (dst == NULL) +  if (dst == nullptr)      return false;    if (data.CopyByteOrderedData(0,                          // src offset @@ -186,7 +183,7 @@ bool GDBRemoteRegisterContext::ReadRegisterBytes(const RegisterInfo *reg_info,    Process *process = exe_ctx.GetProcessPtr();    Thread *thread = exe_ctx.GetThreadPtr(); -  if (process == NULL || thread == NULL) +  if (process == nullptr || thread == nullptr)      return false;    GDBRemoteCommunicationClient &gdb_comm( @@ -206,6 +203,14 @@ bool GDBRemoteRegisterContext::ReadRegisterBytes(const RegisterInfo *reg_info,          if (buffer_sp->GetByteSize() >= m_reg_data.GetByteSize()) {            SetAllRegisterValid(true);            return true; +        } else { +          Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_THREAD | +                                                                GDBR_LOG_PACKETS)); +          if (log) +            log->Printf ("error: GDBRemoteRegisterContext::ReadRegisterBytes tried to read the " +                        "entire register context at once, expected at least %" PRId64 " bytes " +                        "but only got %" PRId64 " bytes.", m_reg_data.GetByteSize(), +                        buffer_sp->GetByteSize());          }        }        return false; @@ -223,7 +228,7 @@ bool GDBRemoteRegisterContext::ReadRegisterBytes(const RegisterInfo *reg_info,          // We have a valid primordial register as our constituent. Grab the          // corresponding register info.          const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg); -        if (prim_reg_info == NULL) +        if (prim_reg_info == nullptr)            success = false;          else {            // Read the containing register if it hasn't already been read @@ -248,10 +253,8 @@ bool GDBRemoteRegisterContext::ReadRegisterBytes(const RegisterInfo *reg_info,    }    if (&data != &m_reg_data) { -#if defined(LLDB_CONFIGURATION_DEBUG)      assert(m_reg_data.GetByteSize() >=             reg_info->byte_offset + reg_info->byte_size); -#endif      // If our register context and our register info disagree, which should      // never happen, don't read past the end of the buffer.      if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size) @@ -298,16 +301,14 @@ bool GDBRemoteRegisterContext::WriteRegisterBytes(const RegisterInfo *reg_info,    Process *process = exe_ctx.GetProcessPtr();    Thread *thread = exe_ctx.GetThreadPtr(); -  if (process == NULL || thread == NULL) +  if (process == nullptr || thread == nullptr)      return false;    GDBRemoteCommunicationClient &gdb_comm(        ((ProcessGDBRemote *)process)->GetGDBRemote()); -#if defined(LLDB_CONFIGURATION_DEBUG)    assert(m_reg_data.GetByteSize() >=           reg_info->byte_offset + reg_info->byte_size); -#endif    // If our register context and our register info disagree, which should never    // happen, don't overwrite past the end of the buffer. @@ -318,7 +319,7 @@ bool GDBRemoteRegisterContext::WriteRegisterBytes(const RegisterInfo *reg_info,    uint8_t *dst = const_cast<uint8_t *>(        m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); -  if (dst == NULL) +  if (dst == nullptr)      return false;    if (data.CopyByteOrderedData(data_offset,                // src offset @@ -360,7 +361,7 @@ bool GDBRemoteRegisterContext::WriteRegisterBytes(const RegisterInfo *reg_info,              // We have a valid primordial register as our constituent. Grab the              // corresponding register info.              const RegisterInfo *value_reg_info = GetRegisterInfoAtIndex(reg); -            if (value_reg_info == NULL) +            if (value_reg_info == nullptr)                success = false;              else                success = SetPrimordialRegister(value_reg_info, gdb_comm); @@ -408,7 +409,7 @@ bool GDBRemoteRegisterContext::ReadAllRegisterValues(    Process *process = exe_ctx.GetProcessPtr();    Thread *thread = exe_ctx.GetThreadPtr(); -  if (process == NULL || thread == NULL) +  if (process == nullptr || thread == nullptr)      return false;    GDBRemoteCommunicationClient &gdb_comm( @@ -433,7 +434,7 @@ bool GDBRemoteRegisterContext::WriteAllRegisterValues(      Process *process = exe_ctx.GetProcessPtr();      Thread *thread = exe_ctx.GetThreadPtr(); -    if (process == NULL || thread == NULL) +    if (process == nullptr || thread == nullptr)        return false;      GDBRemoteCommunicationClient &gdb_comm( @@ -451,7 +452,7 @@ bool GDBRemoteRegisterContext::ReadAllRegisterValues(    Process *process = exe_ctx.GetProcessPtr();    Thread *thread = exe_ctx.GetThreadPtr(); -  if (process == NULL || thread == NULL) +  if (process == nullptr || thread == nullptr)      return false;    GDBRemoteCommunicationClient &gdb_comm( @@ -473,7 +474,8 @@ bool GDBRemoteRegisterContext::ReadAllRegisterValues(      // individually and store them as binary data in a buffer.      const RegisterInfo *reg_info; -    for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != NULL; i++) { +    for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr; +         i++) {        if (reg_info                ->value_regs) // skip registers that are slices of real registers          continue; @@ -481,8 +483,8 @@ bool GDBRemoteRegisterContext::ReadAllRegisterValues(        // ReadRegisterBytes saves the contents of the register in to the        // m_reg_data buffer      } -    data_sp.reset(new DataBufferHeap(m_reg_data.GetDataStart(), -                                     m_reg_info.GetRegisterDataByteSize())); +    data_sp = std::make_shared<DataBufferHeap>( +        m_reg_data.GetDataStart(), m_reg_info.GetRegisterDataByteSize());      return true;    } else { @@ -507,14 +509,14 @@ bool GDBRemoteRegisterContext::ReadAllRegisterValues(  bool GDBRemoteRegisterContext::WriteAllRegisterValues(      const lldb::DataBufferSP &data_sp) { -  if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) +  if (!data_sp || data_sp->GetBytes() == nullptr || data_sp->GetByteSize() == 0)      return false;    ExecutionContext exe_ctx(CalculateThread());    Process *process = exe_ctx.GetProcessPtr();    Thread *thread = exe_ctx.GetThreadPtr(); -  if (process == NULL || thread == NULL) +  if (process == nullptr || thread == nullptr)      return false;    GDBRemoteCommunicationClient &gdb_comm( @@ -556,9 +558,9 @@ bool GDBRemoteRegisterContext::WriteAllRegisterValues(        uint64_t size_by_highest_offset = 0;        for (uint32_t reg_idx = 0; -           (reg_info = GetRegisterInfoAtIndex(reg_idx)) != NULL; ++reg_idx) { +           (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr; ++reg_idx) {          size_including_slice_registers += reg_info->byte_size; -        if (reg_info->value_regs == NULL) +        if (reg_info->value_regs == nullptr)            size_not_including_slice_registers += reg_info->byte_size;          if (reg_info->byte_offset >= size_by_highest_offset)            size_by_highest_offset = reg_info->byte_offset + reg_info->byte_size; @@ -590,7 +592,7 @@ bool GDBRemoteRegisterContext::WriteAllRegisterValues(        // keep track of the size of each reg & compute offset based on that.        uint32_t running_byte_offset = 0;        for (uint32_t reg_idx = 0; -           (reg_info = GetRegisterInfoAtIndex(reg_idx)) != NULL; +           (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr;             ++reg_idx, running_byte_offset += reg_info->byte_size) {          // Skip composite aka slice registers (e.g. eax is a slice of rax).          if (reg_info->value_regs) @@ -636,7 +638,7 @@ bool GDBRemoteRegisterContext::WriteAllRegisterValues(        }        uint32_t num_restored = 0;        const RegisterInfo *reg_info; -      for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != NULL; +      for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr;             i++) {          if (reg_info->value_regs) // skip registers that are slices of real                                    // registers  | 
