Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 1 | //===-- SBMemoryRegionInfoList.cpp ------------------------------*- C++ -*-===// |
| 2 | // |
Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 9 | #include "lldb/API/SBMemoryRegionInfoList.h" |
Zachary Turner | 6f9e690 | 2017-03-03 20:56:28 +0000 | [diff] [blame] | 10 | #include "lldb/API/SBMemoryRegionInfo.h" |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 11 | #include "lldb/API/SBStream.h" |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 12 | #include "lldb/Target/MemoryRegionInfo.h" |
Zachary Turner | 6f9e690 | 2017-03-03 20:56:28 +0000 | [diff] [blame] | 13 | #include "lldb/Utility/Log.h" |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 14 | |
| 15 | #include <vector> |
| 16 | |
| 17 | using namespace lldb; |
| 18 | using namespace lldb_private; |
| 19 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 20 | class MemoryRegionInfoListImpl { |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 21 | public: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 22 | MemoryRegionInfoListImpl() : m_regions() {} |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 23 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 24 | MemoryRegionInfoListImpl(const MemoryRegionInfoListImpl &rhs) |
| 25 | : m_regions(rhs.m_regions) {} |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 26 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 27 | MemoryRegionInfoListImpl &operator=(const MemoryRegionInfoListImpl &rhs) { |
| 28 | if (this == &rhs) |
| 29 | return *this; |
| 30 | m_regions = rhs.m_regions; |
| 31 | return *this; |
| 32 | } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 33 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 34 | size_t GetSize() const { return m_regions.size(); } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 35 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 36 | void Reserve(size_t capacity) { return m_regions.reserve(capacity); } |
| 37 | |
| 38 | void Append(const MemoryRegionInfo &sb_region) { |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 39 | m_regions.push_back(sb_region); |
| 40 | } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 41 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 42 | void Append(const MemoryRegionInfoListImpl &list) { |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 43 | Reserve(GetSize() + list.GetSize()); |
| 44 | |
| 45 | for (const auto &val : list.m_regions) |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 46 | Append(val); |
| 47 | } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 48 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 49 | void Clear() { m_regions.clear(); } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 50 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 51 | bool GetMemoryRegionInfoAtIndex(size_t index, |
| 52 | MemoryRegionInfo ®ion_info) { |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 53 | if (index >= GetSize()) |
| 54 | return false; |
| 55 | region_info = m_regions[index]; |
| 56 | return true; |
| 57 | } |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 58 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 59 | MemoryRegionInfos &Ref() { return m_regions; } |
| 60 | |
| 61 | const MemoryRegionInfos &Ref() const { return m_regions; } |
| 62 | |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 63 | private: |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 64 | MemoryRegionInfos m_regions; |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 65 | }; |
| 66 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 67 | MemoryRegionInfos &SBMemoryRegionInfoList::ref() { |
| 68 | return m_opaque_ap->Ref(); |
| 69 | } |
| 70 | |
| 71 | const MemoryRegionInfos &SBMemoryRegionInfoList::ref() const { |
| 72 | return m_opaque_ap->Ref(); |
| 73 | } |
| 74 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 75 | SBMemoryRegionInfoList::SBMemoryRegionInfoList() |
| 76 | : m_opaque_ap(new MemoryRegionInfoListImpl()) {} |
| 77 | |
| 78 | SBMemoryRegionInfoList::SBMemoryRegionInfoList( |
| 79 | const SBMemoryRegionInfoList &rhs) |
| 80 | : m_opaque_ap(new MemoryRegionInfoListImpl(*rhs.m_opaque_ap)) {} |
| 81 | |
| 82 | SBMemoryRegionInfoList::~SBMemoryRegionInfoList() {} |
| 83 | |
| 84 | const SBMemoryRegionInfoList &SBMemoryRegionInfoList:: |
| 85 | operator=(const SBMemoryRegionInfoList &rhs) { |
| 86 | if (this != &rhs) { |
| 87 | *m_opaque_ap = *rhs.m_opaque_ap; |
| 88 | } |
| 89 | return *this; |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 90 | } |
| 91 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 92 | uint32_t SBMemoryRegionInfoList::GetSize() const { |
| 93 | return m_opaque_ap->GetSize(); |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 94 | } |
| 95 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 96 | bool SBMemoryRegionInfoList::GetMemoryRegionAtIndex( |
| 97 | uint32_t idx, SBMemoryRegionInfo ®ion_info) { |
| 98 | Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); |
| 99 | |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 100 | bool result = m_opaque_ap->GetMemoryRegionInfoAtIndex(idx, region_info.ref()); |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 101 | |
| 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 Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 113 | } |
| 114 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 115 | void SBMemoryRegionInfoList::Clear() { m_opaque_ap->Clear(); } |
| 116 | |
| 117 | void SBMemoryRegionInfoList::Append(SBMemoryRegionInfo &sb_region) { |
Tatyana Krasnukha | 36788bb | 2018-12-20 15:02:58 +0000 | [diff] [blame] | 118 | m_opaque_ap->Append(sb_region.ref()); |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 119 | } |
| 120 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 121 | void SBMemoryRegionInfoList::Append(SBMemoryRegionInfoList &sb_region_list) { |
| 122 | m_opaque_ap->Append(*sb_region_list); |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 123 | } |
| 124 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 125 | const MemoryRegionInfoListImpl *SBMemoryRegionInfoList::operator->() const { |
| 126 | return m_opaque_ap.get(); |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 127 | } |
| 128 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 129 | const MemoryRegionInfoListImpl &SBMemoryRegionInfoList::operator*() const { |
| 130 | assert(m_opaque_ap.get()); |
Jonas Devlieghere | 3447077 | 2018-12-20 21:02:55 +0000 | [diff] [blame] | 131 | return *m_opaque_ap; |
Howard Hellyer | 26036843 | 2016-06-23 08:35:37 +0000 | [diff] [blame] | 132 | } |