1 //===-- RegisterContextHistory.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 "RegisterContextHistory.h" 33 34 using namespace lldb; 35 using namespace lldb_private; 36 37 RegisterContextHistory::RegisterContextHistory(Thread &thread, 38 uint32_t concrete_frame_idx, 39 uint32_t address_byte_size, 40 addr_t pc_value) 41 : RegisterContext(thread, concrete_frame_idx), m_pc_value(pc_value) { 42 m_reg_set0.name = "General Purpose Registers"; 43 m_reg_set0.short_name = "GPR"; 44 m_reg_set0.num_registers = 1; 45 m_reg_set0.registers = new uint32_t(0); 46 47 m_pc_reg_info.name = "pc"; 48 m_pc_reg_info.alt_name = "pc"; 49 m_pc_reg_info.byte_offset = 0; 50 m_pc_reg_info.byte_size = address_byte_size; 51 m_pc_reg_info.encoding = eEncodingUint; 52 m_pc_reg_info.format = eFormatPointer; 53 m_pc_reg_info.invalidate_regs = nullptr; 54 m_pc_reg_info.value_regs = nullptr; 55 m_pc_reg_info.kinds[eRegisterKindEHFrame] = LLDB_INVALID_REGNUM; 56 m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM; 57 m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 58 m_pc_reg_info.kinds[eRegisterKindProcessPlugin] = LLDB_INVALID_REGNUM; 59 m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM; 60 } 61 62 RegisterContextHistory::~RegisterContextHistory() { 63 delete m_reg_set0.registers; 64 delete m_pc_reg_info.invalidate_regs; 65 delete m_pc_reg_info.value_regs; 66 } 67 68 void RegisterContextHistory::InvalidateAllRegisters() {} 69 70 size_t RegisterContextHistory::GetRegisterCount() { return 1; } 71 72 const lldb_private::RegisterInfo * 73 RegisterContextHistory::GetRegisterInfoAtIndex(size_t reg) { 74 if (reg) 75 return nullptr; 76 return &m_pc_reg_info; 77 } 78 79 size_t RegisterContextHistory::GetRegisterSetCount() { return 1; } 80 81 const lldb_private::RegisterSet * 82 RegisterContextHistory::GetRegisterSet(size_t reg_set) { 83 if (reg_set) 84 return nullptr; 85 return &m_reg_set0; 86 } 87 88 bool RegisterContextHistory::ReadRegister( 89 const lldb_private::RegisterInfo *reg_info, 90 lldb_private::RegisterValue &value) { 91 if (!reg_info) 92 return false; 93 uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric]; 94 if (reg_number == LLDB_REGNUM_GENERIC_PC) { 95 value.SetUInt(m_pc_value, reg_info->byte_size); 96 return true; 97 } 98 return false; 99 } 100 101 bool RegisterContextHistory::WriteRegister( 102 const lldb_private::RegisterInfo *reg_info, 103 const lldb_private::RegisterValue &value) { 104 return false; 105 } 106 107 bool RegisterContextHistory::ReadAllRegisterValues( 108 lldb::DataBufferSP &data_sp) { 109 return false; 110 } 111 112 bool RegisterContextHistory::WriteAllRegisterValues( 113 const lldb::DataBufferSP &data_sp) { 114 return false; 115 } 116 117 uint32_t RegisterContextHistory::ConvertRegisterKindToRegisterNumber( 118 lldb::RegisterKind kind, uint32_t num) { 119 if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC) 120 return 0; 121 return LLDB_INVALID_REGNUM; 122 } 123