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 LLDB_RECORD_CONSTRUCTOR(SBMemoryRegionInfo, 51 (const lldb::SBMemoryRegionInfo &), rhs); 52 m_opaque_up = clone(rhs.m_opaque_up); 53 } 54 55 const SBMemoryRegionInfo &SBMemoryRegionInfo:: 56 operator=(const SBMemoryRegionInfo &rhs) { 57 LLDB_RECORD_METHOD( 58 const lldb::SBMemoryRegionInfo &, 59 SBMemoryRegionInfo, operator=,(const lldb::SBMemoryRegionInfo &), rhs); 60 61 if (this != &rhs) 62 m_opaque_up = clone(rhs.m_opaque_up); 63 return LLDB_RECORD_RESULT(*this); 64 } 65 66 SBMemoryRegionInfo::~SBMemoryRegionInfo() = default; 67 68 void SBMemoryRegionInfo::Clear() { 69 LLDB_RECORD_METHOD_NO_ARGS(void, SBMemoryRegionInfo, Clear); 70 71 m_opaque_up->Clear(); 72 } 73 74 bool SBMemoryRegionInfo::operator==(const SBMemoryRegionInfo &rhs) const { 75 LLDB_RECORD_METHOD_CONST( 76 bool, SBMemoryRegionInfo, operator==,(const lldb::SBMemoryRegionInfo &), 77 rhs); 78 79 return ref() == rhs.ref(); 80 } 81 82 bool SBMemoryRegionInfo::operator!=(const SBMemoryRegionInfo &rhs) const { 83 LLDB_RECORD_METHOD_CONST( 84 bool, SBMemoryRegionInfo, operator!=,(const lldb::SBMemoryRegionInfo &), 85 rhs); 86 87 return ref() != rhs.ref(); 88 } 89 90 MemoryRegionInfo &SBMemoryRegionInfo::ref() { return *m_opaque_up; } 91 92 const MemoryRegionInfo &SBMemoryRegionInfo::ref() const { return *m_opaque_up; } 93 94 lldb::addr_t SBMemoryRegionInfo::GetRegionBase() { 95 LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBMemoryRegionInfo, GetRegionBase); 96 97 return m_opaque_up->GetRange().GetRangeBase(); 98 } 99 100 lldb::addr_t SBMemoryRegionInfo::GetRegionEnd() { 101 LLDB_RECORD_METHOD_NO_ARGS(lldb::addr_t, SBMemoryRegionInfo, GetRegionEnd); 102 103 return m_opaque_up->GetRange().GetRangeEnd(); 104 } 105 106 bool SBMemoryRegionInfo::IsReadable() { 107 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsReadable); 108 109 return m_opaque_up->GetReadable() == MemoryRegionInfo::eYes; 110 } 111 112 bool SBMemoryRegionInfo::IsWritable() { 113 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsWritable); 114 115 return m_opaque_up->GetWritable() == MemoryRegionInfo::eYes; 116 } 117 118 bool SBMemoryRegionInfo::IsExecutable() { 119 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsExecutable); 120 121 return m_opaque_up->GetExecutable() == MemoryRegionInfo::eYes; 122 } 123 124 bool SBMemoryRegionInfo::IsMapped() { 125 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, IsMapped); 126 127 return m_opaque_up->GetMapped() == MemoryRegionInfo::eYes; 128 } 129 130 const char *SBMemoryRegionInfo::GetName() { 131 LLDB_RECORD_METHOD_NO_ARGS(const char *, SBMemoryRegionInfo, GetName); 132 133 return m_opaque_up->GetName().AsCString(); 134 } 135 136 bool SBMemoryRegionInfo::HasDirtyMemoryPageList() { 137 LLDB_RECORD_METHOD_NO_ARGS(bool, SBMemoryRegionInfo, HasDirtyMemoryPageList); 138 139 return m_opaque_up->GetDirtyPageList().hasValue(); 140 } 141 142 uint32_t SBMemoryRegionInfo::GetNumDirtyPages() { 143 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBMemoryRegionInfo, GetNumDirtyPages); 144 145 uint32_t num_dirty_pages = 0; 146 llvm::Optional<std::vector<addr_t>> dirty_page_list = 147 m_opaque_up->GetDirtyPageList(); 148 if (dirty_page_list.hasValue()) 149 num_dirty_pages = dirty_page_list.getValue().size(); 150 151 return num_dirty_pages; 152 } 153 154 addr_t SBMemoryRegionInfo::GetDirtyPageAddressAtIndex(uint32_t idx) { 155 LLDB_RECORD_METHOD(lldb::addr_t, SBMemoryRegionInfo, 156 GetDirtyPageAddressAtIndex, (uint32_t), idx); 157 158 addr_t dirty_page_addr = LLDB_INVALID_ADDRESS; 159 const llvm::Optional<std::vector<addr_t>> &dirty_page_list = 160 m_opaque_up->GetDirtyPageList(); 161 if (dirty_page_list.hasValue() && idx < dirty_page_list.getValue().size()) 162 dirty_page_addr = dirty_page_list.getValue()[idx]; 163 164 return dirty_page_addr; 165 } 166 167 int SBMemoryRegionInfo::GetPageSize() { 168 LLDB_RECORD_METHOD_NO_ARGS(int, SBMemoryRegionInfo, GetPageSize); 169 170 return m_opaque_up->GetPageSize(); 171 } 172 173 bool SBMemoryRegionInfo::GetDescription(SBStream &description) { 174 LLDB_RECORD_METHOD(bool, SBMemoryRegionInfo, GetDescription, 175 (lldb::SBStream &), description); 176 177 Stream &strm = description.ref(); 178 const addr_t load_addr = m_opaque_up->GetRange().base; 179 180 strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 " ", load_addr, 181 load_addr + m_opaque_up->GetRange().size); 182 strm.Printf(m_opaque_up->GetReadable() ? "R" : "-"); 183 strm.Printf(m_opaque_up->GetWritable() ? "W" : "-"); 184 strm.Printf(m_opaque_up->GetExecutable() ? "X" : "-"); 185 strm.Printf("]"); 186 187 return true; 188 } 189 190 namespace lldb_private { 191 namespace repro { 192 193 template <> 194 void RegisterMethods<SBMemoryRegionInfo>(Registry &R) { 195 LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfo, ()); 196 LLDB_REGISTER_CONSTRUCTOR(SBMemoryRegionInfo, 197 (const lldb::SBMemoryRegionInfo &)); 198 LLDB_REGISTER_CONSTRUCTOR( 199 SBMemoryRegionInfo, 200 (const char *, lldb::addr_t, lldb::addr_t, uint32_t, bool, bool)); 201 LLDB_REGISTER_METHOD( 202 const lldb::SBMemoryRegionInfo &, 203 SBMemoryRegionInfo, operator=,(const lldb::SBMemoryRegionInfo &)); 204 LLDB_REGISTER_METHOD(void, SBMemoryRegionInfo, Clear, ()); 205 LLDB_REGISTER_METHOD_CONST( 206 bool, 207 SBMemoryRegionInfo, operator==,(const lldb::SBMemoryRegionInfo &)); 208 LLDB_REGISTER_METHOD_CONST( 209 bool, 210 SBMemoryRegionInfo, operator!=,(const lldb::SBMemoryRegionInfo &)); 211 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetRegionBase, ()); 212 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetRegionEnd, ()); 213 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsReadable, ()); 214 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsWritable, ()); 215 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsExecutable, ()); 216 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, IsMapped, ()); 217 LLDB_REGISTER_METHOD(const char *, SBMemoryRegionInfo, GetName, ()); 218 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, GetDescription, 219 (lldb::SBStream &)); 220 LLDB_REGISTER_METHOD(bool, SBMemoryRegionInfo, HasDirtyMemoryPageList, ()); 221 LLDB_REGISTER_METHOD(uint32_t, SBMemoryRegionInfo, GetNumDirtyPages, ()); 222 LLDB_REGISTER_METHOD(lldb::addr_t, SBMemoryRegionInfo, GetDirtyPageAddressAtIndex, (uint32_t)); 223 LLDB_REGISTER_METHOD(int, SBMemoryRegionInfo, GetPageSize, ()); 224 } 225 226 } 227 } 228