1 //===-- SBMemoryRegionInfo.cpp ----------------------------------*- C++ -*-===//
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 "Utils.h"
11 #include "lldb/API/SBDefines.h"
12 #include "lldb/API/SBError.h"
13 #include "lldb/API/SBStream.h"
14 #include "lldb/Target/MemoryRegionInfo.h"
15 #include "lldb/Utility/StreamString.h"
16 
17 using namespace lldb;
18 using namespace lldb_private;
19 
20 SBMemoryRegionInfo::SBMemoryRegionInfo()
21     : m_opaque_up(new MemoryRegionInfo()) {}
22 
23 SBMemoryRegionInfo::SBMemoryRegionInfo(const MemoryRegionInfo *lldb_object_ptr)
24     : m_opaque_up(new MemoryRegionInfo()) {
25   if (lldb_object_ptr)
26     ref() = *lldb_object_ptr;
27 }
28 
29 SBMemoryRegionInfo::SBMemoryRegionInfo(const SBMemoryRegionInfo &rhs)
30     : m_opaque_up() {
31   m_opaque_up = clone(rhs.m_opaque_up);
32 }
33 
34 const SBMemoryRegionInfo &SBMemoryRegionInfo::
35 operator=(const SBMemoryRegionInfo &rhs) {
36   if (this != &rhs)
37     m_opaque_up = clone(rhs.m_opaque_up);
38   return *this;
39 }
40 
41 SBMemoryRegionInfo::~SBMemoryRegionInfo() {}
42 
43 void SBMemoryRegionInfo::Clear() { m_opaque_up->Clear(); }
44 
45 bool SBMemoryRegionInfo::operator==(const SBMemoryRegionInfo &rhs) const {
46   return ref() == rhs.ref();
47 }
48 
49 bool SBMemoryRegionInfo::operator!=(const SBMemoryRegionInfo &rhs) const {
50   return ref() != rhs.ref();
51 }
52 
53 MemoryRegionInfo &SBMemoryRegionInfo::ref() { return *m_opaque_up; }
54 
55 const MemoryRegionInfo &SBMemoryRegionInfo::ref() const { return *m_opaque_up; }
56 
57 lldb::addr_t SBMemoryRegionInfo::GetRegionBase() {
58   return m_opaque_up->GetRange().GetRangeBase();
59 }
60 
61 lldb::addr_t SBMemoryRegionInfo::GetRegionEnd() {
62   return m_opaque_up->GetRange().GetRangeEnd();
63 }
64 
65 bool SBMemoryRegionInfo::IsReadable() {
66   return m_opaque_up->GetReadable() == MemoryRegionInfo::eYes;
67 }
68 
69 bool SBMemoryRegionInfo::IsWritable() {
70   return m_opaque_up->GetWritable() == MemoryRegionInfo::eYes;
71 }
72 
73 bool SBMemoryRegionInfo::IsExecutable() {
74   return m_opaque_up->GetExecutable() == MemoryRegionInfo::eYes;
75 }
76 
77 bool SBMemoryRegionInfo::IsMapped() {
78   return m_opaque_up->GetMapped() == MemoryRegionInfo::eYes;
79 }
80 
81 const char *SBMemoryRegionInfo::GetName() {
82   return m_opaque_up->GetName().AsCString();
83 }
84 
85 bool SBMemoryRegionInfo::GetDescription(SBStream &description) {
86   Stream &strm = description.ref();
87   const addr_t load_addr = m_opaque_up->GetRange().base;
88 
89   strm.Printf("[0x%16.16" PRIx64 "-0x%16.16" PRIx64 " ", load_addr,
90               load_addr + m_opaque_up->GetRange().size);
91   strm.Printf(m_opaque_up->GetReadable() ? "R" : "-");
92   strm.Printf(m_opaque_up->GetWritable() ? "W" : "-");
93   strm.Printf(m_opaque_up->GetExecutable() ? "X" : "-");
94   strm.Printf("]");
95 
96   return true;
97 }
98