1//===-- RegisterContextMemory.h ---------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef lldb_RegisterContextMemory_h_
11#define lldb_RegisterContextMemory_h_
12
13// C Includes
14// C++ Includes
15#include <vector>
16
17// Other libraries and framework includes
18// Project includes
19#include "lldb/lldb-private.h"
20#include "lldb/Core/DataExtractor.h"
21#include "lldb/Target/RegisterContext.h"
22
23class DynamicRegisterInfo;
24
25class RegisterContextMemory : public lldb_private::RegisterContext
26{
27public:
28    //------------------------------------------------------------------
29    // Constructors and Destructors
30    //------------------------------------------------------------------
31    RegisterContextMemory (lldb_private::Thread &thread,
32                            uint32_t concrete_frame_idx,
33                            DynamicRegisterInfo &reg_info,
34                            lldb::addr_t reg_data_addr);
35
36    virtual
37    ~RegisterContextMemory ();
38
39    //------------------------------------------------------------------
40    // Subclasses must override these functions
41    //------------------------------------------------------------------
42    virtual void
43    InvalidateAllRegisters ();
44
45    virtual size_t
46    GetRegisterCount ();
47
48    virtual const lldb_private::RegisterInfo *
49    GetRegisterInfoAtIndex (size_t reg);
50
51    virtual size_t
52    GetRegisterSetCount ();
53
54    virtual const lldb_private::RegisterSet *
55    GetRegisterSet (size_t reg_set);
56
57    virtual uint32_t
58    ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num);
59
60
61    //------------------------------------------------------------------
62    // If all of the thread register are in a contiguous buffer in
63    // memory, then the default ReadRegister/WriteRegister and
64    // ReadAllRegisterValues/WriteAllRegisterValues will work. If thread
65    // registers are not contiguous, clients will want to subclass this
66    // class and modify the read/write functions as needed.
67    //------------------------------------------------------------------
68
69    virtual bool
70    ReadRegister (const lldb_private::RegisterInfo *reg_info,
71                  lldb_private::RegisterValue &reg_value);
72
73    virtual bool
74    WriteRegister (const lldb_private::RegisterInfo *reg_info,
75                   const lldb_private::RegisterValue &reg_value);
76
77    virtual bool
78    ReadAllRegisterValues (lldb::DataBufferSP &data_sp);
79
80    virtual bool
81    WriteAllRegisterValues (const lldb::DataBufferSP &data_sp);
82
83    void
84    SetAllRegisterData  (const lldb::DataBufferSP &data_sp);
85protected:
86
87    void
88    SetAllRegisterValid (bool b);
89
90    DynamicRegisterInfo &m_reg_infos;
91    std::vector<bool> m_reg_valid;
92    lldb_private::DataExtractor m_reg_data;
93    lldb::addr_t m_reg_data_addr; // If this is valid, then we have a register context that is stored in memmory
94
95private:
96    //------------------------------------------------------------------
97    // For RegisterContextMemory only
98    //------------------------------------------------------------------
99    DISALLOW_COPY_AND_ASSIGN (RegisterContextMemory);
100};
101
102#endif  // lldb_RegisterContextMemory_h_
103