1dda28197Spatrick //===-- SBMemoryRegionInfo.cpp --------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/API/SBMemoryRegionInfo.h"
10061da546Spatrick #include "Utils.h"
11061da546Spatrick #include "lldb/API/SBDefines.h"
12061da546Spatrick #include "lldb/API/SBError.h"
13061da546Spatrick #include "lldb/API/SBStream.h"
14061da546Spatrick #include "lldb/Target/MemoryRegionInfo.h"
15*f6aab3d8Srobert #include "lldb/Utility/Instrumentation.h"
16061da546Spatrick #include "lldb/Utility/StreamString.h"
17*f6aab3d8Srobert #include <optional>
18061da546Spatrick
19061da546Spatrick using namespace lldb;
20061da546Spatrick using namespace lldb_private;
21061da546Spatrick
SBMemoryRegionInfo()22061da546Spatrick SBMemoryRegionInfo::SBMemoryRegionInfo() : m_opaque_up(new MemoryRegionInfo()) {
23*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
24*f6aab3d8Srobert }
25*f6aab3d8Srobert
SBMemoryRegionInfo(const char * name,lldb::addr_t begin,lldb::addr_t end,uint32_t permissions,bool mapped,bool stack_memory)26*f6aab3d8Srobert SBMemoryRegionInfo::SBMemoryRegionInfo(const char *name, lldb::addr_t begin,
27*f6aab3d8Srobert lldb::addr_t end, uint32_t permissions,
28*f6aab3d8Srobert bool mapped, bool stack_memory)
29*f6aab3d8Srobert : SBMemoryRegionInfo() {
30*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, name, begin, end, permissions, mapped, stack_memory);
31*f6aab3d8Srobert m_opaque_up->SetName(name);
32*f6aab3d8Srobert m_opaque_up->GetRange().SetRangeBase(begin);
33*f6aab3d8Srobert m_opaque_up->GetRange().SetRangeEnd(end);
34*f6aab3d8Srobert m_opaque_up->SetLLDBPermissions(permissions);
35*f6aab3d8Srobert m_opaque_up->SetMapped(mapped ? MemoryRegionInfo::eYes
36*f6aab3d8Srobert : MemoryRegionInfo::eNo);
37*f6aab3d8Srobert m_opaque_up->SetIsStackMemory(stack_memory ? MemoryRegionInfo::eYes
38*f6aab3d8Srobert : MemoryRegionInfo::eNo);
39061da546Spatrick }
40061da546Spatrick
SBMemoryRegionInfo(const MemoryRegionInfo * lldb_object_ptr)41061da546Spatrick SBMemoryRegionInfo::SBMemoryRegionInfo(const MemoryRegionInfo *lldb_object_ptr)
42061da546Spatrick : m_opaque_up(new MemoryRegionInfo()) {
43061da546Spatrick if (lldb_object_ptr)
44061da546Spatrick ref() = *lldb_object_ptr;
45061da546Spatrick }
46061da546Spatrick
SBMemoryRegionInfo(const SBMemoryRegionInfo & rhs)47*f6aab3d8Srobert SBMemoryRegionInfo::SBMemoryRegionInfo(const SBMemoryRegionInfo &rhs) {
48*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
49061da546Spatrick m_opaque_up = clone(rhs.m_opaque_up);
50061da546Spatrick }
51061da546Spatrick
52061da546Spatrick const SBMemoryRegionInfo &SBMemoryRegionInfo::
operator =(const SBMemoryRegionInfo & rhs)53061da546Spatrick operator=(const SBMemoryRegionInfo &rhs) {
54*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
55061da546Spatrick
56061da546Spatrick if (this != &rhs)
57061da546Spatrick m_opaque_up = clone(rhs.m_opaque_up);
58*f6aab3d8Srobert return *this;
59061da546Spatrick }
60061da546Spatrick
61dda28197Spatrick SBMemoryRegionInfo::~SBMemoryRegionInfo() = default;
62061da546Spatrick
Clear()63061da546Spatrick void SBMemoryRegionInfo::Clear() {
64*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
65061da546Spatrick
66061da546Spatrick m_opaque_up->Clear();
67061da546Spatrick }
68061da546Spatrick
operator ==(const SBMemoryRegionInfo & rhs) const69061da546Spatrick bool SBMemoryRegionInfo::operator==(const SBMemoryRegionInfo &rhs) const {
70*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
71061da546Spatrick
72061da546Spatrick return ref() == rhs.ref();
73061da546Spatrick }
74061da546Spatrick
operator !=(const SBMemoryRegionInfo & rhs) const75061da546Spatrick bool SBMemoryRegionInfo::operator!=(const SBMemoryRegionInfo &rhs) const {
76*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
77061da546Spatrick
78061da546Spatrick return ref() != rhs.ref();
79061da546Spatrick }
80061da546Spatrick
ref()81061da546Spatrick MemoryRegionInfo &SBMemoryRegionInfo::ref() { return *m_opaque_up; }
82061da546Spatrick
ref() const83061da546Spatrick const MemoryRegionInfo &SBMemoryRegionInfo::ref() const { return *m_opaque_up; }
84061da546Spatrick
GetRegionBase()85061da546Spatrick lldb::addr_t SBMemoryRegionInfo::GetRegionBase() {
86*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
87061da546Spatrick
88061da546Spatrick return m_opaque_up->GetRange().GetRangeBase();
89061da546Spatrick }
90061da546Spatrick
GetRegionEnd()91061da546Spatrick lldb::addr_t SBMemoryRegionInfo::GetRegionEnd() {
92*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
93061da546Spatrick
94061da546Spatrick return m_opaque_up->GetRange().GetRangeEnd();
95061da546Spatrick }
96061da546Spatrick
IsReadable()97061da546Spatrick bool SBMemoryRegionInfo::IsReadable() {
98*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
99061da546Spatrick
100061da546Spatrick return m_opaque_up->GetReadable() == MemoryRegionInfo::eYes;
101061da546Spatrick }
102061da546Spatrick
IsWritable()103061da546Spatrick bool SBMemoryRegionInfo::IsWritable() {
104*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
105061da546Spatrick
106061da546Spatrick return m_opaque_up->GetWritable() == MemoryRegionInfo::eYes;
107061da546Spatrick }
108061da546Spatrick
IsExecutable()109061da546Spatrick bool SBMemoryRegionInfo::IsExecutable() {
110*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
111061da546Spatrick
112061da546Spatrick return m_opaque_up->GetExecutable() == MemoryRegionInfo::eYes;
113061da546Spatrick }
114061da546Spatrick
IsMapped()115061da546Spatrick bool SBMemoryRegionInfo::IsMapped() {
116*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
117061da546Spatrick
118061da546Spatrick return m_opaque_up->GetMapped() == MemoryRegionInfo::eYes;
119061da546Spatrick }
120061da546Spatrick
GetName()121061da546Spatrick const char *SBMemoryRegionInfo::GetName() {
122*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
123061da546Spatrick
124061da546Spatrick return m_opaque_up->GetName().AsCString();
125061da546Spatrick }
126061da546Spatrick
HasDirtyMemoryPageList()127be691f3bSpatrick bool SBMemoryRegionInfo::HasDirtyMemoryPageList() {
128*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
129be691f3bSpatrick
130*f6aab3d8Srobert return m_opaque_up->GetDirtyPageList().has_value();
131be691f3bSpatrick }
132be691f3bSpatrick
GetNumDirtyPages()133be691f3bSpatrick uint32_t SBMemoryRegionInfo::GetNumDirtyPages() {
134*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
135be691f3bSpatrick
136be691f3bSpatrick uint32_t num_dirty_pages = 0;
137*f6aab3d8Srobert const std::optional<std::vector<addr_t>> &dirty_page_list =
138be691f3bSpatrick m_opaque_up->GetDirtyPageList();
139*f6aab3d8Srobert if (dirty_page_list)
140*f6aab3d8Srobert num_dirty_pages = dirty_page_list->size();
141be691f3bSpatrick
142be691f3bSpatrick return num_dirty_pages;
143be691f3bSpatrick }
144be691f3bSpatrick
GetDirtyPageAddressAtIndex(uint32_t idx)145be691f3bSpatrick addr_t SBMemoryRegionInfo::GetDirtyPageAddressAtIndex(uint32_t idx) {
146*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, idx);
147be691f3bSpatrick
148be691f3bSpatrick addr_t dirty_page_addr = LLDB_INVALID_ADDRESS;
149*f6aab3d8Srobert const std::optional<std::vector<addr_t>> &dirty_page_list =
150be691f3bSpatrick m_opaque_up->GetDirtyPageList();
151*f6aab3d8Srobert if (dirty_page_list && idx < dirty_page_list->size())
152*f6aab3d8Srobert dirty_page_addr = (*dirty_page_list)[idx];
153be691f3bSpatrick
154be691f3bSpatrick return dirty_page_addr;
155be691f3bSpatrick }
156be691f3bSpatrick
GetPageSize()157be691f3bSpatrick int SBMemoryRegionInfo::GetPageSize() {
158*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
159*f6aab3d8Srobert
160be691f3bSpatrick return m_opaque_up->GetPageSize();
161be691f3bSpatrick }
162be691f3bSpatrick
GetDescription(SBStream & description)163061da546Spatrick bool SBMemoryRegionInfo::GetDescription(SBStream &description) {
164*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, description);
165061da546Spatrick
166061da546Spatrick Stream &strm = description.ref();
167061da546Spatrick const addr_t load_addr = m_opaque_up->GetRange().base;
168061da546Spatrick
169061da546Spatrick strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 " ", load_addr,
170061da546Spatrick load_addr + m_opaque_up->GetRange().size);
171061da546Spatrick strm.Printf(m_opaque_up->GetReadable() ? "R" : "-");
172061da546Spatrick strm.Printf(m_opaque_up->GetWritable() ? "W" : "-");
173061da546Spatrick strm.Printf(m_opaque_up->GetExecutable() ? "X" : "-");
174061da546Spatrick strm.Printf("]");
175061da546Spatrick
176061da546Spatrick return true;
177061da546Spatrick }
178