blob: 6b1241284339bdfc7ffa076e77cac8dd7bed0f8a [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBLineEntry.h"
Jonas Devliegherebaf56642019-03-06 00:06:00 +000010#include "SBReproducerPrivate.h"
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000011#include "Utils.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Zachary Turner8d48cd62017-03-22 17:33:23 +000013#include "lldb/Host/PosixApi.h"
Greg Claytoncfd1ace2010-10-31 03:01:06 +000014#include "lldb/Symbol/LineEntry.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000015#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000016#include "lldb/Utility/StreamString.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000018#include <limits.h>
19
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020using namespace lldb;
Caroline Ticeceb6b132010-10-26 03:11:13 +000021using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
Jonas Devliegherebaf56642019-03-06 00:06:00 +000023SBLineEntry::SBLineEntry() : m_opaque_up() {
24 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBLineEntry);
25}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026
Jonas Devlieghered5b44032019-02-13 06:25:41 +000027SBLineEntry::SBLineEntry(const SBLineEntry &rhs) : m_opaque_up() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000028 LLDB_RECORD_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &), rhs);
29
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000030 m_opaque_up = clone(rhs.m_opaque_up);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031}
32
Kate Stoneb9c1b512016-09-06 20:57:50 +000033SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr)
Jonas Devlieghered5b44032019-02-13 06:25:41 +000034 : m_opaque_up() {
Kate Stoneb9c1b512016-09-06 20:57:50 +000035 if (lldb_object_ptr)
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000036 m_opaque_up = llvm::make_unique<LineEntry>(*lldb_object_ptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +000037}
38
39const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000040 LLDB_RECORD_METHOD(const lldb::SBLineEntry &,
41 SBLineEntry, operator=,(const lldb::SBLineEntry &), rhs);
42
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000043 if (this != &rhs)
44 m_opaque_up = clone(rhs.m_opaque_up);
Kate Stoneb9c1b512016-09-06 20:57:50 +000045 return *this;
Greg Clayton8f7180b2011-09-26 07:11:27 +000046}
47
Kate Stoneb9c1b512016-09-06 20:57:50 +000048void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) {
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000049 m_opaque_up = llvm::make_unique<LineEntry>(lldb_object_ref);
Greg Clayton8f7180b2011-09-26 07:11:27 +000050}
51
Kate Stoneb9c1b512016-09-06 20:57:50 +000052SBLineEntry::~SBLineEntry() {}
Greg Clayton8f7180b2011-09-26 07:11:27 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054SBAddress SBLineEntry::GetStartAddress() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000055 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry,
56 GetStartAddress);
57
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 SBAddress sb_address;
Jonas Devlieghered5b44032019-02-13 06:25:41 +000059 if (m_opaque_up)
60 sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress());
Greg Clayton8f7180b2011-09-26 07:11:27 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
63 if (log) {
64 StreamString sstr;
65 const Address *addr = sb_address.get();
66 if (addr)
67 addr->Dump(&sstr, NULL, Address::DumpStyleModuleWithFileAddress,
68 Address::DumpStyleInvalid, 4);
69 log->Printf("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s",
Jonas Devlieghered5b44032019-02-13 06:25:41 +000070 static_cast<void *>(m_opaque_up.get()),
Kate Stoneb9c1b512016-09-06 20:57:50 +000071 static_cast<void *>(sb_address.get()), sstr.GetData());
72 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073
Jonas Devliegherebaf56642019-03-06 00:06:00 +000074 return LLDB_RECORD_RESULT(sb_address);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075}
76
Kate Stoneb9c1b512016-09-06 20:57:50 +000077SBAddress SBLineEntry::GetEndAddress() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000078 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, GetEndAddress);
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 SBAddress sb_address;
Jonas Devlieghered5b44032019-02-13 06:25:41 +000081 if (m_opaque_up) {
82 sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress());
83 sb_address.OffsetAddress(m_opaque_up->range.GetByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 }
85 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
86 if (log) {
87 StreamString sstr;
88 const Address *addr = sb_address.get();
89 if (addr)
90 addr->Dump(&sstr, NULL, Address::DumpStyleModuleWithFileAddress,
91 Address::DumpStyleInvalid, 4);
92 log->Printf("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s",
Jonas Devlieghered5b44032019-02-13 06:25:41 +000093 static_cast<void *>(m_opaque_up.get()),
Kate Stoneb9c1b512016-09-06 20:57:50 +000094 static_cast<void *>(sb_address.get()), sstr.GetData());
95 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +000096 return LLDB_RECORD_RESULT(sb_address);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097}
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099bool SBLineEntry::IsValid() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000100 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, IsValid);
101
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000102 return m_opaque_up.get() && m_opaque_up->IsValid();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103}
104
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105SBFileSpec SBLineEntry::GetFileSpec() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000106 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBLineEntry, GetFileSpec);
107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
109
110 SBFileSpec sb_file_spec;
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000111 if (m_opaque_up.get() && m_opaque_up->file)
112 sb_file_spec.SetFileSpec(m_opaque_up->file);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113
114 if (log) {
115 SBStream sstr;
116 sb_file_spec.GetDescription(sstr);
117 log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000118 static_cast<void *>(m_opaque_up.get()),
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
120 }
121
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000122 return LLDB_RECORD_RESULT(sb_file_spec);
Greg Clayton8f7180b2011-09-26 07:11:27 +0000123}
124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125uint32_t SBLineEntry::GetLine() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000126 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetLine);
127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
129
130 uint32_t line = 0;
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000131 if (m_opaque_up)
132 line = m_opaque_up->line;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133
134 if (log)
135 log->Printf("SBLineEntry(%p)::GetLine () => %u",
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000136 static_cast<void *>(m_opaque_up.get()), line);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137
138 return line;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000139}
140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141uint32_t SBLineEntry::GetColumn() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000142 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetColumn);
143
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000144 if (m_opaque_up)
145 return m_opaque_up->column;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 return 0;
Caroline Ticedde9cff2010-09-20 05:20:02 +0000147}
Caroline Tice750cd172010-10-26 23:49:36 +0000148
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000150 LLDB_RECORD_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec),
151 filespec);
152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 if (filespec.IsValid())
154 ref().file = filespec.ref();
155 else
156 ref().file.Clear();
Caroline Tice750cd172010-10-26 23:49:36 +0000157}
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000158void SBLineEntry::SetLine(uint32_t line) {
159 LLDB_RECORD_METHOD(void, SBLineEntry, SetLine, (uint32_t), line);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000161 ref().line = line;
162}
163
164void SBLineEntry::SetColumn(uint32_t column) {
165 LLDB_RECORD_METHOD(void, SBLineEntry, SetColumn, (uint32_t), column);
166
167 ref().line = column;
168}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169
170bool SBLineEntry::operator==(const SBLineEntry &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000171 LLDB_RECORD_METHOD_CONST(
172 bool, SBLineEntry, operator==,(const lldb::SBLineEntry &), rhs);
173
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000174 lldb_private::LineEntry *lhs_ptr = m_opaque_up.get();
175 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176
177 if (lhs_ptr && rhs_ptr)
178 return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) == 0;
179
180 return lhs_ptr == rhs_ptr;
181}
182
183bool SBLineEntry::operator!=(const SBLineEntry &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000184 LLDB_RECORD_METHOD_CONST(
185 bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &), rhs);
186
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000187 lldb_private::LineEntry *lhs_ptr = m_opaque_up.get();
188 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189
190 if (lhs_ptr && rhs_ptr)
191 return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) != 0;
192
193 return lhs_ptr != rhs_ptr;
194}
195
196const lldb_private::LineEntry *SBLineEntry::operator->() const {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000197 return m_opaque_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198}
199
200lldb_private::LineEntry &SBLineEntry::ref() {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000201 if (m_opaque_up == NULL)
202 m_opaque_up.reset(new lldb_private::LineEntry());
203 return *m_opaque_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204}
205
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000206const lldb_private::LineEntry &SBLineEntry::ref() const { return *m_opaque_up; }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207
208bool SBLineEntry::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000209 LLDB_RECORD_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &),
210 description);
211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212 Stream &strm = description.ref();
213
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000214 if (m_opaque_up) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 char file_path[PATH_MAX * 2];
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000216 m_opaque_up->file.GetPath(file_path, sizeof(file_path));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217 strm.Printf("%s:%u", file_path, GetLine());
218 if (GetColumn() > 0)
219 strm.Printf(":%u", GetColumn());
220 } else
221 strm.PutCString("No value");
222
223 return true;
224}
225
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000226lldb_private::LineEntry *SBLineEntry::get() { return m_opaque_up.get(); }