xref: /src/contrib/llvm-project/lldb/source/API/SBAddressRangeList.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1ac9a064cSDimitry Andric //===-- SBAddressRangeList.cpp --------------------------------------------===//
2ac9a064cSDimitry Andric //
3ac9a064cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ac9a064cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5ac9a064cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac9a064cSDimitry Andric //
7ac9a064cSDimitry Andric //===----------------------------------------------------------------------===//
8ac9a064cSDimitry Andric 
9ac9a064cSDimitry Andric #include "lldb/API/SBAddressRangeList.h"
10ac9a064cSDimitry Andric #include "Utils.h"
11ac9a064cSDimitry Andric #include "lldb/API/SBAddressRange.h"
12ac9a064cSDimitry Andric #include "lldb/API/SBStream.h"
13ac9a064cSDimitry Andric #include "lldb/API/SBTarget.h"
14ac9a064cSDimitry Andric #include "lldb/Core/AddressRangeListImpl.h"
15ac9a064cSDimitry Andric #include "lldb/Utility/Instrumentation.h"
16ac9a064cSDimitry Andric #include "lldb/Utility/Stream.h"
17ac9a064cSDimitry Andric 
18ac9a064cSDimitry Andric #include <memory>
19ac9a064cSDimitry Andric 
20ac9a064cSDimitry Andric using namespace lldb;
21ac9a064cSDimitry Andric using namespace lldb_private;
22ac9a064cSDimitry Andric 
SBAddressRangeList()23ac9a064cSDimitry Andric SBAddressRangeList::SBAddressRangeList()
24ac9a064cSDimitry Andric     : m_opaque_up(std::make_unique<AddressRangeListImpl>()) {
25ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this);
26ac9a064cSDimitry Andric }
27ac9a064cSDimitry Andric 
SBAddressRangeList(const SBAddressRangeList & rhs)28ac9a064cSDimitry Andric SBAddressRangeList::SBAddressRangeList(const SBAddressRangeList &rhs)
29ac9a064cSDimitry Andric     : m_opaque_up(std::make_unique<AddressRangeListImpl>(*rhs.m_opaque_up)) {
30ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
31ac9a064cSDimitry Andric }
32ac9a064cSDimitry Andric 
33ac9a064cSDimitry Andric SBAddressRangeList::~SBAddressRangeList() = default;
34ac9a064cSDimitry Andric 
35ac9a064cSDimitry Andric const SBAddressRangeList &
operator =(const SBAddressRangeList & rhs)36ac9a064cSDimitry Andric SBAddressRangeList::operator=(const SBAddressRangeList &rhs) {
37ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
38ac9a064cSDimitry Andric 
39ac9a064cSDimitry Andric   if (this != &rhs)
40ac9a064cSDimitry Andric     ref() = rhs.ref();
41ac9a064cSDimitry Andric   return *this;
42ac9a064cSDimitry Andric }
43ac9a064cSDimitry Andric 
GetSize() const44ac9a064cSDimitry Andric uint32_t SBAddressRangeList::GetSize() const {
45ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this);
46ac9a064cSDimitry Andric 
47ac9a064cSDimitry Andric   return ref().GetSize();
48ac9a064cSDimitry Andric }
49ac9a064cSDimitry Andric 
GetAddressRangeAtIndex(uint64_t idx)50ac9a064cSDimitry Andric SBAddressRange SBAddressRangeList::GetAddressRangeAtIndex(uint64_t idx) {
51ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, idx);
52ac9a064cSDimitry Andric 
53ac9a064cSDimitry Andric   SBAddressRange sb_addr_range;
54ac9a064cSDimitry Andric   (*sb_addr_range.m_opaque_up) = ref().GetAddressRangeAtIndex(idx);
55ac9a064cSDimitry Andric   return sb_addr_range;
56ac9a064cSDimitry Andric }
57ac9a064cSDimitry Andric 
Clear()58ac9a064cSDimitry Andric void SBAddressRangeList::Clear() {
59ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this);
60ac9a064cSDimitry Andric 
61ac9a064cSDimitry Andric   ref().Clear();
62ac9a064cSDimitry Andric }
63ac9a064cSDimitry Andric 
Append(const SBAddressRange & sb_addr_range)64ac9a064cSDimitry Andric void SBAddressRangeList::Append(const SBAddressRange &sb_addr_range) {
65ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_addr_range);
66ac9a064cSDimitry Andric 
67ac9a064cSDimitry Andric   ref().Append(*sb_addr_range.m_opaque_up);
68ac9a064cSDimitry Andric }
69ac9a064cSDimitry Andric 
Append(const SBAddressRangeList & sb_addr_range_list)70ac9a064cSDimitry Andric void SBAddressRangeList::Append(const SBAddressRangeList &sb_addr_range_list) {
71ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, sb_addr_range_list);
72ac9a064cSDimitry Andric 
73ac9a064cSDimitry Andric   ref().Append(*sb_addr_range_list.m_opaque_up);
74ac9a064cSDimitry Andric }
75ac9a064cSDimitry Andric 
GetDescription(SBStream & description,const SBTarget & target)76ac9a064cSDimitry Andric bool SBAddressRangeList::GetDescription(SBStream &description,
77ac9a064cSDimitry Andric                                         const SBTarget &target) {
78ac9a064cSDimitry Andric   LLDB_INSTRUMENT_VA(this, description, target);
79ac9a064cSDimitry Andric 
80ac9a064cSDimitry Andric   const uint32_t num_ranges = GetSize();
81ac9a064cSDimitry Andric   bool is_first = true;
82ac9a064cSDimitry Andric   Stream &stream = description.ref();
83ac9a064cSDimitry Andric   stream << "[";
84ac9a064cSDimitry Andric   for (uint32_t i = 0; i < num_ranges; ++i) {
85ac9a064cSDimitry Andric     if (is_first) {
86ac9a064cSDimitry Andric       is_first = false;
87ac9a064cSDimitry Andric     } else {
88ac9a064cSDimitry Andric       stream.Printf(", ");
89ac9a064cSDimitry Andric     }
90ac9a064cSDimitry Andric     GetAddressRangeAtIndex(i).GetDescription(description, target);
91ac9a064cSDimitry Andric   }
92ac9a064cSDimitry Andric   stream << "]";
93ac9a064cSDimitry Andric   return true;
94ac9a064cSDimitry Andric }
95ac9a064cSDimitry Andric 
ref() const96ac9a064cSDimitry Andric lldb_private::AddressRangeListImpl &SBAddressRangeList::ref() const {
97ac9a064cSDimitry Andric   assert(m_opaque_up && "opaque pointer must always be valid");
98ac9a064cSDimitry Andric   return *m_opaque_up;
99ac9a064cSDimitry Andric }
100