blob: ad6da2bd755921b0b0fc7c3a42cbcc1fce12796b [file] [log] [blame]
//===-- LoadedModuleInfoList.h ----------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_CORE_LOADEDMODULEINFOLIST_H
#define LLDB_CORE_LOADEDMODULEINFOLIST_H
#include <cassert>
#include <string>
#include <vector>
#include "lldb/lldb-defines.h"
#include "lldb/lldb-private-forward.h"
#include "lldb/lldb-types.h"
namespace lldb_private {
class LoadedModuleInfoList {
public:
class LoadedModuleInfo {
public:
enum e_data_point {
e_has_name = 0,
e_has_base,
e_has_dynamic,
e_has_link_map,
e_num
};
LoadedModuleInfo() {
for (uint32_t i = 0; i < e_num; ++i)
m_has[i] = false;
};
void set_name(const std::string &name) {
m_name = name;
m_has[e_has_name] = true;
}
bool get_name(std::string &out) const {
out = m_name;
return m_has[e_has_name];
}
void set_base(const lldb::addr_t base) {
m_base = base;
m_has[e_has_base] = true;
}
bool get_base(lldb::addr_t &out) const {
out = m_base;
return m_has[e_has_base];
}
void set_base_is_offset(bool is_offset) { m_base_is_offset = is_offset; }
bool get_base_is_offset(bool &out) const {
out = m_base_is_offset;
return m_has[e_has_base];
}
void set_link_map(const lldb::addr_t addr) {
m_link_map = addr;
m_has[e_has_link_map] = true;
}
bool get_link_map(lldb::addr_t &out) const {
out = m_link_map;
return m_has[e_has_link_map];
}
void set_dynamic(const lldb::addr_t addr) {
m_dynamic = addr;
m_has[e_has_dynamic] = true;
}
bool get_dynamic(lldb::addr_t &out) const {
out = m_dynamic;
return m_has[e_has_dynamic];
}
bool has_info(e_data_point datum) const {
assert(datum < e_num);
return m_has[datum];
}
bool operator==(LoadedModuleInfo const &rhs) const {
for (size_t i = 0; i < e_num; ++i) {
if (m_has[i] != rhs.m_has[i])
return false;
}
return (m_base == rhs.m_base) && (m_link_map == rhs.m_link_map) &&
(m_dynamic == rhs.m_dynamic) && (m_name == rhs.m_name);
}
protected:
bool m_has[e_num];
std::string m_name;
lldb::addr_t m_link_map;
lldb::addr_t m_base;
bool m_base_is_offset;
lldb::addr_t m_dynamic;
};
LoadedModuleInfoList() : m_list() {}
void add(const LoadedModuleInfo &mod) { m_list.push_back(mod); }
void clear() { m_list.clear(); }
std::vector<LoadedModuleInfo> m_list;
lldb::addr_t m_link_map = LLDB_INVALID_ADDRESS;
};
} // namespace lldb_private
#endif // LLDB_CORE_LOADEDMODULEINFOLIST_H