1 //===-- DynamicRegisterInfo.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_DynamicRegisterInfo_h_
11 #define lldb_DynamicRegisterInfo_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <map>
16 #include <vector>
17 
18 // Other libraries and framework includes
19 // Project includes
20 #include "lldb/Utility/ConstString.h"
21 #include "lldb/Utility/StructuredData.h"
22 #include "lldb/lldb-private.h"
23 
24 class DynamicRegisterInfo {
25 public:
26   DynamicRegisterInfo() = default;
27 
28   DynamicRegisterInfo(const lldb_private::StructuredData::Dictionary &dict,
29                       const lldb_private::ArchSpec &arch);
30 
31   virtual ~DynamicRegisterInfo() = default;
32 
33   DynamicRegisterInfo(DynamicRegisterInfo &) = delete;
34   void operator=(DynamicRegisterInfo &) = delete;
35 
36   DynamicRegisterInfo(DynamicRegisterInfo &&info);
37   DynamicRegisterInfo &operator=(DynamicRegisterInfo &&info);
38 
39   size_t SetRegisterInfo(const lldb_private::StructuredData::Dictionary &dict,
40                          const lldb_private::ArchSpec &arch);
41 
42   void AddRegister(lldb_private::RegisterInfo &reg_info,
43                    lldb_private::ConstString &reg_name,
44                    lldb_private::ConstString &reg_alt_name,
45                    lldb_private::ConstString &set_name);
46 
47   void Finalize(const lldb_private::ArchSpec &arch);
48 
49   size_t GetNumRegisters() const;
50 
51   size_t GetNumRegisterSets() const;
52 
53   size_t GetRegisterDataByteSize() const;
54 
55   const lldb_private::RegisterInfo *GetRegisterInfoAtIndex(uint32_t i) const;
56 
57   lldb_private::RegisterInfo *GetRegisterInfoAtIndex(uint32_t i);
58 
59   const lldb_private::RegisterSet *GetRegisterSet(uint32_t i) const;
60 
61   uint32_t GetRegisterSetIndexByName(lldb_private::ConstString &set_name,
62                                      bool can_create);
63 
64   uint32_t ConvertRegisterKindToRegisterNumber(uint32_t kind,
65                                                uint32_t num) const;
66 
67   void Dump() const;
68 
69   void Clear();
70 
71 protected:
72   //------------------------------------------------------------------
73   // Classes that inherit from DynamicRegisterInfo can see and modify these
74   //------------------------------------------------------------------
75   typedef std::vector<lldb_private::RegisterInfo> reg_collection;
76   typedef std::vector<lldb_private::RegisterSet> set_collection;
77   typedef std::vector<uint32_t> reg_num_collection;
78   typedef std::vector<reg_num_collection> set_reg_num_collection;
79   typedef std::vector<lldb_private::ConstString> name_collection;
80   typedef std::map<uint32_t, reg_num_collection> reg_to_regs_map;
81   typedef std::vector<uint8_t> dwarf_opcode;
82   typedef std::map<uint32_t, dwarf_opcode> dynamic_reg_size_map;
83 
84   const lldb_private::RegisterInfo *
85   GetRegisterInfo(const lldb_private::ConstString &reg_name) const;
86 
87   void MoveFrom(DynamicRegisterInfo &&info);
88 
89   reg_collection m_regs;
90   set_collection m_sets;
91   set_reg_num_collection m_set_reg_nums;
92   name_collection m_set_names;
93   reg_to_regs_map m_value_regs_map;
94   reg_to_regs_map m_invalidate_regs_map;
95   dynamic_reg_size_map m_dynamic_reg_size_map;
96   size_t m_reg_data_byte_size = 0u; // The number of bytes required to store
97                                     // all registers
98   bool m_finalized = false;
99 };
100 #endif // lldb_DynamicRegisterInfo_h_
101