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