diff options
Diffstat (limited to 'contrib/llvm-project/lldb/source/API/SBMemoryRegionInfoList.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/API/SBMemoryRegionInfoList.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/API/SBMemoryRegionInfoList.cpp b/contrib/llvm-project/lldb/source/API/SBMemoryRegionInfoList.cpp new file mode 100644 index 000000000000..f8381d1098a0 --- /dev/null +++ b/contrib/llvm-project/lldb/source/API/SBMemoryRegionInfoList.cpp @@ -0,0 +1,151 @@ +//===-- 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; +} |