1 //===-- SBMemoryRegionInfo.cpp --------------------------------------------===// 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 #include "lldb/API/SBMemoryRegionInfo.h" 10 #include "SBReproducerPrivate.h" 11 #include "Utils.h" 12 #include "lldb/API/SBDefines.h" 13 #include "lldb/API/SBError.h" 14 #include "lldb/API/SBStream.h" 15 #include "lldb/Target/MemoryRegionInfo.h" 16 #include "lldb/Utility/StreamString.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 SBMemoryRegionInfo::SBMemoryRegionInfo() : m_opaque_up(new MemoryRegionInfo()) { 22 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBMemoryRegionInfo); 23 } 24 25 SBMemoryRegionInfo::SBMemoryRegionInfo(const char *name, lldb::addr_t begin, 26 lldb::addr_t end, uint32_t permissions, 27 bool mapped, bool stack_memory) 28 : SBMemoryRegionInfo() { 29 LLDB_RECORD_CONSTRUCTOR( 30 SBMemoryRegionInfo, 31 (const char *, lldb::addr_t, lldb::addr_t, uint32_t, bool, bool), name, 32 begin, end, permissions, mapped, stack_memory); 33 m_opaque_up->SetName(name); 34 m_opaque_up->GetRange().SetRangeBase(begin); 35 m_opaque_up->GetRange().SetRangeEnd(end); 36 m_opaque_up->SetLLDBPermissions(permissions); 37 m_opaque_up->SetMapped(mapped ? MemoryRegionInfo::eYes 38 : MemoryRegionInfo::eNo); 39 m_opaque_up->SetIsStackMemory(stack_memory ? MemoryRegionInfo::eYes 40 : MemoryRegionInfo::eNo); 41 } 42 43 SBMemoryRegionInfo::SBMemoryRegionInfo(const MemoryRegionInfo *lldb_object_ptr) 44 : m_opaque_up(new MemoryRegionInfo()) { 45 if (lldb_object_ptr) 46 ref() = *lldb_object_ptr; 47 } 48 49 SBMemoryRegionInfo::SBMemoryRegionInfo(const SBMemoryRegionInfo &rhs) 50 : m_opaque_up() { 51 LLDB_RECORD_CONSTRUCTOR(SBMemoryRegionInfo, 52 (const lldb::SBMemoryRegionInfo &), rhs); 53 m_opaque_up = clone(rhs.m_opaque_up); 54 } 55 56 const SBMemoryRegionInfo &SBMemoryRegionInfo:: 57 operator=(const SBMemoryRegionInfo &rhs) { 58 LLDB_RECORD_METHOD( 59 const lldb::SBMemoryRegionInfo &, 60 SBMemoryRegionInfo, operator=,(const lldb::SBMemoryRegionInfo &), rhs); 61 62 if (this != &rhs) 63 m_opaque_up = clone(rhs.m_opaque_up); 64 return LLDB_RECORD_RESULT(*this); 65 } 66 67 SBMemoryRegionInfo::~SBMemoryRegionInfo() = default; 68 69 void SBMemoryRegionInfo::Clear() { 70 LLDB_RECORD_METHOD_NO_ARGS(void, SBMemoryRegionInfo, Clear); 71 72 m_opaque_up->Clear(); 73 } 74 75 bool SBMemoryRegionInfo::operator==(const SBMemoryRegionInfo &rhs) const { 76 LLDB_RECORD_METHOD_CONST( 77 bool, SBMemoryRegionInfo, operator==,(const lldb::SBMemoryRegionInfo &), 78 rhs); 79 80 return ref() == rhs.ref(); 81 } 82 83 bool SBMemoryRegionInfo::operator!=(const SBMemoryRegionInfo &rhs) const { 84 LLDB_RECORD_METHOD_CONST( 85 bool, SBMemoryRegionInfo, operator!=,(const lldb::SBMemoryRegionInfo &), 86 rhs); 87 88 return ref() != rhs.ref(); 89 } 90 91 MemoryRegionInfo &SBMemoryRegionInfo::ref() { return *m_opaque_up; } 92 93 const MemoryRegionInfo &SBMemoryRegionInfo::ref() const { return *m_opaque_up; } 94 95 lldb::addr_t SBMemoryRegionInfo::GetRegionBase() { 96 LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBMemoryRegionInfo, GetRegionBase); 97 98 return m_opaque_up->GetRange().GetRangeBase(); 99 } 100 101 lldb::addr_t SBMemoryRegionInfo::GetRegionEnd() { 102 LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBMemoryRegionInfo, GetRegionEnd); 103 104 return m_opaque_up->GetRange().GetRangeEnd(); 105 } 106 107 bool SBMemoryRegionInfo::IsReadable() { 108 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsReadable); 109 110 return m_opaque_up->GetReadable() == MemoryRegionInfo::eYes; 111 } 112 113 bool SBMemoryRegionInfo::IsWritable() { 114 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsWritable); 115 116 return m_opaque_up->GetWritable() == MemoryRegionInfo::eYes; 117 } 118 119 bool SBMemoryRegionInfo::IsExecutable() { 120 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsExecutable); 121 122 return m_opaque_up->GetExecutable() == MemoryRegionInfo::eYes; 123 } 124 125 bool SBMemoryRegionInfo::IsMapped() { 126 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsMapped); 127 128 return m_opaque_up->GetMapped() == MemoryRegionInfo::eYes; 129 } 130 131 const char *SBMemoryRegionInfo::GetName() { 132 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBMemoryRegionInfo, GetName); 133 134 return m_opaque_up->GetName().AsCString(); 135 } 136 137 bool SBMemoryRegionInfo::HasDirtyMemoryPageList() { 138 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, HasDirtyMemoryPageList); 139 140 return m_opaque_up->GetDirtyPageList().hasValue(); 141 } 142 143 uint32_t SBMemoryRegionInfo::GetNumDirtyPages() { 144 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBMemoryRegionInfo, GetNumDirtyPages); 145 146 uint32_t num_dirty_pages = 0; 147 llvm::Optional<std::vector<addr_t>> dirty_page_list = 148 m_opaque_up->GetDirtyPageList(); 149 if (dirty_page_list.hasValue()) 150 num_dirty_pages = dirty_page_list.getValue().size(); 151 152 return num_dirty_pages; 153 } 154 155 addr_t SBMemoryRegionInfo::GetDirtyPageAddressAtIndex(uint32_t idx) { 156 LLDB_RECORD_METHOD(lldb::addr_t, SBMemoryRegionInfo, 157 GetDirtyPageAddressAtIndex, (uint32_t), idx); 158 159 addr_t dirty_page_addr = LLDB_INVALID_ADDRESS; 160 const llvm::Optional<std::vector<addr_t>> &dirty_page_list = 161 m_opaque_up->GetDirtyPageList(); 162 if (dirty_page_list.hasValue() && idx < dirty_page_list.getValue().size()) 163 dirty_page_addr = dirty_page_list.getValue()[idx]; 164 165 return dirty_page_addr; 166 } 167 168 int SBMemoryRegionInfo::GetPageSize() { 169 LLDB_RECORD_METHOD_NO_ARGS(int, SBMemoryRegionInfo, GetPageSize); 170 171 return m_opaque_up->GetPageSize(); 172 } 173 174 bool SBMemoryRegionInfo::GetDescription(SBStream &description) { 175 LLDB_RECORD_METHOD(bool, SBMemoryRegionInfo, GetDescription, 176 (lldb::SBStream &), description); 177 178 Stream &strm = description.ref(); 179 const addr_t load_addr = m_opaque_up->GetRange().base; 180 181 strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 " ", load_addr, 182 load_addr + m_opaque_up->GetRange().size); 183 strm.Printf(m_opaque_up->GetReadable() ? "R" : "-"); 184 strm.Printf(m_opaque_up->GetWritable() ? "W" : "-"); 185 strm.Printf(m_opaque_up->GetExecutable() ? "X" : "-"); 186 strm.Printf("]"); 187 188 return true; 189 } 190 191 namespace lldb_private { 192 namespace repro { 193 194 template <> 195 void RegisterMethods<SBMemoryRegionInfo>(Registry &R) { 196 LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfo, ()); 197 LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfo, 198 (const lldb::SBMemoryRegionInfo &)); 199 LLDB_REGISTER_CONSTRUCTOR( 200 SBMemoryRegionInfo, 201 (const char *, lldb::addr_t, lldb::addr_t, uint32_t, bool, bool)); 202 LLDB_REGISTER_METHOD( 203 const lldb::SBMemoryRegionInfo &, 204 SBMemoryRegionInfo, operator=,(const lldb::SBMemoryRegionInfo &)); 205 LLDB_REGISTER_METHOD(void, SBMemoryRegionInfo, Clear, ()); 206 LLDB_REGISTER_METHOD_CONST( 207 bool, 208 SBMemoryRegionInfo, operator==,(const lldb::SBMemoryRegionInfo &)); 209 LLDB_REGISTER_METHOD_CONST( 210 bool, 211 SBMemoryRegionInfo, operator!=,(const lldb::SBMemoryRegionInfo &)); 212 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetRegionBase, ()); 213 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetRegionEnd, ()); 214 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsReadable, ()); 215 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsWritable, ()); 216 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsExecutable, ()); 217 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsMapped, ()); 218 LLDB_REGISTER_METHOD(const char *, SBMemoryRegionInfo, GetName, ()); 219 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, GetDescription, 220 (lldb::SBStream &)); 221 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, HasDirtyMemoryPageList, ()); 222 LLDB_REGISTER_METHOD(uint32_t, SBMemoryRegionInfo, GetNumDirtyPages, ()); 223 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetDirtyPageAddressAtIndex, (uint32_t)); 224 LLDB_REGISTER_METHOD(int, SBMemoryRegionInfo, GetPageSize, ()); 225 } 226 227 } 228 } 229