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