1 //===-- RegisterContextMemory.cpp -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "RegisterContextMemory.h"
14 // Other libraries and framework includes
16 #include "DynamicRegisterInfo.h"
17 #include "lldb/Core/DataBufferHeap.h"
18 #include "lldb/Core/Error.h"
19 #include "lldb/Core/RegisterValue.h"
20 #include "lldb/Target/Process.h"
21 #include "lldb/Target/Thread.h"
24 using namespace lldb_private;
26 //----------------------------------------------------------------------
27 // RegisterContextMemory constructor
28 //----------------------------------------------------------------------
29 RegisterContextMemory::RegisterContextMemory
32 uint32_t concrete_frame_idx,
33 DynamicRegisterInfo ®_infos,
36 RegisterContext (thread, concrete_frame_idx),
37 m_reg_infos (reg_infos),
40 m_reg_data_addr (reg_data_addr)
42 // Resize our vector of bools to contain one bool for every register.
43 // We will use these boolean values to know when a register value
44 // is valid in m_reg_data.
45 const size_t num_regs = reg_infos.GetNumRegisters();
46 assert (num_regs > 0);
47 m_reg_valid.resize (num_regs);
49 // Make a heap based buffer that is big enough to store all registers
50 DataBufferSP reg_data_sp(new DataBufferHeap (reg_infos.GetRegisterDataByteSize(), 0));
51 m_reg_data.SetData (reg_data_sp);
54 //----------------------------------------------------------------------
56 //----------------------------------------------------------------------
57 RegisterContextMemory::~RegisterContextMemory()
62 RegisterContextMemory::InvalidateAllRegisters ()
64 if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
65 SetAllRegisterValid (false);
69 RegisterContextMemory::SetAllRegisterValid (bool b)
71 std::vector<bool>::iterator pos, end = m_reg_valid.end();
72 for (pos = m_reg_valid.begin(); pos != end; ++pos)
77 RegisterContextMemory::GetRegisterCount ()
79 return m_reg_infos.GetNumRegisters ();
83 RegisterContextMemory::GetRegisterInfoAtIndex (size_t reg)
85 return m_reg_infos.GetRegisterInfoAtIndex (reg);
89 RegisterContextMemory::GetRegisterSetCount ()
91 return m_reg_infos.GetNumRegisterSets ();
95 RegisterContextMemory::GetRegisterSet (size_t reg_set)
97 return m_reg_infos.GetRegisterSet (reg_set);
101 RegisterContextMemory::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
103 return m_reg_infos.ConvertRegisterKindToRegisterNumber (kind, num);
107 RegisterContextMemory::ReadRegister (const RegisterInfo *reg_info, RegisterValue ®_value)
109 const uint32_t reg_num = reg_info->kinds[eRegisterKindLLDB];
110 if (!m_reg_valid[reg_num])
112 if (!ReadAllRegisterValues(m_reg_data.GetSharedDataBuffer ()))
115 const bool partial_data_ok = false;
116 return reg_value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok).Success();
120 RegisterContextMemory::WriteRegister (const RegisterInfo *reg_info, const RegisterValue ®_value)
122 if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
124 const uint32_t reg_num = reg_info->kinds[eRegisterKindLLDB];
125 addr_t reg_addr = m_reg_data_addr + reg_info->byte_offset;
126 Error error (WriteRegisterValueToMemory(reg_info, reg_addr, reg_info->byte_size, reg_value));
127 m_reg_valid[reg_num] = false;
128 return error.Success();
134 RegisterContextMemory::ReadAllRegisterValues (DataBufferSP &data_sp)
136 if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
138 ProcessSP process_sp (CalculateProcess());
142 if (process_sp->ReadMemory(m_reg_data_addr, data_sp->GetBytes(), data_sp->GetByteSize(), error) == data_sp->GetByteSize())
144 SetAllRegisterValid (true);
153 RegisterContextMemory::WriteAllRegisterValues (const DataBufferSP &data_sp)
155 if (m_reg_data_addr != LLDB_INVALID_ADDRESS)
157 ProcessSP process_sp (CalculateProcess());
161 SetAllRegisterValid (false);
162 if (process_sp->WriteMemory(m_reg_data_addr, data_sp->GetBytes(), data_sp->GetByteSize(), error) == data_sp->GetByteSize())
170 RegisterContextMemory::SetAllRegisterData (const lldb::DataBufferSP &data_sp)
172 m_reg_data.SetData(data_sp);
173 SetAllRegisterValid (true);