blob: 971f46e34566c087a9b3081598783386be69ed20 [file] [log] [blame]
Zachary Turner8d48cd62017-03-22 17:33:23 +00001//===-- SBDeclaration.cpp ----------------------------------------*- C++-*-===//
Enrico Granata10de0902012-10-10 22:54:17 +00002//
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
Enrico Granata10de0902012-10-10 22:54:17 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBDeclaration.h"
Jonas Devliegherebaf56642019-03-06 00:06:00 +000010#include "SBReproducerPrivate.h"
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000011#include "Utils.h"
Enrico Granata10de0902012-10-10 22:54:17 +000012#include "lldb/API/SBStream.h"
Zachary Turner8d48cd62017-03-22 17:33:23 +000013#include "lldb/Host/PosixApi.h"
Enrico Granata10de0902012-10-10 22:54:17 +000014#include "lldb/Symbol/Declaration.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/Stream.h"
Enrico Granata10de0902012-10-10 22:54:17 +000017
Greg Claytondf3df252012-10-12 16:23:23 +000018#include <limits.h>
19
Enrico Granata10de0902012-10-10 22:54:17 +000020using namespace lldb;
21using namespace lldb_private;
22
Jonas Devliegherebaf56642019-03-06 00:06:00 +000023SBDeclaration::SBDeclaration() : m_opaque_up() {
24 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBDeclaration);
25}
Enrico Granata10de0902012-10-10 22:54:17 +000026
Jonas Devlieghered5b44032019-02-13 06:25:41 +000027SBDeclaration::SBDeclaration(const SBDeclaration &rhs) : m_opaque_up() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000028 LLDB_RECORD_CONSTRUCTOR(SBDeclaration, (const lldb::SBDeclaration &), rhs);
29
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000030 m_opaque_up = clone(rhs.m_opaque_up);
Enrico Granata10de0902012-10-10 22:54:17 +000031}
32
Kate Stoneb9c1b512016-09-06 20:57:50 +000033SBDeclaration::SBDeclaration(const lldb_private::Declaration *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<Declaration>(*lldb_object_ptr);
Kate Stoneb9c1b512016-09-06 20:57:50 +000037}
38
39const SBDeclaration &SBDeclaration::operator=(const SBDeclaration &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000040 LLDB_RECORD_METHOD(const lldb::SBDeclaration &,
41 SBDeclaration, operator=,(const lldb::SBDeclaration &),
42 rhs);
43
Jonas Devliegherebd4bf822019-03-06 00:05:55 +000044 if (this != &rhs)
45 m_opaque_up = clone(rhs.m_opaque_up);
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 return *this;
Enrico Granata10de0902012-10-10 22:54:17 +000047}
48
Kate Stoneb9c1b512016-09-06 20:57:50 +000049void SBDeclaration::SetDeclaration(
50 const lldb_private::Declaration &lldb_object_ref) {
51 ref() = lldb_object_ref;
Enrico Granata10de0902012-10-10 22:54:17 +000052}
53
Kate Stoneb9c1b512016-09-06 20:57:50 +000054SBDeclaration::~SBDeclaration() {}
Enrico Granata10de0902012-10-10 22:54:17 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056bool SBDeclaration::IsValid() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000057 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBDeclaration, IsValid);
58
Jonas Devlieghered5b44032019-02-13 06:25:41 +000059 return m_opaque_up.get() && m_opaque_up->IsValid();
Enrico Granata10de0902012-10-10 22:54:17 +000060}
61
Kate Stoneb9c1b512016-09-06 20:57:50 +000062SBFileSpec SBDeclaration::GetFileSpec() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000063 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBDeclaration,
64 GetFileSpec);
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
67
68 SBFileSpec sb_file_spec;
Jonas Devlieghered5b44032019-02-13 06:25:41 +000069 if (m_opaque_up.get() && m_opaque_up->GetFile())
70 sb_file_spec.SetFileSpec(m_opaque_up->GetFile());
Kate Stoneb9c1b512016-09-06 20:57:50 +000071
72 if (log) {
73 SBStream sstr;
74 sb_file_spec.GetDescription(sstr);
75 log->Printf("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s",
Jonas Devlieghered5b44032019-02-13 06:25:41 +000076 static_cast<void *>(m_opaque_up.get()),
Kate Stoneb9c1b512016-09-06 20:57:50 +000077 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
78 }
79
Jonas Devliegherebaf56642019-03-06 00:06:00 +000080 return LLDB_RECORD_RESULT(sb_file_spec);
Enrico Granata10de0902012-10-10 22:54:17 +000081}
82
Kate Stoneb9c1b512016-09-06 20:57:50 +000083uint32_t SBDeclaration::GetLine() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000084 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetLine);
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
87
88 uint32_t line = 0;
Jonas Devlieghered5b44032019-02-13 06:25:41 +000089 if (m_opaque_up)
90 line = m_opaque_up->GetLine();
Kate Stoneb9c1b512016-09-06 20:57:50 +000091
92 if (log)
93 log->Printf("SBLineEntry(%p)::GetLine () => %u",
Jonas Devlieghered5b44032019-02-13 06:25:41 +000094 static_cast<void *>(m_opaque_up.get()), line);
Kate Stoneb9c1b512016-09-06 20:57:50 +000095
96 return line;
Enrico Granata10de0902012-10-10 22:54:17 +000097}
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099uint32_t SBDeclaration::GetColumn() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000100 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBDeclaration, GetColumn);
101
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000102 if (m_opaque_up)
103 return m_opaque_up->GetColumn();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104 return 0;
Enrico Granata10de0902012-10-10 22:54:17 +0000105}
106
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107void SBDeclaration::SetFileSpec(lldb::SBFileSpec filespec) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000108 LLDB_RECORD_METHOD(void, SBDeclaration, SetFileSpec, (lldb::SBFileSpec),
109 filespec);
110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111 if (filespec.IsValid())
112 ref().SetFile(filespec.ref());
113 else
114 ref().SetFile(FileSpec());
115}
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000116void SBDeclaration::SetLine(uint32_t line) {
117 LLDB_RECORD_METHOD(void, SBDeclaration, SetLine, (uint32_t), line);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000119 ref().SetLine(line);
120}
121
122void SBDeclaration::SetColumn(uint32_t column) {
123 LLDB_RECORD_METHOD(void, SBDeclaration, SetColumn, (uint32_t), column);
124
125 ref().SetColumn(column);
126}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127
128bool SBDeclaration::operator==(const SBDeclaration &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000129 LLDB_RECORD_METHOD_CONST(
130 bool, SBDeclaration, operator==,(const lldb::SBDeclaration &), rhs);
131
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000132 lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
133 lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134
135 if (lhs_ptr && rhs_ptr)
136 return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) == 0;
137
138 return lhs_ptr == rhs_ptr;
Enrico Granata10de0902012-10-10 22:54:17 +0000139}
140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141bool SBDeclaration::operator!=(const SBDeclaration &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000142 LLDB_RECORD_METHOD_CONST(
143 bool, SBDeclaration, operator!=,(const lldb::SBDeclaration &), rhs);
144
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000145 lldb_private::Declaration *lhs_ptr = m_opaque_up.get();
146 lldb_private::Declaration *rhs_ptr = rhs.m_opaque_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147
148 if (lhs_ptr && rhs_ptr)
149 return lldb_private::Declaration::Compare(*lhs_ptr, *rhs_ptr) != 0;
150
151 return lhs_ptr != rhs_ptr;
Enrico Granata10de0902012-10-10 22:54:17 +0000152}
153
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154const lldb_private::Declaration *SBDeclaration::operator->() const {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000155 return m_opaque_up.get();
Enrico Granata10de0902012-10-10 22:54:17 +0000156}
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157
158lldb_private::Declaration &SBDeclaration::ref() {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000159 if (m_opaque_up == NULL)
160 m_opaque_up.reset(new lldb_private::Declaration());
161 return *m_opaque_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162}
163
164const lldb_private::Declaration &SBDeclaration::ref() const {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000165 return *m_opaque_up;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166}
167
168bool SBDeclaration::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000169 LLDB_RECORD_METHOD(bool, SBDeclaration, GetDescription, (lldb::SBStream &),
170 description);
171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 Stream &strm = description.ref();
173
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000174 if (m_opaque_up) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175 char file_path[PATH_MAX * 2];
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000176 m_opaque_up->GetFile().GetPath(file_path, sizeof(file_path));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000177 strm.Printf("%s:%u", file_path, GetLine());
178 if (GetColumn() > 0)
179 strm.Printf(":%u", GetColumn());
180 } else
181 strm.PutCString("No value");
182
183 return true;
184}
185
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000186lldb_private::Declaration *SBDeclaration::get() { return m_opaque_up.get(); }