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 "lldb/Utility/ConstString.h" |
14 | #include "lldb/Utility/RangeMap.h" |
15 | #include "llvm/Support/FormatProviders.h" |
16 | |
17 | namespace lldb_private { |
18 | class MemoryRegionInfo { |
19 | public: |
20 | typedef Range<lldb::addr_t, lldb::addr_t> RangeType; |
21 | |
22 | enum OptionalBool { eDontKnow = -1, eNo = 0, eYes = 1 }; |
23 | |
24 | MemoryRegionInfo() = default; |
25 | MemoryRegionInfo(RangeType range, OptionalBool read, OptionalBool write, |
26 | OptionalBool execute, OptionalBool mapped, ConstString name, |
27 | OptionalBool flash, lldb::offset_t blocksize, |
28 | OptionalBool memory_tagged) |
29 | : m_range(range), m_read(read), m_write(write), m_execute(execute), |
30 | m_mapped(mapped), m_name(name), m_flash(flash), m_blocksize(blocksize), |
31 | m_memory_tagged(memory_tagged) {} |
32 | |
33 | RangeType &GetRange() { return m_range; } |
34 | |
35 | void Clear() { |
36 | m_range.Clear(); |
37 | m_read = m_write = m_execute = m_memory_tagged = eDontKnow; |
38 | } |
39 | |
40 | const RangeType &GetRange() const { return m_range; } |
41 | |
42 | OptionalBool GetReadable() const { return m_read; } |
43 | |
44 | OptionalBool GetWritable() const { return m_write; } |
45 | |
46 | OptionalBool GetExecutable() const { return m_execute; } |
47 | |
48 | OptionalBool GetMapped() const { return m_mapped; } |
49 | |
50 | ConstString GetName() const { return m_name; } |
51 | |
52 | OptionalBool GetMemoryTagged() const { return m_memory_tagged; } |
53 | |
54 | void SetReadable(OptionalBool val) { m_read = val; } |
55 | |
56 | void SetWritable(OptionalBool val) { m_write = val; } |
57 | |
58 | void SetExecutable(OptionalBool val) { m_execute = val; } |
59 | |
60 | void SetMapped(OptionalBool val) { m_mapped = val; } |
61 | |
62 | void SetName(const char *name) { m_name = ConstString(name); } |
63 | |
64 | OptionalBool GetFlash() const { return m_flash; } |
65 | |
66 | void SetFlash(OptionalBool val) { m_flash = val; } |
67 | |
68 | lldb::offset_t GetBlocksize() const { return m_blocksize; } |
69 | |
70 | void SetBlocksize(lldb::offset_t blocksize) { m_blocksize = blocksize; } |
71 | |
72 | void SetMemoryTagged(OptionalBool val) { m_memory_tagged = val; } |
73 | |
74 | // Get permissions as a uint32_t that is a mask of one or more bits from the |
75 | // lldb::Permissions |
76 | uint32_t GetLLDBPermissions() const { |
77 | uint32_t permissions = 0; |
78 | if (m_read) |
79 | permissions |= lldb::ePermissionsReadable; |
80 | if (m_write) |
81 | permissions |= lldb::ePermissionsWritable; |
82 | if (m_execute) |
83 | permissions |= lldb::ePermissionsExecutable; |
84 | return permissions; |
85 | } |
86 | |
87 | // Set permissions from a uint32_t that contains one or more bits from the |
88 | // lldb::Permissions |
89 | void SetLLDBPermissions(uint32_t permissions) { |
90 | m_read = (permissions & lldb::ePermissionsReadable) ? eYes : eNo; |
91 | m_write = (permissions & lldb::ePermissionsWritable) ? eYes : eNo; |
92 | m_execute = (permissions & lldb::ePermissionsExecutable) ? eYes : eNo; |
93 | } |
94 | |
95 | bool operator==(const MemoryRegionInfo &rhs) const { |
96 | return m_range == rhs.m_range && m_read == rhs.m_read && |
97 | m_write == rhs.m_write && m_execute == rhs.m_execute && |
98 | m_mapped == rhs.m_mapped && m_name == rhs.m_name && |
99 | m_flash == rhs.m_flash && m_blocksize == rhs.m_blocksize && |
100 | m_memory_tagged == rhs.m_memory_tagged; |
101 | } |
102 | |
103 | bool operator!=(const MemoryRegionInfo &rhs) const { return !(*this == rhs); } |
104 | |
105 | protected: |
106 | RangeType m_range; |
107 | OptionalBool m_read = eDontKnow; |
108 | OptionalBool m_write = eDontKnow; |
109 | OptionalBool m_execute = eDontKnow; |
110 | OptionalBool m_mapped = eDontKnow; |
111 | ConstString m_name; |
112 | OptionalBool m_flash = eDontKnow; |
113 | lldb::offset_t m_blocksize = 0; |
114 | OptionalBool m_memory_tagged = eDontKnow; |
115 | }; |
116 | |
117 | inline bool operator<(const MemoryRegionInfo &lhs, |
118 | const MemoryRegionInfo &rhs) { |
119 | return lhs.GetRange() < rhs.GetRange(); |
120 | } |
121 | |
122 | inline bool operator<(const MemoryRegionInfo &lhs, lldb::addr_t rhs) { |
123 | return lhs.GetRange().GetRangeBase() < rhs; |
124 | } |
125 | |
126 | inline bool operator<(lldb::addr_t lhs, const MemoryRegionInfo &rhs) { |
127 | return lhs < rhs.GetRange().GetRangeBase(); |
128 | } |
129 | |
130 | llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, |
131 | const MemoryRegionInfo &Info); |
132 | |
133 | // Forward-declarable wrapper. |
134 | class MemoryRegionInfos : public std::vector<lldb_private::MemoryRegionInfo> { |
135 | public: |
136 | using std::vector<lldb_private::MemoryRegionInfo>::vector; |
137 | }; |
138 | |
139 | } |
140 | |
141 | namespace llvm { |
142 | template <> |
143 | /// If Options is empty, prints a textual representation of the value. If |
144 | /// Options is a single character, it uses that character for the "yes" value, |
145 | /// while "no" is printed as "-", and "don't know" as "?". This can be used to |
146 | /// print the permissions in the traditional "rwx" form. |
147 | struct format_provider<lldb_private::MemoryRegionInfo::OptionalBool> { |
148 | static void format(const lldb_private::MemoryRegionInfo::OptionalBool &B, |
149 | raw_ostream &OS, StringRef Options); |
150 | }; |
151 | } |
152 | |
153 | #endif // LLDB_TARGET_MEMORYREGIONINFO_H |
154 | |