1//===-- RegisterContextDummy.cpp ---------------------------------*- C++ 2//-*-===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#include "lldb/Core/Address.h" 11#include "lldb/Core/AddressRange.h" 12#include "lldb/Core/Module.h" 13#include "lldb/Core/Value.h" 14#include "lldb/Expression/DWARFExpression.h" 15#include "lldb/Symbol/FuncUnwinders.h" 16#include "lldb/Symbol/Function.h" 17#include "lldb/Symbol/ObjectFile.h" 18#include "lldb/Symbol/Symbol.h" 19#include "lldb/Symbol/SymbolContext.h" 20#include "lldb/Target/ABI.h" 21#include "lldb/Target/DynamicLoader.h" 22#include "lldb/Target/ExecutionContext.h" 23#include "lldb/Target/Process.h" 24#include "lldb/Target/StackFrame.h" 25#include "lldb/Target/Target.h" 26#include "lldb/Target/Thread.h" 27#include "lldb/Utility/DataBufferHeap.h" 28#include "lldb/Utility/Log.h" 29#include "lldb/Utility/RegisterValue.h" 30#include "lldb/lldb-private.h" 31 32#include "RegisterContextDummy.h" 33 34using namespace lldb; 35using namespace lldb_private; 36 37RegisterContextDummy::RegisterContextDummy(Thread &thread, 38 uint32_t concrete_frame_idx, 39 uint32_t address_byte_size) 40 : RegisterContext(thread, concrete_frame_idx) { 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 61RegisterContextDummy::~RegisterContextDummy() { 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 RegisterContextDummy::InvalidateAllRegisters() {} 68 69size_t RegisterContextDummy::GetRegisterCount() { return 1; } 70 71const lldb_private::RegisterInfo * 72RegisterContextDummy::GetRegisterInfoAtIndex(size_t reg) { 73 if (reg) 74 return nullptr; 75 return &m_pc_reg_info; 76} 77 78size_t RegisterContextDummy::GetRegisterSetCount() { return 1; } 79 80const lldb_private::RegisterSet * 81RegisterContextDummy::GetRegisterSet(size_t reg_set) { 82 if (reg_set) 83 return nullptr; 84 return &m_reg_set0; 85} 86 87bool RegisterContextDummy::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(LLDB_INVALID_ADDRESS, reg_info->byte_size); 95 return true; 96 } 97 return false; 98} 99 100bool RegisterContextDummy::WriteRegister( 101 const lldb_private::RegisterInfo *reg_info, 102 const lldb_private::RegisterValue &value) { 103 return false; 104} 105 106bool RegisterContextDummy::ReadAllRegisterValues(lldb::DataBufferSP &data_sp) { 107 return false; 108} 109 110bool RegisterContextDummy::WriteAllRegisterValues( 111 const lldb::DataBufferSP &data_sp) { 112 return false; 113} 114 115uint32_t RegisterContextDummy::ConvertRegisterKindToRegisterNumber( 116 lldb::RegisterKind kind, uint32_t num) { 117 if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC) 118 return 0; 119 return LLDB_INVALID_REGNUM; 120} 121