brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · f06af93 Raw
122 lines · cpp
1//===-- RegisterContextHistory.cpp ----------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Core/Address.h"10#include "lldb/Core/AddressRange.h"11#include "lldb/Core/Module.h"12#include "lldb/Core/Value.h"13#include "lldb/Expression/DWARFExpression.h"14#include "lldb/Symbol/FuncUnwinders.h"15#include "lldb/Symbol/Function.h"16#include "lldb/Symbol/ObjectFile.h"17#include "lldb/Symbol/Symbol.h"18#include "lldb/Symbol/SymbolContext.h"19#include "lldb/Target/ABI.h"20#include "lldb/Target/DynamicLoader.h"21#include "lldb/Target/ExecutionContext.h"22#include "lldb/Target/Process.h"23#include "lldb/Target/StackFrame.h"24#include "lldb/Target/Target.h"25#include "lldb/Target/Thread.h"26#include "lldb/Utility/DataBufferHeap.h"27#include "lldb/Utility/Log.h"28#include "lldb/Utility/RegisterValue.h"29#include "lldb/lldb-private.h"30 31#include "RegisterContextHistory.h"32 33using namespace lldb;34using namespace lldb_private;35 36RegisterContextHistory::RegisterContextHistory(Thread &thread,37                                               uint32_t concrete_frame_idx,38                                               uint32_t address_byte_size,39                                               addr_t pc_value)40    : RegisterContext(thread, concrete_frame_idx), m_pc_value(pc_value) {41  m_reg_set0.name = "General Purpose Registers";42  m_reg_set0.short_name = "GPR";43  m_reg_set0.num_registers = 1;44  m_reg_set0.registers = new uint32_t(0);45 46  m_pc_reg_info.name = "pc";47  m_pc_reg_info.alt_name = "pc";48  m_pc_reg_info.byte_offset = 0;49  m_pc_reg_info.byte_size = address_byte_size;50  m_pc_reg_info.encoding = eEncodingUint;51  m_pc_reg_info.format = eFormatPointer;52  m_pc_reg_info.invalidate_regs = nullptr;53  m_pc_reg_info.value_regs = nullptr;54  m_pc_reg_info.kinds[eRegisterKindEHFrame] = LLDB_INVALID_REGNUM;55  m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM;56  m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;57  m_pc_reg_info.kinds[eRegisterKindProcessPlugin] = LLDB_INVALID_REGNUM;58  m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM;59}60 61RegisterContextHistory::~RegisterContextHistory() {62  delete m_reg_set0.registers;63  delete m_pc_reg_info.invalidate_regs;64  delete m_pc_reg_info.value_regs;65}66 67void RegisterContextHistory::InvalidateAllRegisters() {}68 69size_t RegisterContextHistory::GetRegisterCount() { return 1; }70 71const lldb_private::RegisterInfo *72RegisterContextHistory::GetRegisterInfoAtIndex(size_t reg) {73  if (reg)74    return nullptr;75  return &m_pc_reg_info;76}77 78size_t RegisterContextHistory::GetRegisterSetCount() { return 1; }79 80const lldb_private::RegisterSet *81RegisterContextHistory::GetRegisterSet(size_t reg_set) {82  if (reg_set)83    return nullptr;84  return &m_reg_set0;85}86 87bool RegisterContextHistory::ReadRegister(88    const lldb_private::RegisterInfo *reg_info,89    lldb_private::RegisterValue &value) {90  if (!reg_info)91    return false;92  uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric];93  if (reg_number == LLDB_REGNUM_GENERIC_PC) {94    value.SetUInt(m_pc_value, reg_info->byte_size);95    return true;96  }97  return false;98}99 100bool RegisterContextHistory::WriteRegister(101    const lldb_private::RegisterInfo *reg_info,102    const lldb_private::RegisterValue &value) {103  return false;104}105 106bool RegisterContextHistory::ReadAllRegisterValues(107    lldb::WritableDataBufferSP &data_sp) {108  return false;109}110 111bool RegisterContextHistory::WriteAllRegisterValues(112    const lldb::DataBufferSP &data_sp) {113  return false;114}115 116uint32_t RegisterContextHistory::ConvertRegisterKindToRegisterNumber(117    lldb::RegisterKind kind, uint32_t num) {118  if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC)119    return 0;120  return LLDB_INVALID_REGNUM;121}122