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 34 using namespace lldb; 35 using namespace lldb_private; 36 37 RegisterContextDummy::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 61 RegisterContextDummy::~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 67 void RegisterContextDummy::InvalidateAllRegisters() {} 68 69 size_t RegisterContextDummy::GetRegisterCount() { return 1; } 70 71 const lldb_private::RegisterInfo * 72 RegisterContextDummy::GetRegisterInfoAtIndex(size_t reg) { 73 if (reg) 74 return nullptr; 75 return &m_pc_reg_info; 76 } 77 78 size_t RegisterContextDummy::GetRegisterSetCount() { return 1; } 79 80 const lldb_private::RegisterSet * 81 RegisterContextDummy::GetRegisterSet(size_t reg_set) { 82 if (reg_set) 83 return nullptr; 84 return &m_reg_set0; 85 } 86 87 bool 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 100 bool RegisterContextDummy::WriteRegister( 101 const lldb_private::RegisterInfo *reg_info, 102 const lldb_private::RegisterValue &value) { 103 return false; 104 } 105 106 bool RegisterContextDummy::ReadAllRegisterValues(lldb::DataBufferSP &data_sp) { 107 return false; 108 } 109 110 bool RegisterContextDummy::WriteAllRegisterValues( 111 const lldb::DataBufferSP &data_sp) { 112 return false; 113 } 114 115 uint32_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