LLDB  mainline
MemoryRegionInfo.h
Go to the documentation of this file.
1 //===-- MemoryRegionInfo.h ---------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef LLDB_TARGET_MEMORYREGIONINFO_H
11 #define LLDB_TARGET_MEMORYREGIONINFO_H
12 
13 #include <vector>
14 
16 #include "lldb/Utility/RangeMap.h"
17 #include "llvm/ADT/Optional.h"
18 #include "llvm/Support/FormatProviders.h"
19 
20 namespace lldb_private {
22 public:
24 
25  enum OptionalBool { eDontKnow = -1, eNo = 0, eYes = 1 };
26 
27  MemoryRegionInfo() = default;
29  OptionalBool execute, OptionalBool shared,
30  OptionalBool mapped, ConstString name,
31  OptionalBool flash, lldb::offset_t blocksize,
32  OptionalBool memory_tagged, OptionalBool stack_memory)
33  : m_range(range), m_read(read), m_write(write), m_execute(execute),
34  m_shared(shared), m_mapped(mapped), m_name(name), m_flash(flash),
35  m_blocksize(blocksize), m_memory_tagged(memory_tagged),
36  m_is_stack_memory(stack_memory) {}
37 
38  RangeType &GetRange() { return m_range; }
39 
40  void Clear() { *this = MemoryRegionInfo(); }
41 
42  const RangeType &GetRange() const { return m_range; }
43 
44  OptionalBool GetReadable() const { return m_read; }
45 
46  OptionalBool GetWritable() const { return m_write; }
47 
48  OptionalBool GetExecutable() const { return m_execute; }
49 
50  OptionalBool GetShared() const { return m_shared; }
51 
52  OptionalBool GetMapped() const { return m_mapped; }
53 
54  ConstString GetName() const { return m_name; }
55 
57 
58  void SetReadable(OptionalBool val) { m_read = val; }
59 
60  void SetWritable(OptionalBool val) { m_write = val; }
61 
62  void SetExecutable(OptionalBool val) { m_execute = val; }
63 
64  void SetShared(OptionalBool val) { m_shared = val; }
65 
66  void SetMapped(OptionalBool val) { m_mapped = val; }
67 
68  void SetName(const char *name) { m_name = ConstString(name); }
69 
70  OptionalBool GetFlash() const { return m_flash; }
71 
72  void SetFlash(OptionalBool val) { m_flash = val; }
73 
75 
76  void SetBlocksize(lldb::offset_t blocksize) { m_blocksize = blocksize; }
77 
79 
80  // Get permissions as a uint32_t that is a mask of one or more bits from the
81  // lldb::Permissions
83  uint32_t permissions = 0;
84  if (m_read)
85  permissions |= lldb::ePermissionsReadable;
86  if (m_write)
87  permissions |= lldb::ePermissionsWritable;
88  if (m_execute)
89  permissions |= lldb::ePermissionsExecutable;
90  return permissions;
91  }
92 
93  // Set permissions from a uint32_t that contains one or more bits from the
94  // lldb::Permissions
95  void SetLLDBPermissions(uint32_t permissions) {
96  m_read = (permissions & lldb::ePermissionsReadable) ? eYes : eNo;
97  m_write = (permissions & lldb::ePermissionsWritable) ? eYes : eNo;
98  m_execute = (permissions & lldb::ePermissionsExecutable) ? eYes : eNo;
99  }
100 
101  bool operator==(const MemoryRegionInfo &rhs) const {
102  return m_range == rhs.m_range && m_read == rhs.m_read &&
103  m_write == rhs.m_write && m_execute == rhs.m_execute &&
104  m_shared == rhs.m_shared &&
105  m_mapped == rhs.m_mapped && m_name == rhs.m_name &&
106  m_flash == rhs.m_flash && m_blocksize == rhs.m_blocksize &&
108  m_pagesize == rhs.m_pagesize &&
110  }
111 
112  bool operator!=(const MemoryRegionInfo &rhs) const { return !(*this == rhs); }
113 
114  /// Get the target system's VM page size in bytes.
115  /// \return
116  /// 0 is returned if this information is unavailable.
117  int GetPageSize() const { return m_pagesize; }
118 
119  /// Get a vector of target VM pages that are dirty -- that have been
120  /// modified -- within this memory region. This is an Optional return
121  /// value; it will only be available if the remote stub was able to
122  /// detail this.
123  const llvm::Optional<std::vector<lldb::addr_t>> &GetDirtyPageList() const {
124  return m_dirty_pages;
125  }
126 
128 
130 
131  void SetPageSize(int pagesize) { m_pagesize = pagesize; }
132 
133  void SetDirtyPageList(std::vector<lldb::addr_t> pagelist) {
134  if (m_dirty_pages)
135  m_dirty_pages.value().clear();
136  m_dirty_pages = std::move(pagelist);
137  }
138 
139 protected:
151  int m_pagesize = 0;
152  llvm::Optional<std::vector<lldb::addr_t>> m_dirty_pages;
153 };
154 
155 inline bool operator<(const MemoryRegionInfo &lhs,
156  const MemoryRegionInfo &rhs) {
157  return lhs.GetRange() < rhs.GetRange();
158 }
159 
160 inline bool operator<(const MemoryRegionInfo &lhs, lldb::addr_t rhs) {
161  return lhs.GetRange().GetRangeBase() < rhs;
162 }
163 
164 inline bool operator<(lldb::addr_t lhs, const MemoryRegionInfo &rhs) {
165  return lhs < rhs.GetRange().GetRangeBase();
166 }
167 
168 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
169  const MemoryRegionInfo &Info);
170 
171 // Forward-declarable wrapper.
172 class MemoryRegionInfos : public std::vector<lldb_private::MemoryRegionInfo> {
173 public:
174  using std::vector<lldb_private::MemoryRegionInfo>::vector;
175 };
176 
177 }
178 
179 namespace llvm {
180 template <>
181 /// If Options is empty, prints a textual representation of the value. If
182 /// Options is a single character, it uses that character for the "yes" value,
183 /// while "no" is printed as "-", and "don't know" as "?". This can be used to
184 /// print the permissions in the traditional "rwx" form.
185 struct format_provider<lldb_private::MemoryRegionInfo::OptionalBool> {
186  static void format(const lldb_private::MemoryRegionInfo::OptionalBool &B,
187  raw_ostream &OS, StringRef Options);
188 };
189 }
190 
191 #endif // LLDB_TARGET_MEMORYREGIONINFO_H
lldb_private::MemoryRegionInfo::m_range
RangeType m_range
Definition: MemoryRegionInfo.h:140
lldb_private::Range::GetRangeBase
BaseType GetRangeBase() const
Definition: RangeMap.h:46
llvm
Definition: Debugger.h:50
lldb_private::MemoryRegionInfo::m_dirty_pages
llvm::Optional< std::vector< lldb::addr_t > > m_dirty_pages
Definition: MemoryRegionInfo.h:152
lldb_private::MemoryRegionInfo::m_name
ConstString m_name
Definition: MemoryRegionInfo.h:146
lldb_private::MemoryRegionInfo::SetBlocksize
void SetBlocksize(lldb::offset_t blocksize)
Definition: MemoryRegionInfo.h:76
lldb_private::MemoryRegionInfo::SetName
void SetName(const char *name)
Definition: MemoryRegionInfo.h:68
lldb_private::MemoryRegionInfo::m_blocksize
lldb::offset_t m_blocksize
Definition: MemoryRegionInfo.h:148
lldb_private::MemoryRegionInfo::Clear
void Clear()
Definition: MemoryRegionInfo.h:40
lldb_private::MemoryRegionInfo::GetLLDBPermissions
uint32_t GetLLDBPermissions() const
Definition: MemoryRegionInfo.h:82
lldb_private::MemoryRegionInfo::m_memory_tagged
OptionalBool m_memory_tagged
Definition: MemoryRegionInfo.h:149
lldb_private::MemoryRegionInfo::SetMemoryTagged
void SetMemoryTagged(OptionalBool val)
Definition: MemoryRegionInfo.h:78
lldb::offset_t
uint64_t offset_t
Definition: lldb-types.h:87
lldb_private::MemoryRegionInfo
Definition: MemoryRegionInfo.h:21
lldb::addr_t
uint64_t addr_t
Definition: lldb-types.h:83
lldb_private::MemoryRegionInfo::SetReadable
void SetReadable(OptionalBool val)
Definition: MemoryRegionInfo.h:58
RangeMap.h
lldb_private::MemoryRegionInfo::m_mapped
OptionalBool m_mapped
Definition: MemoryRegionInfo.h:145
lldb_private::MemoryRegionInfo::GetMemoryTagged
OptionalBool GetMemoryTagged() const
Definition: MemoryRegionInfo.h:56
lldb_private::MemoryRegionInfo::operator!=
bool operator!=(const MemoryRegionInfo &rhs) const
Definition: MemoryRegionInfo.h:112
lldb_private::MemoryRegionInfo::operator==
bool operator==(const MemoryRegionInfo &rhs) const
Definition: MemoryRegionInfo.h:101
lldb_private::MemoryRegionInfo::GetShared
OptionalBool GetShared() const
Definition: MemoryRegionInfo.h:50
lldb_private::MemoryRegionInfo::m_read
OptionalBool m_read
Definition: MemoryRegionInfo.h:141
lldb_private::MemoryRegionInfo::GetWritable
OptionalBool GetWritable() const
Definition: MemoryRegionInfo.h:46
lldb_private::MemoryRegionInfo::m_is_stack_memory
OptionalBool m_is_stack_memory
Definition: MemoryRegionInfo.h:150
lldb_private::MemoryRegionInfo::OptionalBool
OptionalBool
Definition: MemoryRegionInfo.h:25
lldb_private::MemoryRegionInfo::m_flash
OptionalBool m_flash
Definition: MemoryRegionInfo.h:147
lldb_private::MemoryRegionInfo::RangeType
Range< lldb::addr_t, lldb::addr_t > RangeType
Definition: MemoryRegionInfo.h:23
lldb_private::MemoryRegionInfo::GetExecutable
OptionalBool GetExecutable() const
Definition: MemoryRegionInfo.h:48
lldb_private::MemoryRegionInfo::SetDirtyPageList
void SetDirtyPageList(std::vector< lldb::addr_t > pagelist)
Definition: MemoryRegionInfo.h:133
lldb_private::MemoryRegionInfo::SetExecutable
void SetExecutable(OptionalBool val)
Definition: MemoryRegionInfo.h:62
lldb_private::MemoryRegionInfo::m_pagesize
int m_pagesize
Definition: MemoryRegionInfo.h:151
lldb_private::MemoryRegionInfo::eYes
@ eYes
Definition: MemoryRegionInfo.h:25
lldb_private::MemoryRegionInfos
Definition: MemoryRegionInfo.h:172
lldb_private::MemoryRegionInfo::m_execute
OptionalBool m_execute
Definition: MemoryRegionInfo.h:143
lldb_private::ConstString
Definition: ConstString.h:39
lldb_private::Range< lldb::addr_t, lldb::addr_t >
lldb_private::MemoryRegionInfo::GetName
ConstString GetName() const
Definition: MemoryRegionInfo.h:54
lldb_private::MemoryRegionInfo::SetPageSize
void SetPageSize(int pagesize)
Definition: MemoryRegionInfo.h:131
lldb_private::MemoryRegionInfo::eNo
@ eNo
Definition: MemoryRegionInfo.h:25
lldb_private::MemoryRegionInfo::SetFlash
void SetFlash(OptionalBool val)
Definition: MemoryRegionInfo.h:72
lldb_private::MemoryRegionInfo::SetLLDBPermissions
void SetLLDBPermissions(uint32_t permissions)
Definition: MemoryRegionInfo.h:95
lldb_private::MemoryRegionInfo::SetWritable
void SetWritable(OptionalBool val)
Definition: MemoryRegionInfo.h:60
lldb_private::MemoryRegionInfo::GetFlash
OptionalBool GetFlash() const
Definition: MemoryRegionInfo.h:70
lldb_private::MemoryRegionInfo::GetBlocksize
lldb::offset_t GetBlocksize() const
Definition: MemoryRegionInfo.h:74
lldb_private::MemoryRegionInfo::MemoryRegionInfo
MemoryRegionInfo(RangeType range, OptionalBool read, OptionalBool write, OptionalBool execute, OptionalBool shared, OptionalBool mapped, ConstString name, OptionalBool flash, lldb::offset_t blocksize, OptionalBool memory_tagged, OptionalBool stack_memory)
Definition: MemoryRegionInfo.h:28
uint32_t
lldb_private::operator<<
Stream & operator<<(Stream &s, const SourceLocationSpec &loc)
Dump a SourceLocationSpec object to a stream.
Definition: SourceLocationSpec.cpp:40
lldb_private::MemoryRegionInfo::m_shared
OptionalBool m_shared
Definition: MemoryRegionInfo.h:144
lldb_private::MemoryRegionInfo::eDontKnow
@ eDontKnow
Definition: MemoryRegionInfo.h:25
lldb_private::MemoryRegionInfo::SetMapped
void SetMapped(OptionalBool val)
Definition: MemoryRegionInfo.h:66
lldb_private::MemoryRegionInfo::GetRange
const RangeType & GetRange() const
Definition: MemoryRegionInfo.h:42
lldb_private::operator<
bool operator<(const Address &lhs, const Address &rhs)
Definition: Address.cpp:985
lldb_private::MemoryRegionInfo::GetRange
RangeType & GetRange()
Definition: MemoryRegionInfo.h:38
lldb_private::MemoryRegionInfo::IsStackMemory
OptionalBool IsStackMemory() const
Definition: MemoryRegionInfo.h:127
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
lldb_private::MemoryRegionInfo::MemoryRegionInfo
MemoryRegionInfo()=default
ConstString.h
lldb_private::MemoryRegionInfo::m_write
OptionalBool m_write
Definition: MemoryRegionInfo.h:142
lldb_private::MemoryRegionInfo::GetDirtyPageList
const llvm::Optional< std::vector< lldb::addr_t > > & GetDirtyPageList() const
Get a vector of target VM pages that are dirty – that have been modified – within this memory region.
Definition: MemoryRegionInfo.h:123
lldb_private::MemoryRegionInfo::GetMapped
OptionalBool GetMapped() const
Definition: MemoryRegionInfo.h:52
lldb_private::MemoryRegionInfo::SetIsStackMemory
void SetIsStackMemory(OptionalBool val)
Definition: MemoryRegionInfo.h:129
lldb_private::MemoryRegionInfo::SetShared
void SetShared(OptionalBool val)
Definition: MemoryRegionInfo.h:64
lldb_private::MemoryRegionInfo::GetReadable
OptionalBool GetReadable() const
Definition: MemoryRegionInfo.h:44
lldb_private::MemoryRegionInfo::GetPageSize
int GetPageSize() const
Get the target system's VM page size in bytes.
Definition: MemoryRegionInfo.h:117