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