xref: /freebsd-src/contrib/llvm-project/lldb/source/API/SBAddressRange.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1*0fca6ea1SDimitry Andric //===-- SBAddressRange.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/SBAddressRange.h"
10*0fca6ea1SDimitry Andric #include "Utils.h"
11*0fca6ea1SDimitry Andric #include "lldb/API/SBAddress.h"
12*0fca6ea1SDimitry Andric #include "lldb/API/SBStream.h"
13*0fca6ea1SDimitry Andric #include "lldb/API/SBTarget.h"
14*0fca6ea1SDimitry Andric #include "lldb/Core/AddressRange.h"
15*0fca6ea1SDimitry Andric #include "lldb/Core/Section.h"
16*0fca6ea1SDimitry Andric #include "lldb/Utility/Instrumentation.h"
17*0fca6ea1SDimitry Andric #include "lldb/Utility/Stream.h"
18*0fca6ea1SDimitry Andric #include <cstddef>
19*0fca6ea1SDimitry Andric #include <memory>
20*0fca6ea1SDimitry Andric 
21*0fca6ea1SDimitry Andric using namespace lldb;
22*0fca6ea1SDimitry Andric using namespace lldb_private;
23*0fca6ea1SDimitry Andric 
24*0fca6ea1SDimitry Andric SBAddressRange::SBAddressRange()
25*0fca6ea1SDimitry Andric     : m_opaque_up(std::make_unique<AddressRange>()) {
26*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this);
27*0fca6ea1SDimitry Andric }
28*0fca6ea1SDimitry Andric 
29*0fca6ea1SDimitry Andric SBAddressRange::SBAddressRange(const SBAddressRange &rhs) {
30*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
31*0fca6ea1SDimitry Andric 
32*0fca6ea1SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
33*0fca6ea1SDimitry Andric }
34*0fca6ea1SDimitry Andric 
35*0fca6ea1SDimitry Andric SBAddressRange::SBAddressRange(lldb::SBAddress addr, lldb::addr_t byte_size)
36*0fca6ea1SDimitry Andric     : m_opaque_up(std::make_unique<AddressRange>(addr.ref(), byte_size)) {
37*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, addr, byte_size);
38*0fca6ea1SDimitry Andric }
39*0fca6ea1SDimitry Andric 
40*0fca6ea1SDimitry Andric SBAddressRange::~SBAddressRange() = default;
41*0fca6ea1SDimitry Andric 
42*0fca6ea1SDimitry Andric const SBAddressRange &SBAddressRange::operator=(const SBAddressRange &rhs) {
43*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
44*0fca6ea1SDimitry Andric 
45*0fca6ea1SDimitry Andric   if (this != &rhs)
46*0fca6ea1SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
47*0fca6ea1SDimitry Andric   return *this;
48*0fca6ea1SDimitry Andric }
49*0fca6ea1SDimitry Andric 
50*0fca6ea1SDimitry Andric bool SBAddressRange::operator==(const SBAddressRange &rhs) {
51*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
52*0fca6ea1SDimitry Andric 
53*0fca6ea1SDimitry Andric   return ref().operator==(rhs.ref());
54*0fca6ea1SDimitry Andric }
55*0fca6ea1SDimitry Andric 
56*0fca6ea1SDimitry Andric bool SBAddressRange::operator!=(const SBAddressRange &rhs) {
57*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
58*0fca6ea1SDimitry Andric 
59*0fca6ea1SDimitry Andric   return !(*this == rhs);
60*0fca6ea1SDimitry Andric }
61*0fca6ea1SDimitry Andric 
62*0fca6ea1SDimitry Andric void SBAddressRange::Clear() {
63*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this);
64*0fca6ea1SDimitry Andric 
65*0fca6ea1SDimitry Andric   ref().Clear();
66*0fca6ea1SDimitry Andric }
67*0fca6ea1SDimitry Andric 
68*0fca6ea1SDimitry Andric bool SBAddressRange::IsValid() const {
69*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this);
70*0fca6ea1SDimitry Andric 
71*0fca6ea1SDimitry Andric   return ref().IsValid();
72*0fca6ea1SDimitry Andric }
73*0fca6ea1SDimitry Andric 
74*0fca6ea1SDimitry Andric lldb::SBAddress SBAddressRange::GetBaseAddress() const {
75*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this);
76*0fca6ea1SDimitry Andric 
77*0fca6ea1SDimitry Andric   return lldb::SBAddress(ref().GetBaseAddress());
78*0fca6ea1SDimitry Andric }
79*0fca6ea1SDimitry Andric 
80*0fca6ea1SDimitry Andric lldb::addr_t SBAddressRange::GetByteSize() const {
81*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this);
82*0fca6ea1SDimitry Andric 
83*0fca6ea1SDimitry Andric   return ref().GetByteSize();
84*0fca6ea1SDimitry Andric }
85*0fca6ea1SDimitry Andric 
86*0fca6ea1SDimitry Andric bool SBAddressRange::GetDescription(SBStream &description,
87*0fca6ea1SDimitry Andric                                     const SBTarget target) {
88*0fca6ea1SDimitry Andric   LLDB_INSTRUMENT_VA(this, description, target);
89*0fca6ea1SDimitry Andric 
90*0fca6ea1SDimitry Andric   return ref().GetDescription(&description.ref(), target.GetSP().get());
91*0fca6ea1SDimitry Andric }
92*0fca6ea1SDimitry Andric 
93*0fca6ea1SDimitry Andric lldb_private::AddressRange &SBAddressRange::ref() const {
94*0fca6ea1SDimitry Andric   assert(m_opaque_up && "opaque pointer must always be valid");
95*0fca6ea1SDimitry Andric   return *m_opaque_up;
96*0fca6ea1SDimitry Andric }
97