1254721Semaste//===-- SBSymbol.cpp --------------------------------------------*- C++ -*-===//
2254721Semaste//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6254721Semaste//
7254721Semaste//===----------------------------------------------------------------------===//
8254721Semaste
9254721Semaste#include "lldb/API/SBSymbol.h"
10353358Sdim#include "SBReproducerPrivate.h"
11254721Semaste#include "lldb/API/SBStream.h"
12254721Semaste#include "lldb/Core/Disassembler.h"
13254721Semaste#include "lldb/Core/Module.h"
14254721Semaste#include "lldb/Symbol/Symbol.h"
15254721Semaste#include "lldb/Target/ExecutionContext.h"
16254721Semaste#include "lldb/Target/Target.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21353358SdimSBSymbol::SBSymbol() : m_opaque_ptr(nullptr) {
22353358Sdim  LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBSymbol);
23353358Sdim}
24254721Semaste
25314564SdimSBSymbol::SBSymbol(lldb_private::Symbol *lldb_object_ptr)
26314564Sdim    : m_opaque_ptr(lldb_object_ptr) {}
27254721Semaste
28353358SdimSBSymbol::SBSymbol(const lldb::SBSymbol &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
29353358Sdim  LLDB_RECORD_CONSTRUCTOR(SBSymbol, (const lldb::SBSymbol &), rhs);
30353358Sdim}
31254721Semaste
32314564Sdimconst SBSymbol &SBSymbol::operator=(const SBSymbol &rhs) {
33353358Sdim  LLDB_RECORD_METHOD(const lldb::SBSymbol &,
34353358Sdim                     SBSymbol, operator=,(const lldb::SBSymbol &), rhs);
35353358Sdim
36314564Sdim  m_opaque_ptr = rhs.m_opaque_ptr;
37353358Sdim  return LLDB_RECORD_RESULT(*this);
38254721Semaste}
39254721Semaste
40353358SdimSBSymbol::~SBSymbol() { m_opaque_ptr = nullptr; }
41254721Semaste
42314564Sdimvoid SBSymbol::SetSymbol(lldb_private::Symbol *lldb_object_ptr) {
43314564Sdim  m_opaque_ptr = lldb_object_ptr;
44254721Semaste}
45254721Semaste
46353358Sdimbool SBSymbol::IsValid() const {
47353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSymbol, IsValid);
48353358Sdim  return this->operator bool();
49353358Sdim}
50353358SdimSBSymbol::operator bool() const {
51353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSymbol, operator bool);
52254721Semaste
53353358Sdim  return m_opaque_ptr != nullptr;
54353358Sdim}
55353358Sdim
56314564Sdimconst char *SBSymbol::GetName() const {
57353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetName);
58353358Sdim
59353358Sdim  const char *name = nullptr;
60314564Sdim  if (m_opaque_ptr)
61314564Sdim    name = m_opaque_ptr->GetName().AsCString();
62254721Semaste
63314564Sdim  return name;
64254721Semaste}
65254721Semaste
66314564Sdimconst char *SBSymbol::GetDisplayName() const {
67353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetDisplayName);
68353358Sdim
69353358Sdim  const char *name = nullptr;
70314564Sdim  if (m_opaque_ptr)
71314564Sdim    name = m_opaque_ptr->GetMangled()
72314564Sdim               .GetDisplayDemangledName(m_opaque_ptr->GetLanguage())
73314564Sdim               .AsCString();
74314564Sdim
75314564Sdim  return name;
76288943Sdim}
77288943Sdim
78314564Sdimconst char *SBSymbol::GetMangledName() const {
79353358Sdim  LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetMangledName);
80353358Sdim
81353358Sdim  const char *name = nullptr;
82314564Sdim  if (m_opaque_ptr)
83314564Sdim    name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
84314564Sdim  return name;
85254721Semaste}
86254721Semaste
87314564Sdimbool SBSymbol::operator==(const SBSymbol &rhs) const {
88353358Sdim  LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator==,(const lldb::SBSymbol &),
89353358Sdim                           rhs);
90353358Sdim
91314564Sdim  return m_opaque_ptr == rhs.m_opaque_ptr;
92254721Semaste}
93254721Semaste
94314564Sdimbool SBSymbol::operator!=(const SBSymbol &rhs) const {
95353358Sdim  LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator!=,(const lldb::SBSymbol &),
96353358Sdim                           rhs);
97353358Sdim
98314564Sdim  return m_opaque_ptr != rhs.m_opaque_ptr;
99254721Semaste}
100254721Semaste
101314564Sdimbool SBSymbol::GetDescription(SBStream &description) {
102353358Sdim  LLDB_RECORD_METHOD(bool, SBSymbol, GetDescription, (lldb::SBStream &),
103353358Sdim                     description);
104353358Sdim
105314564Sdim  Stream &strm = description.ref();
106254721Semaste
107314564Sdim  if (m_opaque_ptr) {
108353358Sdim    m_opaque_ptr->GetDescription(&strm, lldb::eDescriptionLevelFull, nullptr);
109314564Sdim  } else
110314564Sdim    strm.PutCString("No value");
111314564Sdim
112314564Sdim  return true;
113254721Semaste}
114254721Semaste
115314564SdimSBInstructionList SBSymbol::GetInstructions(SBTarget target) {
116353358Sdim  LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
117353358Sdim                     (lldb::SBTarget), target);
118353358Sdim
119353358Sdim  return LLDB_RECORD_RESULT(GetInstructions(target, nullptr));
120254721Semaste}
121254721Semaste
122314564SdimSBInstructionList SBSymbol::GetInstructions(SBTarget target,
123314564Sdim                                            const char *flavor_string) {
124353358Sdim  LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
125353358Sdim                     (lldb::SBTarget, const char *), target, flavor_string);
126353358Sdim
127314564Sdim  SBInstructionList sb_instructions;
128314564Sdim  if (m_opaque_ptr) {
129314564Sdim    ExecutionContext exe_ctx;
130314564Sdim    TargetSP target_sp(target.GetSP());
131314564Sdim    std::unique_lock<std::recursive_mutex> lock;
132314564Sdim    if (target_sp) {
133314564Sdim      lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
134309124Sdim
135314564Sdim      target_sp->CalculateExecutionContext(exe_ctx);
136254721Semaste    }
137314564Sdim    if (m_opaque_ptr->ValueIsAddress()) {
138314564Sdim      const Address &symbol_addr = m_opaque_ptr->GetAddressRef();
139314564Sdim      ModuleSP module_sp = symbol_addr.GetModule();
140314564Sdim      if (module_sp) {
141314564Sdim        AddressRange symbol_range(symbol_addr, m_opaque_ptr->GetByteSize());
142314564Sdim        const bool prefer_file_cache = false;
143314564Sdim        sb_instructions.SetDisassembler(Disassembler::DisassembleRange(
144353358Sdim            module_sp->GetArchitecture(), nullptr, flavor_string, exe_ctx,
145314564Sdim            symbol_range, prefer_file_cache));
146314564Sdim      }
147314564Sdim    }
148314564Sdim  }
149353358Sdim  return LLDB_RECORD_RESULT(sb_instructions);
150254721Semaste}
151254721Semaste
152314564Sdimlldb_private::Symbol *SBSymbol::get() { return m_opaque_ptr; }
153254721Semaste
154314564Sdimvoid SBSymbol::reset(lldb_private::Symbol *symbol) { m_opaque_ptr = symbol; }
155254721Semaste
156314564SdimSBAddress SBSymbol::GetStartAddress() {
157353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetStartAddress);
158353358Sdim
159314564Sdim  SBAddress addr;
160314564Sdim  if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
161314564Sdim    addr.SetAddress(&m_opaque_ptr->GetAddressRef());
162314564Sdim  }
163353358Sdim  return LLDB_RECORD_RESULT(addr);
164254721Semaste}
165254721Semaste
166314564SdimSBAddress SBSymbol::GetEndAddress() {
167353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetEndAddress);
168353358Sdim
169314564Sdim  SBAddress addr;
170314564Sdim  if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
171314564Sdim    lldb::addr_t range_size = m_opaque_ptr->GetByteSize();
172314564Sdim    if (range_size > 0) {
173314564Sdim      addr.SetAddress(&m_opaque_ptr->GetAddressRef());
174314564Sdim      addr->Slide(m_opaque_ptr->GetByteSize());
175254721Semaste    }
176314564Sdim  }
177353358Sdim  return LLDB_RECORD_RESULT(addr);
178254721Semaste}
179254721Semaste
180314564Sdimuint32_t SBSymbol::GetPrologueByteSize() {
181353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBSymbol, GetPrologueByteSize);
182353358Sdim
183314564Sdim  if (m_opaque_ptr)
184314564Sdim    return m_opaque_ptr->GetPrologueByteSize();
185314564Sdim  return 0;
186254721Semaste}
187254721Semaste
188314564SdimSymbolType SBSymbol::GetType() {
189353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(lldb::SymbolType, SBSymbol, GetType);
190353358Sdim
191314564Sdim  if (m_opaque_ptr)
192314564Sdim    return m_opaque_ptr->GetType();
193314564Sdim  return eSymbolTypeInvalid;
194254721Semaste}
195254721Semaste
196314564Sdimbool SBSymbol::IsExternal() {
197353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsExternal);
198353358Sdim
199314564Sdim  if (m_opaque_ptr)
200314564Sdim    return m_opaque_ptr->IsExternal();
201314564Sdim  return false;
202254721Semaste}
203254721Semaste
204314564Sdimbool SBSymbol::IsSynthetic() {
205353358Sdim  LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsSynthetic);
206353358Sdim
207314564Sdim  if (m_opaque_ptr)
208314564Sdim    return m_opaque_ptr->IsSynthetic();
209314564Sdim  return false;
210254721Semaste}
211353358Sdim
212353358Sdimnamespace lldb_private {
213353358Sdimnamespace repro {
214353358Sdim
215353358Sdimtemplate <>
216353358Sdimvoid RegisterMethods<SBSymbol>(Registry &R) {
217353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBSymbol, ());
218353358Sdim  LLDB_REGISTER_CONSTRUCTOR(SBSymbol, (const lldb::SBSymbol &));
219353358Sdim  LLDB_REGISTER_METHOD(const lldb::SBSymbol &,
220353358Sdim                       SBSymbol, operator=,(const lldb::SBSymbol &));
221353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBSymbol, IsValid, ());
222353358Sdim  LLDB_REGISTER_METHOD_CONST(bool, SBSymbol, operator bool, ());
223353358Sdim  LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetName, ());
224353358Sdim  LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetDisplayName, ());
225353358Sdim  LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetMangledName, ());
226353358Sdim  LLDB_REGISTER_METHOD_CONST(bool,
227353358Sdim                             SBSymbol, operator==,(const lldb::SBSymbol &));
228353358Sdim  LLDB_REGISTER_METHOD_CONST(bool,
229353358Sdim                             SBSymbol, operator!=,(const lldb::SBSymbol &));
230353358Sdim  LLDB_REGISTER_METHOD(bool, SBSymbol, GetDescription, (lldb::SBStream &));
231353358Sdim  LLDB_REGISTER_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
232353358Sdim                       (lldb::SBTarget));
233353358Sdim  LLDB_REGISTER_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
234353358Sdim                       (lldb::SBTarget, const char *));
235353358Sdim  LLDB_REGISTER_METHOD(lldb::SBAddress, SBSymbol, GetStartAddress, ());
236353358Sdim  LLDB_REGISTER_METHOD(lldb::SBAddress, SBSymbol, GetEndAddress, ());
237353358Sdim  LLDB_REGISTER_METHOD(uint32_t, SBSymbol, GetPrologueByteSize, ());
238353358Sdim  LLDB_REGISTER_METHOD(lldb::SymbolType, SBSymbol, GetType, ());
239353358Sdim  LLDB_REGISTER_METHOD(bool, SBSymbol, IsExternal, ());
240353358Sdim  LLDB_REGISTER_METHOD(bool, SBSymbol, IsSynthetic, ());
241353358Sdim}
242353358Sdim
243353358Sdim}
244353358Sdim}
245