blob: 719f9e8c543857eebbaee56c9bbc49df7df88af1 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBSymbol.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/SBSymbol.h"
Jonas Devliegherebaf56642019-03-06 00:06:00 +000010#include "SBReproducerPrivate.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Greg Clayton1d273162010-10-06 03:09:58 +000012#include "lldb/Core/Disassembler.h"
13#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "lldb/Symbol/Symbol.h"
Greg Clayton1d273162010-10-06 03:09:58 +000015#include "lldb/Target/ExecutionContext.h"
16#include "lldb/Target/Target.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000017#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018
19using namespace lldb;
Greg Clayton1d273162010-10-06 03:09:58 +000020using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
Jonas Devliegherebaf56642019-03-06 00:06:00 +000022SBSymbol::SBSymbol() : m_opaque_ptr(NULL) {
23 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBSymbol);
24}
Kate Stoneb9c1b512016-09-06 20:57:50 +000025
26SBSymbol::SBSymbol(lldb_private::Symbol *lldb_object_ptr)
27 : m_opaque_ptr(lldb_object_ptr) {}
28
Jonas Devliegherebaf56642019-03-06 00:06:00 +000029SBSymbol::SBSymbol(const lldb::SBSymbol &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
30 LLDB_RECORD_CONSTRUCTOR(SBSymbol, (const lldb::SBSymbol &), rhs);
31}
Kate Stoneb9c1b512016-09-06 20:57:50 +000032
33const SBSymbol &SBSymbol::operator=(const SBSymbol &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000034 LLDB_RECORD_METHOD(const lldb::SBSymbol &,
35 SBSymbol, operator=,(const lldb::SBSymbol &), rhs);
36
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 m_opaque_ptr = rhs.m_opaque_ptr;
38 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039}
40
Kate Stoneb9c1b512016-09-06 20:57:50 +000041SBSymbol::~SBSymbol() { m_opaque_ptr = NULL; }
42
43void SBSymbol::SetSymbol(lldb_private::Symbol *lldb_object_ptr) {
44 m_opaque_ptr = lldb_object_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
Jonas Devliegherebaf56642019-03-06 00:06:00 +000047bool SBSymbol::IsValid() const {
48 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSymbol, IsValid);
49
50 return m_opaque_ptr != NULL;
51}
Kate Stoneb9c1b512016-09-06 20:57:50 +000052
53const char *SBSymbol::GetName() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000054 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetName);
55
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 const char *name = NULL;
57 if (m_opaque_ptr)
58 name = m_opaque_ptr->GetName().AsCString();
59
60 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
61 if (log)
62 log->Printf("SBSymbol(%p)::GetName () => \"%s\"",
63 static_cast<void *>(m_opaque_ptr), name ? name : "");
64 return name;
Greg Claytonefabb122010-11-05 23:17:00 +000065}
66
Kate Stoneb9c1b512016-09-06 20:57:50 +000067const char *SBSymbol::GetDisplayName() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000068 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetDisplayName);
69
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 const char *name = NULL;
71 if (m_opaque_ptr)
72 name = m_opaque_ptr->GetMangled()
73 .GetDisplayDemangledName(m_opaque_ptr->GetLanguage())
74 .AsCString();
75
76 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
77 if (log)
78 log->Printf("SBSymbol(%p)::GetDisplayName () => \"%s\"",
79 static_cast<void *>(m_opaque_ptr), name ? name : "");
80 return name;
Greg Claytonefabb122010-11-05 23:17:00 +000081}
82
Kate Stoneb9c1b512016-09-06 20:57:50 +000083const char *SBSymbol::GetMangledName() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000084 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetMangledName);
85
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 const char *name = NULL;
87 if (m_opaque_ptr)
88 name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
89 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
90 if (log)
91 log->Printf("SBSymbol(%p)::GetMangledName () => \"%s\"",
92 static_cast<void *>(m_opaque_ptr), name ? name : "");
93
94 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095}
96
Kate Stoneb9c1b512016-09-06 20:57:50 +000097bool SBSymbol::operator==(const SBSymbol &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000098 LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator==,(const lldb::SBSymbol &),
99 rhs);
100
Kate Stoneb9c1b512016-09-06 20:57:50 +0000101 return m_opaque_ptr == rhs.m_opaque_ptr;
Greg Claytonbbdabce2010-12-07 05:40:31 +0000102}
103
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104bool SBSymbol::operator!=(const SBSymbol &rhs) const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000105 LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator!=,(const lldb::SBSymbol &),
106 rhs);
107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109}
110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111bool SBSymbol::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000112 LLDB_RECORD_METHOD(bool, SBSymbol, GetDescription, (lldb::SBStream &),
113 description);
114
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 Stream &strm = description.ref();
Caroline Tice750cd172010-10-26 23:49:36 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 if (m_opaque_ptr) {
118 m_opaque_ptr->GetDescription(&strm, lldb::eDescriptionLevelFull, NULL);
119 } else
120 strm.PutCString("No value");
121
122 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123}
124
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125SBInstructionList SBSymbol::GetInstructions(SBTarget target) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000126 LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
127 (lldb::SBTarget), target);
128
129 return LLDB_RECORD_RESULT(GetInstructions(target, NULL));
Enrico Granatac1f705c2015-07-06 18:28:46 +0000130}
131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132SBInstructionList SBSymbol::GetInstructions(SBTarget target,
133 const char *flavor_string) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000134 LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions,
135 (lldb::SBTarget, const char *), target, flavor_string);
136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 SBInstructionList sb_instructions;
138 if (m_opaque_ptr) {
139 ExecutionContext exe_ctx;
140 TargetSP target_sp(target.GetSP());
141 std::unique_lock<std::recursive_mutex> lock;
142 if (target_sp) {
143 lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
Greg Clayton48381312010-10-30 04:51:46 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 target_sp->CalculateExecutionContext(exe_ctx);
Caroline Ticedde9cff2010-09-20 05:20:02 +0000146 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 if (m_opaque_ptr->ValueIsAddress()) {
148 const Address &symbol_addr = m_opaque_ptr->GetAddressRef();
149 ModuleSP module_sp = symbol_addr.GetModule();
150 if (module_sp) {
151 AddressRange symbol_range(symbol_addr, m_opaque_ptr->GetByteSize());
152 const bool prefer_file_cache = false;
153 sb_instructions.SetDisassembler(Disassembler::DisassembleRange(
154 module_sp->GetArchitecture(), NULL, flavor_string, exe_ctx,
155 symbol_range, prefer_file_cache));
156 }
Greg Clayton1d273162010-10-06 03:09:58 +0000157 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000159 return LLDB_RECORD_RESULT(sb_instructions);
Greg Clayton1d273162010-10-06 03:09:58 +0000160}
161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162lldb_private::Symbol *SBSymbol::get() { return m_opaque_ptr; }
163
164void SBSymbol::reset(lldb_private::Symbol *symbol) { m_opaque_ptr = symbol; }
165
166SBAddress SBSymbol::GetStartAddress() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000167 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetStartAddress);
168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 SBAddress addr;
170 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
171 addr.SetAddress(&m_opaque_ptr->GetAddressRef());
172 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000173 return LLDB_RECORD_RESULT(addr);
Caroline Tice750cd172010-10-26 23:49:36 +0000174}
Greg Clayton72eff182010-12-14 04:58:53 +0000175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176SBAddress SBSymbol::GetEndAddress() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000177 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetEndAddress);
178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179 SBAddress addr;
180 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
181 lldb::addr_t range_size = m_opaque_ptr->GetByteSize();
182 if (range_size > 0) {
183 addr.SetAddress(&m_opaque_ptr->GetAddressRef());
184 addr->Slide(m_opaque_ptr->GetByteSize());
Greg Clayton93d00df2011-03-02 23:01:18 +0000185 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000187 return LLDB_RECORD_RESULT(addr);
Greg Clayton93d00df2011-03-02 23:01:18 +0000188}
189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190uint32_t SBSymbol::GetPrologueByteSize() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000191 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBSymbol, GetPrologueByteSize);
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193 if (m_opaque_ptr)
194 return m_opaque_ptr->GetPrologueByteSize();
195 return 0;
Greg Clayton93d00df2011-03-02 23:01:18 +0000196}
197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198SymbolType SBSymbol::GetType() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000199 LLDB_RECORD_METHOD_NO_ARGS(lldb::SymbolType, SBSymbol, GetType);
200
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201 if (m_opaque_ptr)
202 return m_opaque_ptr->GetType();
203 return eSymbolTypeInvalid;
Greg Clayton93d00df2011-03-02 23:01:18 +0000204}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000205
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206bool SBSymbol::IsExternal() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000207 LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsExternal);
208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209 if (m_opaque_ptr)
210 return m_opaque_ptr->IsExternal();
211 return false;
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000212}
Greg Clayton74ae3f52012-04-02 20:08:08 +0000213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214bool SBSymbol::IsSynthetic() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000215 LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsSynthetic);
216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217 if (m_opaque_ptr)
218 return m_opaque_ptr->IsSynthetic();
219 return false;
Greg Clayton74ae3f52012-04-02 20:08:08 +0000220}