180814287SRaphael Isemann //===-- RegisterContextHistory.cpp ----------------------------------------===//
202706c32SJason Molenda //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
602706c32SJason Molenda //
702706c32SJason Molenda //===----------------------------------------------------------------------===//
802706c32SJason Molenda
902706c32SJason Molenda #include "lldb/Core/Address.h"
1002706c32SJason Molenda #include "lldb/Core/AddressRange.h"
1102706c32SJason Molenda #include "lldb/Core/Module.h"
1202706c32SJason Molenda #include "lldb/Core/Value.h"
1302706c32SJason Molenda #include "lldb/Expression/DWARFExpression.h"
1402706c32SJason Molenda #include "lldb/Symbol/FuncUnwinders.h"
1502706c32SJason Molenda #include "lldb/Symbol/Function.h"
1602706c32SJason Molenda #include "lldb/Symbol/ObjectFile.h"
1702706c32SJason Molenda #include "lldb/Symbol/Symbol.h"
18b9c1b51eSKate Stone #include "lldb/Symbol/SymbolContext.h"
1902706c32SJason Molenda #include "lldb/Target/ABI.h"
20b9c1b51eSKate Stone #include "lldb/Target/DynamicLoader.h"
2102706c32SJason Molenda #include "lldb/Target/ExecutionContext.h"
2202706c32SJason Molenda #include "lldb/Target/Process.h"
2302706c32SJason Molenda #include "lldb/Target/StackFrame.h"
2402706c32SJason Molenda #include "lldb/Target/Target.h"
2502706c32SJason Molenda #include "lldb/Target/Thread.h"
26666cc0b2SZachary Turner #include "lldb/Utility/DataBufferHeap.h"
276f9e6901SZachary Turner #include "lldb/Utility/Log.h"
28d821c997SPavel Labath #include "lldb/Utility/RegisterValue.h"
29b9c1b51eSKate Stone #include "lldb/lldb-private.h"
3002706c32SJason Molenda
3102706c32SJason Molenda #include "RegisterContextHistory.h"
3202706c32SJason Molenda
3302706c32SJason Molenda using namespace lldb;
3402706c32SJason Molenda using namespace lldb_private;
3502706c32SJason Molenda
RegisterContextHistory(Thread & thread,uint32_t concrete_frame_idx,uint32_t address_byte_size,addr_t pc_value)36b9c1b51eSKate Stone RegisterContextHistory::RegisterContextHistory(Thread &thread,
37b9c1b51eSKate Stone uint32_t concrete_frame_idx,
38b9c1b51eSKate Stone uint32_t address_byte_size,
39b9c1b51eSKate Stone addr_t pc_value)
40b9c1b51eSKate Stone : RegisterContext(thread, concrete_frame_idx), m_pc_value(pc_value) {
4102706c32SJason Molenda m_reg_set0.name = "General Purpose Registers";
4202706c32SJason Molenda m_reg_set0.short_name = "GPR";
4302706c32SJason Molenda m_reg_set0.num_registers = 1;
4402706c32SJason Molenda m_reg_set0.registers = new uint32_t(0);
4502706c32SJason Molenda
4602706c32SJason Molenda m_pc_reg_info.name = "pc";
4702706c32SJason Molenda m_pc_reg_info.alt_name = "pc";
4802706c32SJason Molenda m_pc_reg_info.byte_offset = 0;
4902706c32SJason Molenda m_pc_reg_info.byte_size = address_byte_size;
5002706c32SJason Molenda m_pc_reg_info.encoding = eEncodingUint;
5102706c32SJason Molenda m_pc_reg_info.format = eFormatPointer;
52248a1305SKonrad Kleine m_pc_reg_info.invalidate_regs = nullptr;
53248a1305SKonrad Kleine m_pc_reg_info.value_regs = nullptr;
54a18f7071SJason Molenda m_pc_reg_info.kinds[eRegisterKindEHFrame] = LLDB_INVALID_REGNUM;
5502706c32SJason Molenda m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM;
5602706c32SJason Molenda m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;
5763bd0db0SJason Molenda m_pc_reg_info.kinds[eRegisterKindProcessPlugin] = LLDB_INVALID_REGNUM;
5802706c32SJason Molenda m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM;
5902706c32SJason Molenda }
6002706c32SJason Molenda
~RegisterContextHistory()61b9c1b51eSKate Stone RegisterContextHistory::~RegisterContextHistory() {
6202706c32SJason Molenda delete m_reg_set0.registers;
6302706c32SJason Molenda delete m_pc_reg_info.invalidate_regs;
6402706c32SJason Molenda delete m_pc_reg_info.value_regs;
6502706c32SJason Molenda }
6602706c32SJason Molenda
InvalidateAllRegisters()67b9c1b51eSKate Stone void RegisterContextHistory::InvalidateAllRegisters() {}
6802706c32SJason Molenda
GetRegisterCount()69b9c1b51eSKate Stone size_t RegisterContextHistory::GetRegisterCount() { return 1; }
7002706c32SJason Molenda
7102706c32SJason Molenda const lldb_private::RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)72b9c1b51eSKate Stone RegisterContextHistory::GetRegisterInfoAtIndex(size_t reg) {
7302706c32SJason Molenda if (reg)
74248a1305SKonrad Kleine return nullptr;
7502706c32SJason Molenda return &m_pc_reg_info;
7602706c32SJason Molenda }
7702706c32SJason Molenda
GetRegisterSetCount()78b9c1b51eSKate Stone size_t RegisterContextHistory::GetRegisterSetCount() { return 1; }
7902706c32SJason Molenda
8002706c32SJason Molenda const lldb_private::RegisterSet *
GetRegisterSet(size_t reg_set)81b9c1b51eSKate Stone RegisterContextHistory::GetRegisterSet(size_t reg_set) {
8202706c32SJason Molenda if (reg_set)
83248a1305SKonrad Kleine return nullptr;
8402706c32SJason Molenda return &m_reg_set0;
8502706c32SJason Molenda }
8602706c32SJason Molenda
ReadRegister(const lldb_private::RegisterInfo * reg_info,lldb_private::RegisterValue & value)87b9c1b51eSKate Stone bool RegisterContextHistory::ReadRegister(
88b9c1b51eSKate Stone const lldb_private::RegisterInfo *reg_info,
89b9c1b51eSKate Stone lldb_private::RegisterValue &value) {
9002706c32SJason Molenda if (!reg_info)
9102706c32SJason Molenda return false;
9202706c32SJason Molenda uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric];
93b9c1b51eSKate Stone if (reg_number == LLDB_REGNUM_GENERIC_PC) {
9402706c32SJason Molenda value.SetUInt(m_pc_value, reg_info->byte_size);
9502706c32SJason Molenda return true;
9602706c32SJason Molenda }
9702706c32SJason Molenda return false;
9802706c32SJason Molenda }
9902706c32SJason Molenda
WriteRegister(const lldb_private::RegisterInfo * reg_info,const lldb_private::RegisterValue & value)100b9c1b51eSKate Stone bool RegisterContextHistory::WriteRegister(
101b9c1b51eSKate Stone const lldb_private::RegisterInfo *reg_info,
102b9c1b51eSKate Stone const lldb_private::RegisterValue &value) {
10302706c32SJason Molenda return false;
10402706c32SJason Molenda }
10502706c32SJason Molenda
ReadAllRegisterValues(lldb::WritableDataBufferSP & data_sp)106b9c1b51eSKate Stone bool RegisterContextHistory::ReadAllRegisterValues(
107*fc54427eSJonas Devlieghere lldb::WritableDataBufferSP &data_sp) {
10802706c32SJason Molenda return false;
10902706c32SJason Molenda }
11002706c32SJason Molenda
WriteAllRegisterValues(const lldb::DataBufferSP & data_sp)111b9c1b51eSKate Stone bool RegisterContextHistory::WriteAllRegisterValues(
112b9c1b51eSKate Stone const lldb::DataBufferSP &data_sp) {
11302706c32SJason Molenda return false;
11402706c32SJason Molenda }
11502706c32SJason Molenda
ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,uint32_t num)116b9c1b51eSKate Stone uint32_t RegisterContextHistory::ConvertRegisterKindToRegisterNumber(
117b9c1b51eSKate Stone lldb::RegisterKind kind, uint32_t num) {
11802706c32SJason Molenda if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC)
11902706c32SJason Molenda return 0;
12002706c32SJason Molenda return LLDB_INVALID_REGNUM;
12102706c32SJason Molenda }
122