xref: /freebsd/contrib/llvm-project/lldb/source/API/SBLineEntry.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===//
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/SBLineEntry.h"
10*0b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
11*0b57cec5SDimitry Andric #include "Utils.h"
12*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
13*0b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h"
14*0b57cec5SDimitry Andric #include "lldb/Symbol/LineEntry.h"
15*0b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h"
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric #include <limits.h>
18*0b57cec5SDimitry Andric 
19*0b57cec5SDimitry Andric using namespace lldb;
20*0b57cec5SDimitry Andric using namespace lldb_private;
21*0b57cec5SDimitry Andric 
22*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry() : m_opaque_up() {
23*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBLineEntry);
24*0b57cec5SDimitry Andric }
25*0b57cec5SDimitry Andric 
26*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const SBLineEntry &rhs) : m_opaque_up() {
27*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &), rhs);
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
30*0b57cec5SDimitry Andric }
31*0b57cec5SDimitry Andric 
32*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr)
33*0b57cec5SDimitry Andric     : m_opaque_up() {
34*0b57cec5SDimitry Andric   if (lldb_object_ptr)
35*0b57cec5SDimitry Andric     m_opaque_up = llvm::make_unique<LineEntry>(*lldb_object_ptr);
36*0b57cec5SDimitry Andric }
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) {
39*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const lldb::SBLineEntry &,
40*0b57cec5SDimitry Andric                      SBLineEntry, operator=,(const lldb::SBLineEntry &), rhs);
41*0b57cec5SDimitry Andric 
42*0b57cec5SDimitry Andric   if (this != &rhs)
43*0b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
44*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(*this);
45*0b57cec5SDimitry Andric }
46*0b57cec5SDimitry Andric 
47*0b57cec5SDimitry Andric void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) {
48*0b57cec5SDimitry Andric   m_opaque_up = llvm::make_unique<LineEntry>(lldb_object_ref);
49*0b57cec5SDimitry Andric }
50*0b57cec5SDimitry Andric 
51*0b57cec5SDimitry Andric SBLineEntry::~SBLineEntry() {}
52*0b57cec5SDimitry Andric 
53*0b57cec5SDimitry Andric SBAddress SBLineEntry::GetStartAddress() const {
54*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry,
55*0b57cec5SDimitry Andric                                    GetStartAddress);
56*0b57cec5SDimitry Andric 
57*0b57cec5SDimitry Andric   SBAddress sb_address;
58*0b57cec5SDimitry Andric   if (m_opaque_up)
59*0b57cec5SDimitry Andric     sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress());
60*0b57cec5SDimitry Andric 
61*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_address);
62*0b57cec5SDimitry Andric }
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric SBAddress SBLineEntry::GetEndAddress() const {
65*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, GetEndAddress);
66*0b57cec5SDimitry Andric 
67*0b57cec5SDimitry Andric   SBAddress sb_address;
68*0b57cec5SDimitry Andric   if (m_opaque_up) {
69*0b57cec5SDimitry Andric     sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress());
70*0b57cec5SDimitry Andric     sb_address.OffsetAddress(m_opaque_up->range.GetByteSize());
71*0b57cec5SDimitry Andric   }
72*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_address);
73*0b57cec5SDimitry Andric }
74*0b57cec5SDimitry Andric 
75*0b57cec5SDimitry Andric bool SBLineEntry::IsValid() const {
76*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, IsValid);
77*0b57cec5SDimitry Andric   return this->operator bool();
78*0b57cec5SDimitry Andric }
79*0b57cec5SDimitry Andric SBLineEntry::operator bool() const {
80*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, operator bool);
81*0b57cec5SDimitry Andric 
82*0b57cec5SDimitry Andric   return m_opaque_up.get() && m_opaque_up->IsValid();
83*0b57cec5SDimitry Andric }
84*0b57cec5SDimitry Andric 
85*0b57cec5SDimitry Andric SBFileSpec SBLineEntry::GetFileSpec() const {
86*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBLineEntry, GetFileSpec);
87*0b57cec5SDimitry Andric 
88*0b57cec5SDimitry Andric   SBFileSpec sb_file_spec;
89*0b57cec5SDimitry Andric   if (m_opaque_up.get() && m_opaque_up->file)
90*0b57cec5SDimitry Andric     sb_file_spec.SetFileSpec(m_opaque_up->file);
91*0b57cec5SDimitry Andric 
92*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_file_spec);
93*0b57cec5SDimitry Andric }
94*0b57cec5SDimitry Andric 
95*0b57cec5SDimitry Andric uint32_t SBLineEntry::GetLine() const {
96*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetLine);
97*0b57cec5SDimitry Andric 
98*0b57cec5SDimitry Andric   uint32_t line = 0;
99*0b57cec5SDimitry Andric   if (m_opaque_up)
100*0b57cec5SDimitry Andric     line = m_opaque_up->line;
101*0b57cec5SDimitry Andric 
102*0b57cec5SDimitry Andric   return line;
103*0b57cec5SDimitry Andric }
104*0b57cec5SDimitry Andric 
105*0b57cec5SDimitry Andric uint32_t SBLineEntry::GetColumn() const {
106*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetColumn);
107*0b57cec5SDimitry Andric 
108*0b57cec5SDimitry Andric   if (m_opaque_up)
109*0b57cec5SDimitry Andric     return m_opaque_up->column;
110*0b57cec5SDimitry Andric   return 0;
111*0b57cec5SDimitry Andric }
112*0b57cec5SDimitry Andric 
113*0b57cec5SDimitry Andric void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) {
114*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec),
115*0b57cec5SDimitry Andric                      filespec);
116*0b57cec5SDimitry Andric 
117*0b57cec5SDimitry Andric   if (filespec.IsValid())
118*0b57cec5SDimitry Andric     ref().file = filespec.ref();
119*0b57cec5SDimitry Andric   else
120*0b57cec5SDimitry Andric     ref().file.Clear();
121*0b57cec5SDimitry Andric }
122*0b57cec5SDimitry Andric void SBLineEntry::SetLine(uint32_t line) {
123*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBLineEntry, SetLine, (uint32_t), line);
124*0b57cec5SDimitry Andric 
125*0b57cec5SDimitry Andric   ref().line = line;
126*0b57cec5SDimitry Andric }
127*0b57cec5SDimitry Andric 
128*0b57cec5SDimitry Andric void SBLineEntry::SetColumn(uint32_t column) {
129*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(void, SBLineEntry, SetColumn, (uint32_t), column);
130*0b57cec5SDimitry Andric 
131*0b57cec5SDimitry Andric   ref().line = column;
132*0b57cec5SDimitry Andric }
133*0b57cec5SDimitry Andric 
134*0b57cec5SDimitry Andric bool SBLineEntry::operator==(const SBLineEntry &rhs) const {
135*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(
136*0b57cec5SDimitry Andric       bool, SBLineEntry, operator==,(const lldb::SBLineEntry &), rhs);
137*0b57cec5SDimitry Andric 
138*0b57cec5SDimitry Andric   lldb_private::LineEntry *lhs_ptr = m_opaque_up.get();
139*0b57cec5SDimitry Andric   lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get();
140*0b57cec5SDimitry Andric 
141*0b57cec5SDimitry Andric   if (lhs_ptr && rhs_ptr)
142*0b57cec5SDimitry Andric     return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) == 0;
143*0b57cec5SDimitry Andric 
144*0b57cec5SDimitry Andric   return lhs_ptr == rhs_ptr;
145*0b57cec5SDimitry Andric }
146*0b57cec5SDimitry Andric 
147*0b57cec5SDimitry Andric bool SBLineEntry::operator!=(const SBLineEntry &rhs) const {
148*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(
149*0b57cec5SDimitry Andric       bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &), rhs);
150*0b57cec5SDimitry Andric 
151*0b57cec5SDimitry Andric   lldb_private::LineEntry *lhs_ptr = m_opaque_up.get();
152*0b57cec5SDimitry Andric   lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get();
153*0b57cec5SDimitry Andric 
154*0b57cec5SDimitry Andric   if (lhs_ptr && rhs_ptr)
155*0b57cec5SDimitry Andric     return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) != 0;
156*0b57cec5SDimitry Andric 
157*0b57cec5SDimitry Andric   return lhs_ptr != rhs_ptr;
158*0b57cec5SDimitry Andric }
159*0b57cec5SDimitry Andric 
160*0b57cec5SDimitry Andric const lldb_private::LineEntry *SBLineEntry::operator->() const {
161*0b57cec5SDimitry Andric   return m_opaque_up.get();
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric 
164*0b57cec5SDimitry Andric lldb_private::LineEntry &SBLineEntry::ref() {
165*0b57cec5SDimitry Andric   if (m_opaque_up == nullptr)
166*0b57cec5SDimitry Andric     m_opaque_up.reset(new lldb_private::LineEntry());
167*0b57cec5SDimitry Andric   return *m_opaque_up;
168*0b57cec5SDimitry Andric }
169*0b57cec5SDimitry Andric 
170*0b57cec5SDimitry Andric const lldb_private::LineEntry &SBLineEntry::ref() const { return *m_opaque_up; }
171*0b57cec5SDimitry Andric 
172*0b57cec5SDimitry Andric bool SBLineEntry::GetDescription(SBStream &description) {
173*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &),
174*0b57cec5SDimitry Andric                      description);
175*0b57cec5SDimitry Andric 
176*0b57cec5SDimitry Andric   Stream &strm = description.ref();
177*0b57cec5SDimitry Andric 
178*0b57cec5SDimitry Andric   if (m_opaque_up) {
179*0b57cec5SDimitry Andric     char file_path[PATH_MAX * 2];
180*0b57cec5SDimitry Andric     m_opaque_up->file.GetPath(file_path, sizeof(file_path));
181*0b57cec5SDimitry Andric     strm.Printf("%s:%u", file_path, GetLine());
182*0b57cec5SDimitry Andric     if (GetColumn() > 0)
183*0b57cec5SDimitry Andric       strm.Printf(":%u", GetColumn());
184*0b57cec5SDimitry Andric   } else
185*0b57cec5SDimitry Andric     strm.PutCString("No value");
186*0b57cec5SDimitry Andric 
187*0b57cec5SDimitry Andric   return true;
188*0b57cec5SDimitry Andric }
189*0b57cec5SDimitry Andric 
190*0b57cec5SDimitry Andric lldb_private::LineEntry *SBLineEntry::get() { return m_opaque_up.get(); }
191*0b57cec5SDimitry Andric 
192*0b57cec5SDimitry Andric namespace lldb_private {
193*0b57cec5SDimitry Andric namespace repro {
194*0b57cec5SDimitry Andric 
195*0b57cec5SDimitry Andric template <>
196*0b57cec5SDimitry Andric void RegisterMethods<SBLineEntry>(Registry &R) {
197*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, ());
198*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &));
199*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(const lldb::SBLineEntry &,
200*0b57cec5SDimitry Andric                        SBLineEntry, operator=,(const lldb::SBLineEntry &));
201*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetStartAddress,
202*0b57cec5SDimitry Andric                              ());
203*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetEndAddress, ());
204*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, IsValid, ());
205*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, operator bool, ());
206*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBLineEntry, GetFileSpec, ());
207*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetLine, ());
208*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetColumn, ());
209*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec));
210*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBLineEntry, SetLine, (uint32_t));
211*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBLineEntry, SetColumn, (uint32_t));
212*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(
213*0b57cec5SDimitry Andric       bool, SBLineEntry, operator==,(const lldb::SBLineEntry &));
214*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(
215*0b57cec5SDimitry Andric       bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &));
216*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &));
217*0b57cec5SDimitry Andric }
218*0b57cec5SDimitry Andric 
219*0b57cec5SDimitry Andric }
220*0b57cec5SDimitry Andric }
221