1 //===-- LoadedModuleInfoList.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 liblldb_LoadedModuleInfoList_h_
11 #define liblldb_LoadedModuleInfoList_h_
12 
13 
14 #include <cassert>
15 #include <string>
16 #include <vector>
17 
18 #include "lldb/lldb-defines.h"
19 #include "lldb/lldb-private-forward.h"
20 #include "lldb/lldb-types.h"
21 
22 namespace lldb_private {
23 class LoadedModuleInfoList {
24 public:
25   class LoadedModuleInfo {
26   public:
27     enum e_data_point {
28       e_has_name = 0,
29       e_has_base,
30       e_has_dynamic,
31       e_has_link_map,
32       e_num
33     };
34 
LoadedModuleInfo()35     LoadedModuleInfo() {
36       for (uint32_t i = 0; i < e_num; ++i)
37         m_has[i] = false;
38     };
39 
set_name(const std::string & name)40     void set_name(const std::string &name) {
41       m_name = name;
42       m_has[e_has_name] = true;
43     }
get_name(std::string & out)44     bool get_name(std::string &out) const {
45       out = m_name;
46       return m_has[e_has_name];
47     }
48 
set_base(const lldb::addr_t base)49     void set_base(const lldb::addr_t base) {
50       m_base = base;
51       m_has[e_has_base] = true;
52     }
get_base(lldb::addr_t & out)53     bool get_base(lldb::addr_t &out) const {
54       out = m_base;
55       return m_has[e_has_base];
56     }
57 
set_base_is_offset(bool is_offset)58     void set_base_is_offset(bool is_offset) { m_base_is_offset = is_offset; }
get_base_is_offset(bool & out)59     bool get_base_is_offset(bool &out) const {
60       out = m_base_is_offset;
61       return m_has[e_has_base];
62     }
63 
set_link_map(const lldb::addr_t addr)64     void set_link_map(const lldb::addr_t addr) {
65       m_link_map = addr;
66       m_has[e_has_link_map] = true;
67     }
get_link_map(lldb::addr_t & out)68     bool get_link_map(lldb::addr_t &out) const {
69       out = m_link_map;
70       return m_has[e_has_link_map];
71     }
72 
set_dynamic(const lldb::addr_t addr)73     void set_dynamic(const lldb::addr_t addr) {
74       m_dynamic = addr;
75       m_has[e_has_dynamic] = true;
76     }
get_dynamic(lldb::addr_t & out)77     bool get_dynamic(lldb::addr_t &out) const {
78       out = m_dynamic;
79       return m_has[e_has_dynamic];
80     }
81 
has_info(e_data_point datum)82     bool has_info(e_data_point datum) const {
83       assert(datum < e_num);
84       return m_has[datum];
85     }
86 
87     bool operator==(LoadedModuleInfo const &rhs) const {
88       if (e_num != rhs.e_num)
89         return false;
90 
91       for (size_t i = 0; i < e_num; ++i) {
92         if (m_has[i] != rhs.m_has[i])
93           return false;
94       }
95 
96       return (m_base == rhs.m_base) && (m_link_map == rhs.m_link_map) &&
97              (m_dynamic == rhs.m_dynamic) && (m_name == rhs.m_name);
98     }
99 
100   protected:
101     bool m_has[e_num];
102     std::string m_name;
103     lldb::addr_t m_link_map;
104     lldb::addr_t m_base;
105     bool m_base_is_offset;
106     lldb::addr_t m_dynamic;
107   };
108 
LoadedModuleInfoList()109   LoadedModuleInfoList() : m_list(), m_link_map(LLDB_INVALID_ADDRESS) {}
110 
add(const LoadedModuleInfo & mod)111   void add(const LoadedModuleInfo &mod) { m_list.push_back(mod); }
112 
clear()113   void clear() { m_list.clear(); }
114 
115   std::vector<LoadedModuleInfo> m_list;
116   lldb::addr_t m_link_map;
117 };
118 } // namespace lldb_private
119 
120 #endif // liblldb_LoadedModuleInfoList_h_
121