| //===-- SBMemoryRegionInfoList.cpp ----------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "lldb/API/SBMemoryRegionInfoList.h" | |
| #include "lldb/API/SBMemoryRegionInfo.h" | |
| #include "lldb/API/SBStream.h" | |
| #include "lldb/Target/MemoryRegionInfo.h" | |
| #include "lldb/Utility/Instrumentation.h" | |
| #include <vector> | |
| using namespace lldb; | |
| using namespace lldb_private; | |
| class MemoryRegionInfoListImpl { | |
| public: | |
| MemoryRegionInfoListImpl() : m_regions() {} | |
| MemoryRegionInfoListImpl(const MemoryRegionInfoListImpl &rhs) = default; | |
| MemoryRegionInfoListImpl &operator=(const MemoryRegionInfoListImpl &rhs) { | |
| if (this == &rhs) | |
| return *this; | |
| m_regions = rhs.m_regions; | |
| return *this; | |
| } | |
| size_t GetSize() const { return m_regions.size(); } | |
| void Reserve(size_t capacity) { return m_regions.reserve(capacity); } | |
| void Append(const MemoryRegionInfo &sb_region) { | |
| m_regions.push_back(sb_region); | |
| } | |
| void Append(const MemoryRegionInfoListImpl &list) { | |
| Reserve(GetSize() + list.GetSize()); | |
| for (const auto &val : list.m_regions) | |
| Append(val); | |
| } | |
| void Clear() { m_regions.clear(); } | |
| bool GetMemoryRegionContainingAddress(lldb::addr_t addr, | |
| MemoryRegionInfo ®ion_info) { | |
| for (auto ®ion : m_regions) { | |
| if (region.GetRange().Contains(addr)) { | |
| region_info = region; | |
| return true; | |
| } | |
| } | |
| return false; | |
| } | |
| bool GetMemoryRegionInfoAtIndex(size_t index, | |
| MemoryRegionInfo ®ion_info) { | |
| if (index >= GetSize()) | |
| return false; | |
| region_info = m_regions[index]; | |
| return true; | |
| } | |
| MemoryRegionInfos &Ref() { return m_regions; } | |
| const MemoryRegionInfos &Ref() const { return m_regions; } | |
| private: | |
| MemoryRegionInfos m_regions; | |
| }; | |
| MemoryRegionInfos &SBMemoryRegionInfoList::ref() { return m_opaque_up->Ref(); } | |
| const MemoryRegionInfos &SBMemoryRegionInfoList::ref() const { | |
| return m_opaque_up->Ref(); | |
| } | |
| SBMemoryRegionInfoList::SBMemoryRegionInfoList() | |
| : m_opaque_up(new MemoryRegionInfoListImpl()) { | |
| LLDB_INSTRUMENT_VA(this); | |
| } | |
| SBMemoryRegionInfoList::SBMemoryRegionInfoList( | |
| const SBMemoryRegionInfoList &rhs) | |
| : m_opaque_up(new MemoryRegionInfoListImpl(*rhs.m_opaque_up)) { | |
| LLDB_INSTRUMENT_VA(this, rhs); | |
| } | |
| SBMemoryRegionInfoList::~SBMemoryRegionInfoList() = default; | |
| const SBMemoryRegionInfoList &SBMemoryRegionInfoList:: | |
| operator=(const SBMemoryRegionInfoList &rhs) { | |
| LLDB_INSTRUMENT_VA(this, rhs); | |
| if (this != &rhs) { | |
| *m_opaque_up = *rhs.m_opaque_up; | |
| } | |
| return *this; | |
| } | |
| uint32_t SBMemoryRegionInfoList::GetSize() const { | |
| LLDB_INSTRUMENT_VA(this); | |
| return m_opaque_up->GetSize(); | |
| } | |
| bool SBMemoryRegionInfoList::GetMemoryRegionContainingAddress( | |
| lldb::addr_t addr, SBMemoryRegionInfo ®ion_info) { | |
| LLDB_INSTRUMENT_VA(this, addr, region_info); | |
| return m_opaque_up->GetMemoryRegionContainingAddress(addr, region_info.ref()); | |
| } | |
| bool SBMemoryRegionInfoList::GetMemoryRegionAtIndex( | |
| uint32_t idx, SBMemoryRegionInfo ®ion_info) { | |
| LLDB_INSTRUMENT_VA(this, idx, region_info); | |
| return m_opaque_up->GetMemoryRegionInfoAtIndex(idx, region_info.ref()); | |
| } | |
| void SBMemoryRegionInfoList::Clear() { | |
| LLDB_INSTRUMENT_VA(this); | |
| m_opaque_up->Clear(); | |
| } | |
| void SBMemoryRegionInfoList::Append(SBMemoryRegionInfo &sb_region) { | |
| LLDB_INSTRUMENT_VA(this, sb_region); | |
| m_opaque_up->Append(sb_region.ref()); | |
| } | |
| void SBMemoryRegionInfoList::Append(SBMemoryRegionInfoList &sb_region_list) { | |
| LLDB_INSTRUMENT_VA(this, sb_region_list); | |
| m_opaque_up->Append(*sb_region_list); | |
| } | |
| const MemoryRegionInfoListImpl *SBMemoryRegionInfoList::operator->() const { | |
| return m_opaque_up.get(); | |
| } | |
| const MemoryRegionInfoListImpl &SBMemoryRegionInfoList::operator*() const { | |
| assert(m_opaque_up.get()); | |
| return *m_opaque_up; | |
| } |