blob: 290804a9cd6fc4a54d7eb833c34cbf6c18e6598a [file] [log] [blame]
Howard Hellyer260368432016-06-23 08:35:37 +00001//===-- SBMemoryRegionInfoList.cpp ------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Howard Hellyer260368432016-06-23 08:35:37 +00006//
7//===----------------------------------------------------------------------===//
8
Howard Hellyer260368432016-06-23 08:35:37 +00009#include "lldb/API/SBMemoryRegionInfoList.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000010#include "lldb/API/SBMemoryRegionInfo.h"
Howard Hellyer260368432016-06-23 08:35:37 +000011#include "lldb/API/SBStream.h"
Howard Hellyer260368432016-06-23 08:35:37 +000012#include "lldb/Target/MemoryRegionInfo.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000013#include "lldb/Utility/Log.h"
Howard Hellyer260368432016-06-23 08:35:37 +000014
15#include <vector>
16
17using namespace lldb;
18using namespace lldb_private;
19
Kate Stoneb9c1b512016-09-06 20:57:50 +000020class MemoryRegionInfoListImpl {
Howard Hellyer260368432016-06-23 08:35:37 +000021public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000022 MemoryRegionInfoListImpl() : m_regions() {}
Howard Hellyer260368432016-06-23 08:35:37 +000023
Kate Stoneb9c1b512016-09-06 20:57:50 +000024 MemoryRegionInfoListImpl(const MemoryRegionInfoListImpl &rhs)
25 : m_regions(rhs.m_regions) {}
Howard Hellyer260368432016-06-23 08:35:37 +000026
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 MemoryRegionInfoListImpl &operator=(const MemoryRegionInfoListImpl &rhs) {
28 if (this == &rhs)
29 return *this;
30 m_regions = rhs.m_regions;
31 return *this;
32 }
Howard Hellyer260368432016-06-23 08:35:37 +000033
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000034 size_t GetSize() const { return m_regions.size(); }
Howard Hellyer260368432016-06-23 08:35:37 +000035
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000036 void Reserve(size_t capacity) { return m_regions.reserve(capacity); }
37
38 void Append(const MemoryRegionInfo &sb_region) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000039 m_regions.push_back(sb_region);
40 }
Howard Hellyer260368432016-06-23 08:35:37 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 void Append(const MemoryRegionInfoListImpl &list) {
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000043 Reserve(GetSize() + list.GetSize());
44
45 for (const auto &val : list.m_regions)
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 Append(val);
47 }
Howard Hellyer260368432016-06-23 08:35:37 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049 void Clear() { m_regions.clear(); }
Howard Hellyer260368432016-06-23 08:35:37 +000050
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000051 bool GetMemoryRegionInfoAtIndex(size_t index,
52 MemoryRegionInfo &region_info) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000053 if (index >= GetSize())
54 return false;
55 region_info = m_regions[index];
56 return true;
57 }
Howard Hellyer260368432016-06-23 08:35:37 +000058
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000059 MemoryRegionInfos &Ref() { return m_regions; }
60
61 const MemoryRegionInfos &Ref() const { return m_regions; }
62
Howard Hellyer260368432016-06-23 08:35:37 +000063private:
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000064 MemoryRegionInfos m_regions;
Howard Hellyer260368432016-06-23 08:35:37 +000065};
66
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +000067MemoryRegionInfos &SBMemoryRegionInfoList::ref() {
68 return m_opaque_ap->Ref();
69}
70
71const MemoryRegionInfos &SBMemoryRegionInfoList::ref() const {
72 return m_opaque_ap->Ref();
73}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075SBMemoryRegionInfoList::SBMemoryRegionInfoList()
76 : m_opaque_ap(new MemoryRegionInfoListImpl()) {}
77
78SBMemoryRegionInfoList::SBMemoryRegionInfoList(
79 const SBMemoryRegionInfoList &rhs)
80 : m_opaque_ap(new MemoryRegionInfoListImpl(*rhs.m_opaque_ap)) {}
81
82SBMemoryRegionInfoList::~SBMemoryRegionInfoList() {}
83
84const SBMemoryRegionInfoList &SBMemoryRegionInfoList::
85operator=(const SBMemoryRegionInfoList &rhs) {
86 if (this != &rhs) {
87 *m_opaque_ap = *rhs.m_opaque_ap;
88 }
89 return *this;
Howard Hellyer260368432016-06-23 08:35:37 +000090}
91
Kate Stoneb9c1b512016-09-06 20:57:50 +000092uint32_t SBMemoryRegionInfoList::GetSize() const {
93 return m_opaque_ap->GetSize();
Howard Hellyer260368432016-06-23 08:35:37 +000094}
95
Kate Stoneb9c1b512016-09-06 20:57:50 +000096bool SBMemoryRegionInfoList::GetMemoryRegionAtIndex(
97 uint32_t idx, SBMemoryRegionInfo &region_info) {
98 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
99
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +0000100 bool result = m_opaque_ap->GetMemoryRegionInfoAtIndex(idx, region_info.ref());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101
102 if (log) {
103 SBStream sstr;
104 region_info.GetDescription(sstr);
105 log->Printf("SBMemoryRegionInfoList::GetMemoryRegionAtIndex (this.ap=%p, "
106 "idx=%d) => SBMemoryRegionInfo (this.ap=%p, '%s')",
107 static_cast<void *>(m_opaque_ap.get()), idx,
108 static_cast<void *>(region_info.m_opaque_ap.get()),
109 sstr.GetData());
110 }
111
112 return result;
Howard Hellyer260368432016-06-23 08:35:37 +0000113}
114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115void SBMemoryRegionInfoList::Clear() { m_opaque_ap->Clear(); }
116
117void SBMemoryRegionInfoList::Append(SBMemoryRegionInfo &sb_region) {
Tatyana Krasnukha36788bb2018-12-20 15:02:58 +0000118 m_opaque_ap->Append(sb_region.ref());
Howard Hellyer260368432016-06-23 08:35:37 +0000119}
120
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121void SBMemoryRegionInfoList::Append(SBMemoryRegionInfoList &sb_region_list) {
122 m_opaque_ap->Append(*sb_region_list);
Howard Hellyer260368432016-06-23 08:35:37 +0000123}
124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125const MemoryRegionInfoListImpl *SBMemoryRegionInfoList::operator->() const {
126 return m_opaque_ap.get();
Howard Hellyer260368432016-06-23 08:35:37 +0000127}
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129const MemoryRegionInfoListImpl &SBMemoryRegionInfoList::operator*() const {
130 assert(m_opaque_ap.get());
Jonas Devlieghere34470772018-12-20 21:02:55 +0000131 return *m_opaque_ap;
Howard Hellyer260368432016-06-23 08:35:37 +0000132}