blob: 981c9864f44c7cef0f3f3a0b3bbcc0c6f3cf4bed [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"
Caroline Ticedde9cff2010-09-20 05:20:02 +000010#include "lldb/API/SBStream.h"
Greg Clayton1d273162010-10-06 03:09:58 +000011#include "lldb/Core/Disassembler.h"
12#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000013#include "lldb/Symbol/Symbol.h"
Greg Clayton1d273162010-10-06 03:09:58 +000014#include "lldb/Target/ExecutionContext.h"
15#include "lldb/Target/Target.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000016#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
18using namespace lldb;
Greg Clayton1d273162010-10-06 03:09:58 +000019using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020
Kate Stoneb9c1b512016-09-06 20:57:50 +000021SBSymbol::SBSymbol() : m_opaque_ptr(NULL) {}
22
23SBSymbol::SBSymbol(lldb_private::Symbol *lldb_object_ptr)
24 : m_opaque_ptr(lldb_object_ptr) {}
25
26SBSymbol::SBSymbol(const lldb::SBSymbol &rhs)
27 : m_opaque_ptr(rhs.m_opaque_ptr) {}
28
29const SBSymbol &SBSymbol::operator=(const SBSymbol &rhs) {
30 m_opaque_ptr = rhs.m_opaque_ptr;
31 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032}
33
Kate Stoneb9c1b512016-09-06 20:57:50 +000034SBSymbol::~SBSymbol() { m_opaque_ptr = NULL; }
35
36void SBSymbol::SetSymbol(lldb_private::Symbol *lldb_object_ptr) {
37 m_opaque_ptr = lldb_object_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038}
39
Kate Stoneb9c1b512016-09-06 20:57:50 +000040bool SBSymbol::IsValid() const { return m_opaque_ptr != NULL; }
41
42const char *SBSymbol::GetName() const {
43 const char *name = NULL;
44 if (m_opaque_ptr)
45 name = m_opaque_ptr->GetName().AsCString();
46
47 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
48 if (log)
49 log->Printf("SBSymbol(%p)::GetName () => \"%s\"",
50 static_cast<void *>(m_opaque_ptr), name ? name : "");
51 return name;
Greg Claytonefabb122010-11-05 23:17:00 +000052}
53
Kate Stoneb9c1b512016-09-06 20:57:50 +000054const char *SBSymbol::GetDisplayName() const {
55 const char *name = NULL;
56 if (m_opaque_ptr)
57 name = m_opaque_ptr->GetMangled()
58 .GetDisplayDemangledName(m_opaque_ptr->GetLanguage())
59 .AsCString();
60
61 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
62 if (log)
63 log->Printf("SBSymbol(%p)::GetDisplayName () => \"%s\"",
64 static_cast<void *>(m_opaque_ptr), name ? name : "");
65 return name;
Greg Claytonefabb122010-11-05 23:17:00 +000066}
67
Kate Stoneb9c1b512016-09-06 20:57:50 +000068const char *SBSymbol::GetMangledName() const {
69 const char *name = NULL;
70 if (m_opaque_ptr)
71 name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
72 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
73 if (log)
74 log->Printf("SBSymbol(%p)::GetMangledName () => \"%s\"",
75 static_cast<void *>(m_opaque_ptr), name ? name : "");
76
77 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080bool SBSymbol::operator==(const SBSymbol &rhs) const {
81 return m_opaque_ptr == rhs.m_opaque_ptr;
Greg Claytonbbdabce2010-12-07 05:40:31 +000082}
83
Kate Stoneb9c1b512016-09-06 20:57:50 +000084bool SBSymbol::operator!=(const SBSymbol &rhs) const {
85 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086}
87
Kate Stoneb9c1b512016-09-06 20:57:50 +000088bool SBSymbol::GetDescription(SBStream &description) {
89 Stream &strm = description.ref();
Caroline Tice750cd172010-10-26 23:49:36 +000090
Kate Stoneb9c1b512016-09-06 20:57:50 +000091 if (m_opaque_ptr) {
92 m_opaque_ptr->GetDescription(&strm, lldb::eDescriptionLevelFull, NULL);
93 } else
94 strm.PutCString("No value");
95
96 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000097}
98
Kate Stoneb9c1b512016-09-06 20:57:50 +000099SBInstructionList SBSymbol::GetInstructions(SBTarget target) {
100 return GetInstructions(target, NULL);
Enrico Granatac1f705c2015-07-06 18:28:46 +0000101}
102
Kate Stoneb9c1b512016-09-06 20:57:50 +0000103SBInstructionList SBSymbol::GetInstructions(SBTarget target,
104 const char *flavor_string) {
105 SBInstructionList sb_instructions;
106 if (m_opaque_ptr) {
107 ExecutionContext exe_ctx;
108 TargetSP target_sp(target.GetSP());
109 std::unique_lock<std::recursive_mutex> lock;
110 if (target_sp) {
111 lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
Greg Clayton48381312010-10-30 04:51:46 +0000112
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 target_sp->CalculateExecutionContext(exe_ctx);
Caroline Ticedde9cff2010-09-20 05:20:02 +0000114 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115 if (m_opaque_ptr->ValueIsAddress()) {
116 const Address &symbol_addr = m_opaque_ptr->GetAddressRef();
117 ModuleSP module_sp = symbol_addr.GetModule();
118 if (module_sp) {
119 AddressRange symbol_range(symbol_addr, m_opaque_ptr->GetByteSize());
120 const bool prefer_file_cache = false;
121 sb_instructions.SetDisassembler(Disassembler::DisassembleRange(
122 module_sp->GetArchitecture(), NULL, flavor_string, exe_ctx,
123 symbol_range, prefer_file_cache));
124 }
Greg Clayton1d273162010-10-06 03:09:58 +0000125 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 }
127 return sb_instructions;
Greg Clayton1d273162010-10-06 03:09:58 +0000128}
129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130lldb_private::Symbol *SBSymbol::get() { return m_opaque_ptr; }
131
132void SBSymbol::reset(lldb_private::Symbol *symbol) { m_opaque_ptr = symbol; }
133
134SBAddress SBSymbol::GetStartAddress() {
135 SBAddress addr;
136 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
137 addr.SetAddress(&m_opaque_ptr->GetAddressRef());
138 }
139 return addr;
Caroline Tice750cd172010-10-26 23:49:36 +0000140}
Greg Clayton72eff182010-12-14 04:58:53 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142SBAddress SBSymbol::GetEndAddress() {
143 SBAddress addr;
144 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
145 lldb::addr_t range_size = m_opaque_ptr->GetByteSize();
146 if (range_size > 0) {
147 addr.SetAddress(&m_opaque_ptr->GetAddressRef());
148 addr->Slide(m_opaque_ptr->GetByteSize());
Greg Clayton93d00df2011-03-02 23:01:18 +0000149 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 }
151 return addr;
Greg Clayton93d00df2011-03-02 23:01:18 +0000152}
153
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154uint32_t SBSymbol::GetPrologueByteSize() {
155 if (m_opaque_ptr)
156 return m_opaque_ptr->GetPrologueByteSize();
157 return 0;
Greg Clayton93d00df2011-03-02 23:01:18 +0000158}
159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160SymbolType SBSymbol::GetType() {
161 if (m_opaque_ptr)
162 return m_opaque_ptr->GetType();
163 return eSymbolTypeInvalid;
Greg Clayton93d00df2011-03-02 23:01:18 +0000164}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166bool SBSymbol::IsExternal() {
167 if (m_opaque_ptr)
168 return m_opaque_ptr->IsExternal();
169 return false;
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000170}
Greg Clayton74ae3f52012-04-02 20:08:08 +0000171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172bool SBSymbol::IsSynthetic() {
173 if (m_opaque_ptr)
174 return m_opaque_ptr->IsSynthetic();
175 return false;
Greg Clayton74ae3f52012-04-02 20:08:08 +0000176}