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