10b57cec5SDimitry Andric //===-- RegisterContextDummy.cpp ---------------------------------*- C++ 20b57cec5SDimitry Andric //-*-===// 30b57cec5SDimitry Andric // 40b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 50b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 60b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 70b57cec5SDimitry Andric // 80b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric 100b57cec5SDimitry Andric #include "lldb/Core/Address.h" 110b57cec5SDimitry Andric #include "lldb/Core/AddressRange.h" 120b57cec5SDimitry Andric #include "lldb/Core/Module.h" 130b57cec5SDimitry Andric #include "lldb/Core/Value.h" 140b57cec5SDimitry Andric #include "lldb/Expression/DWARFExpression.h" 150b57cec5SDimitry Andric #include "lldb/Symbol/FuncUnwinders.h" 160b57cec5SDimitry Andric #include "lldb/Symbol/Function.h" 170b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h" 180b57cec5SDimitry Andric #include "lldb/Symbol/Symbol.h" 190b57cec5SDimitry Andric #include "lldb/Symbol/SymbolContext.h" 200b57cec5SDimitry Andric #include "lldb/Target/ABI.h" 210b57cec5SDimitry Andric #include "lldb/Target/DynamicLoader.h" 220b57cec5SDimitry Andric #include "lldb/Target/ExecutionContext.h" 230b57cec5SDimitry Andric #include "lldb/Target/Process.h" 240b57cec5SDimitry Andric #include "lldb/Target/StackFrame.h" 250b57cec5SDimitry Andric #include "lldb/Target/Target.h" 260b57cec5SDimitry Andric #include "lldb/Target/Thread.h" 270b57cec5SDimitry Andric #include "lldb/Utility/DataBufferHeap.h" 280b57cec5SDimitry Andric #include "lldb/Utility/Log.h" 290b57cec5SDimitry Andric #include "lldb/Utility/RegisterValue.h" 300b57cec5SDimitry Andric #include "lldb/lldb-private.h" 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric #include "RegisterContextDummy.h" 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric using namespace lldb; 350b57cec5SDimitry Andric using namespace lldb_private; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric RegisterContextDummy::RegisterContextDummy(Thread &thread, 380b57cec5SDimitry Andric uint32_t concrete_frame_idx, 390b57cec5SDimitry Andric uint32_t address_byte_size) 400b57cec5SDimitry Andric : RegisterContext(thread, concrete_frame_idx) { 410b57cec5SDimitry Andric m_reg_set0.name = "General Purpose Registers"; 420b57cec5SDimitry Andric m_reg_set0.short_name = "GPR"; 430b57cec5SDimitry Andric m_reg_set0.num_registers = 1; 440b57cec5SDimitry Andric m_reg_set0.registers = new uint32_t(0); 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric m_pc_reg_info.name = "pc"; 470b57cec5SDimitry Andric m_pc_reg_info.alt_name = "pc"; 480b57cec5SDimitry Andric m_pc_reg_info.byte_offset = 0; 490b57cec5SDimitry Andric m_pc_reg_info.byte_size = address_byte_size; 500b57cec5SDimitry Andric m_pc_reg_info.encoding = eEncodingUint; 510b57cec5SDimitry Andric m_pc_reg_info.format = eFormatPointer; 520b57cec5SDimitry Andric m_pc_reg_info.invalidate_regs = nullptr; 530b57cec5SDimitry Andric m_pc_reg_info.value_regs = nullptr; 540b57cec5SDimitry Andric m_pc_reg_info.kinds[eRegisterKindEHFrame] = LLDB_INVALID_REGNUM; 550b57cec5SDimitry Andric m_pc_reg_info.kinds[eRegisterKindDWARF] = LLDB_INVALID_REGNUM; 560b57cec5SDimitry Andric m_pc_reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; 570b57cec5SDimitry Andric m_pc_reg_info.kinds[eRegisterKindProcessPlugin] = LLDB_INVALID_REGNUM; 580b57cec5SDimitry Andric m_pc_reg_info.kinds[eRegisterKindLLDB] = LLDB_INVALID_REGNUM; 590b57cec5SDimitry Andric } 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric RegisterContextDummy::~RegisterContextDummy() { 620b57cec5SDimitry Andric delete m_reg_set0.registers; 630b57cec5SDimitry Andric delete m_pc_reg_info.invalidate_regs; 640b57cec5SDimitry Andric delete m_pc_reg_info.value_regs; 650b57cec5SDimitry Andric } 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric void RegisterContextDummy::InvalidateAllRegisters() {} 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric size_t RegisterContextDummy::GetRegisterCount() { return 1; } 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric const lldb_private::RegisterInfo * 720b57cec5SDimitry Andric RegisterContextDummy::GetRegisterInfoAtIndex(size_t reg) { 730b57cec5SDimitry Andric if (reg) 740b57cec5SDimitry Andric return nullptr; 750b57cec5SDimitry Andric return &m_pc_reg_info; 760b57cec5SDimitry Andric } 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric size_t RegisterContextDummy::GetRegisterSetCount() { return 1; } 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric const lldb_private::RegisterSet * 810b57cec5SDimitry Andric RegisterContextDummy::GetRegisterSet(size_t reg_set) { 820b57cec5SDimitry Andric if (reg_set) 830b57cec5SDimitry Andric return nullptr; 840b57cec5SDimitry Andric return &m_reg_set0; 850b57cec5SDimitry Andric } 860b57cec5SDimitry Andric 870b57cec5SDimitry Andric bool RegisterContextDummy::ReadRegister( 880b57cec5SDimitry Andric const lldb_private::RegisterInfo *reg_info, 890b57cec5SDimitry Andric lldb_private::RegisterValue &value) { 900b57cec5SDimitry Andric if (!reg_info) 910b57cec5SDimitry Andric return false; 920b57cec5SDimitry Andric uint32_t reg_number = reg_info->kinds[eRegisterKindGeneric]; 930b57cec5SDimitry Andric if (reg_number == LLDB_REGNUM_GENERIC_PC) { 940b57cec5SDimitry Andric value.SetUInt(LLDB_INVALID_ADDRESS, reg_info->byte_size); 950b57cec5SDimitry Andric return true; 960b57cec5SDimitry Andric } 970b57cec5SDimitry Andric return false; 980b57cec5SDimitry Andric } 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric bool RegisterContextDummy::WriteRegister( 1010b57cec5SDimitry Andric const lldb_private::RegisterInfo *reg_info, 1020b57cec5SDimitry Andric const lldb_private::RegisterValue &value) { 1030b57cec5SDimitry Andric return false; 1040b57cec5SDimitry Andric } 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric bool RegisterContextDummy::ReadAllRegisterValues(lldb::DataBufferSP &data_sp) { 1070b57cec5SDimitry Andric return false; 1080b57cec5SDimitry Andric } 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric bool RegisterContextDummy::WriteAllRegisterValues( 1110b57cec5SDimitry Andric const lldb::DataBufferSP &data_sp) { 1120b57cec5SDimitry Andric return false; 1130b57cec5SDimitry Andric } 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric uint32_t RegisterContextDummy::ConvertRegisterKindToRegisterNumber( 1160b57cec5SDimitry Andric lldb::RegisterKind kind, uint32_t num) { 1170b57cec5SDimitry Andric if (kind == eRegisterKindGeneric && num == LLDB_REGNUM_GENERIC_PC) 1180b57cec5SDimitry Andric return 0; 1190b57cec5SDimitry Andric return LLDB_INVALID_REGNUM; 1200b57cec5SDimitry Andric } 121