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