1*0b57cec5SDimitry Andric //===-- SBDeclaration.cpp -------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "lldb/API/SBDeclaration.h"
10*0b57cec5SDimitry Andric #include "Utils.h"
11*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
12*0b57cec5SDimitry Andric #include "lldb/Core/Declaration.h"
13*0b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h"
14*0b57cec5SDimitry Andric #include "lldb/Utility/Instrumentation.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
16*0b57cec5SDimitry Andric
17*0b57cec5SDimitry Andric #include <climits>
18*0b57cec5SDimitry Andric
19*0b57cec5SDimitry Andric using namespace lldb;
20*0b57cec5SDimitry Andric using namespace lldb_private;
21*0b57cec5SDimitry Andric
SBDeclaration()22*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration() { LLDB_INSTRUMENT_VA(this); }
23*0b57cec5SDimitry Andric
SBDeclaration(const SBDeclaration & rhs)24*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration(const SBDeclaration &rhs) {
25*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
26*0b57cec5SDimitry Andric
27*0b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
28*0b57cec5SDimitry Andric }
29*0b57cec5SDimitry Andric
SBDeclaration(const lldb_private::Declaration * lldb_object_ptr)30*0b57cec5SDimitry Andric SBDeclaration::SBDeclaration(const lldb_private::Declaration *lldb_object_ptr) {
31*0b57cec5SDimitry Andric if (lldb_object_ptr)
32*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<Declaration>(*lldb_object_ptr);
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric
operator =(const SBDeclaration & rhs)35*0b57cec5SDimitry Andric const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
36*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
37*0b57cec5SDimitry Andric
38*0b57cec5SDimitry Andric if (this != &rhs)
39*0b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up);
40*0b57cec5SDimitry Andric return *this;
41*0b57cec5SDimitry Andric }
42*0b57cec5SDimitry Andric
SetDeclaration(const lldb_private::Declaration & lldb_object_ref)43*0b57cec5SDimitry Andric void SBDeclaration::SetDeclaration(
44*0b57cec5SDimitry Andric const lldb_private::Declaration &lldb_object_ref) {
45*0b57cec5SDimitry Andric ref() = lldb_object_ref;
46*0b57cec5SDimitry Andric }
47*0b57cec5SDimitry Andric
48*0b57cec5SDimitry Andric SBDeclaration::~SBDeclaration() = default;
49*0b57cec5SDimitry Andric
IsValid() const50*0b57cec5SDimitry Andric bool SBDeclaration::IsValid() const {
51*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this);
52*0b57cec5SDimitry Andric return this->operator bool();
53*0b57cec5SDimitry Andric }
operator bool() const54*0b57cec5SDimitry Andric SBDeclaration::operator bool() const {
55*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this);
56*0b57cec5SDimitry Andric
57*0b57cec5SDimitry Andric return m_opaque_up.get() && m_opaque_up->IsValid();
58*0b57cec5SDimitry Andric }
59*0b57cec5SDimitry Andric
GetFileSpec() const60*0b57cec5SDimitry Andric SBFileSpec SBDeclaration::GetFileSpec() const {
61*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this);
62*0b57cec5SDimitry Andric
63*0b57cec5SDimitry Andric SBFileSpec sb_file_spec;
64*0b57cec5SDimitry Andric if (m_opaque_up.get() && m_opaque_up->GetFile())
65*0b57cec5SDimitry Andric sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
66*0b57cec5SDimitry Andric
67*0b57cec5SDimitry Andric return sb_file_spec;
68*0b57cec5SDimitry Andric }
69*0b57cec5SDimitry Andric
GetLine() const70*0b57cec5SDimitry Andric uint32_t SBDeclaration::GetLine() const {
71*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this);
72*0b57cec5SDimitry Andric
73*0b57cec5SDimitry Andric uint32_t line = 0;
74*0b57cec5SDimitry Andric if (m_opaque_up)
75*0b57cec5SDimitry Andric line = m_opaque_up->GetLine();
76*0b57cec5SDimitry Andric
77*0b57cec5SDimitry Andric
78*0b57cec5SDimitry Andric return line;
79*0b57cec5SDimitry Andric }
80*0b57cec5SDimitry Andric
GetColumn() const81*0b57cec5SDimitry Andric uint32_t SBDeclaration::GetColumn() const {
82*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this);
83*0b57cec5SDimitry Andric
84*0b57cec5SDimitry Andric if (m_opaque_up)
85*0b57cec5SDimitry Andric return m_opaque_up->GetColumn();
86*0b57cec5SDimitry Andric return 0;
87*0b57cec5SDimitry Andric }
88*0b57cec5SDimitry Andric
SetFileSpec(lldb::SBFileSpec filespec)89*0b57cec5SDimitry Andric void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
90*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, filespec);
91*0b57cec5SDimitry Andric
92*0b57cec5SDimitry Andric if (filespec.IsValid())
93*0b57cec5SDimitry Andric ref().SetFile(filespec.ref());
94*0b57cec5SDimitry Andric else
95*0b57cec5SDimitry Andric ref().SetFile(FileSpec());
96*0b57cec5SDimitry Andric }
SetLine(uint32_t line)97*0b57cec5SDimitry Andric void SBDeclaration::SetLine(uint32_t line) {
98*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, line);
99*0b57cec5SDimitry Andric
100*0b57cec5SDimitry Andric ref().SetLine(line);
101*0b57cec5SDimitry Andric }
102*0b57cec5SDimitry Andric
SetColumn(uint32_t column)103*0b57cec5SDimitry Andric void SBDeclaration::SetColumn(uint32_t column) {
104*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, column);
105*0b57cec5SDimitry Andric
106*0b57cec5SDimitry Andric ref().SetColumn(column);
107*0b57cec5SDimitry Andric }
108*0b57cec5SDimitry Andric
operator ==(const SBDeclaration & rhs) const109*0b57cec5SDimitry Andric bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
110*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
111*0b57cec5SDimitry Andric
112*0b57cec5SDimitry Andric lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
113*0b57cec5SDimitry Andric lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
114*0b57cec5SDimitry Andric
115*0b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr)
116*0b57cec5SDimitry Andric return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
117*0b57cec5SDimitry Andric
118*0b57cec5SDimitry Andric return lhs_ptr == rhs_ptr;
119*0b57cec5SDimitry Andric }
120*0b57cec5SDimitry Andric
operator !=(const SBDeclaration & rhs) const121*0b57cec5SDimitry Andric bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
122*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs);
123*0b57cec5SDimitry Andric
124*0b57cec5SDimitry Andric lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
125*0b57cec5SDimitry Andric lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
126*0b57cec5SDimitry Andric
127*0b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr)
128*0b57cec5SDimitry Andric return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
129*0b57cec5SDimitry Andric
130*0b57cec5SDimitry Andric return lhs_ptr != rhs_ptr;
131*0b57cec5SDimitry Andric }
132*0b57cec5SDimitry Andric
operator ->() const133*0b57cec5SDimitry Andric const lldb_private::Declaration *SBDeclaration::operator->() const {
134*0b57cec5SDimitry Andric return m_opaque_up.get();
135*0b57cec5SDimitry Andric }
136*0b57cec5SDimitry Andric
ref()137*0b57cec5SDimitry Andric lldb_private::Declaration &SBDeclaration::ref() {
138*0b57cec5SDimitry Andric if (m_opaque_up == nullptr)
139*0b57cec5SDimitry Andric m_opaque_up = std::make_unique<lldb_private::Declaration>();
140*0b57cec5SDimitry Andric return *m_opaque_up;
141*0b57cec5SDimitry Andric }
142*0b57cec5SDimitry Andric
ref() const143*0b57cec5SDimitry Andric const lldb_private::Declaration &SBDeclaration::ref() const {
144*0b57cec5SDimitry Andric return *m_opaque_up;
145*0b57cec5SDimitry Andric }
146*0b57cec5SDimitry Andric
GetDescription(SBStream & description)147*0b57cec5SDimitry Andric bool SBDeclaration::GetDescription(SBStream &description) {
148*0b57cec5SDimitry Andric LLDB_INSTRUMENT_VA(this, description);
149*0b57cec5SDimitry Andric
150*0b57cec5SDimitry Andric Stream &strm = description.ref();
151*0b57cec5SDimitry Andric
152*0b57cec5SDimitry Andric if (m_opaque_up) {
153*0b57cec5SDimitry Andric char file_path[PATH_MAX * 2];
154*0b57cec5SDimitry Andric m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
155*0b57cec5SDimitry Andric strm.Printf("%s:%u", file_path, GetLine());
156*0b57cec5SDimitry Andric if (GetColumn() > 0)
157*0b57cec5SDimitry Andric strm.Printf(":%u", GetColumn());
158*0b57cec5SDimitry Andric } else
159*0b57cec5SDimitry Andric strm.PutCString("No value");
160*0b57cec5SDimitry Andric
161*0b57cec5SDimitry Andric return true;
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric
get()164*0b57cec5SDimitry Andric lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); }
165*0b57cec5SDimitry Andric