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