blob: 171bfd84d0c914bb0b8f79851f982da030f386aa [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBSymbol.cpp --------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBSymbol.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"
Caroline Ticeceb6b132010-10-26 03:11:13 +000013#include "lldb/Core/Log.h"
Greg Clayton1d273162010-10-06 03:09:58 +000014#include "lldb/Core/Module.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include "lldb/Symbol/Symbol.h"
Greg Clayton1d273162010-10-06 03:09:58 +000016#include "lldb/Target/ExecutionContext.h"
17#include "lldb/Target/Target.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
22SBSymbol::SBSymbol () :
Greg Clayton66111032010-06-23 01:19:29 +000023 m_opaque_ptr (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000024{
25}
26
27SBSymbol::SBSymbol (lldb_private::Symbol *lldb_object_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000028 m_opaque_ptr (lldb_object_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029{
30}
31
Greg Claytonefabb122010-11-05 23:17:00 +000032SBSymbol::SBSymbol (const lldb::SBSymbol &rhs) :
33 m_opaque_ptr (rhs.m_opaque_ptr)
34{
35}
36
37const SBSymbol &
38SBSymbol::operator = (const SBSymbol &rhs)
39{
40 m_opaque_ptr = rhs.m_opaque_ptr;
41 return *this;
42}
43
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044SBSymbol::~SBSymbol ()
45{
Greg Clayton66111032010-06-23 01:19:29 +000046 m_opaque_ptr = NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047}
48
Greg Claytonbbdabce2010-12-07 05:40:31 +000049void
50SBSymbol::SetSymbol (lldb_private::Symbol *lldb_object_ptr)
51{
52 m_opaque_ptr = lldb_object_ptr;
53}
54
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055bool
56SBSymbol::IsValid () const
57{
Greg Clayton66111032010-06-23 01:19:29 +000058 return m_opaque_ptr != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000059}
60
61const char *
62SBSymbol::GetName() const
63{
Greg Clayton48381312010-10-30 04:51:46 +000064 const char *name = NULL;
Greg Clayton66111032010-06-23 01:19:29 +000065 if (m_opaque_ptr)
Greg Clayton48381312010-10-30 04:51:46 +000066 name = m_opaque_ptr->GetMangled().GetName().AsCString();
Caroline Tice750cd172010-10-26 23:49:36 +000067
Greg Clayton5160ce52013-03-27 23:08:40 +000068 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000069 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000070 log->Printf ("SBSymbol(%p)::GetName () => \"%s\"",
71 static_cast<void*>(m_opaque_ptr), name ? name : "");
Greg Clayton48381312010-10-30 04:51:46 +000072 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073}
74
75const char *
Enrico Granatac1f705c2015-07-06 18:28:46 +000076SBSymbol::GetDisplayName() const
77{
78 const char *name = NULL;
79 if (m_opaque_ptr)
80 name = m_opaque_ptr->GetMangled().GetDisplayDemangledName().AsCString();
81
82 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
83 if (log)
84 log->Printf ("SBSymbol(%p)::GetDisplayName () => \"%s\"",
85 static_cast<void*>(m_opaque_ptr), name ? name : "");
86 return name;
87}
88
89const char *
Chris Lattner30fdc8d2010-06-08 16:52:24 +000090SBSymbol::GetMangledName () const
91{
Greg Clayton48381312010-10-30 04:51:46 +000092 const char *name = NULL;
Greg Clayton66111032010-06-23 01:19:29 +000093 if (m_opaque_ptr)
Greg Clayton48381312010-10-30 04:51:46 +000094 name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
Greg Clayton5160ce52013-03-27 23:08:40 +000095 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton48381312010-10-30 04:51:46 +000096 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +000097 log->Printf ("SBSymbol(%p)::GetMangledName () => \"%s\"",
98 static_cast<void*>(m_opaque_ptr), name ? name : "");
Greg Clayton48381312010-10-30 04:51:46 +000099
100 return name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000101}
102
103
104bool
105SBSymbol::operator == (const SBSymbol &rhs) const
106{
Greg Clayton66111032010-06-23 01:19:29 +0000107 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000108}
109
110bool
111SBSymbol::operator != (const SBSymbol &rhs) const
112{
Greg Clayton66111032010-06-23 01:19:29 +0000113 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000114}
Caroline Ticedde9cff2010-09-20 05:20:02 +0000115
116bool
117SBSymbol::GetDescription (SBStream &description)
118{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000119 Stream &strm = description.ref();
120
Caroline Ticedde9cff2010-09-20 05:20:02 +0000121 if (m_opaque_ptr)
122 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000123 m_opaque_ptr->GetDescription (&strm,
Caroline Ticedac97f32010-09-22 23:01:29 +0000124 lldb::eDescriptionLevelFull, NULL);
Caroline Ticedde9cff2010-09-20 05:20:02 +0000125 }
126 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000127 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +0000128
129 return true;
130}
Greg Clayton1d273162010-10-06 03:09:58 +0000131
Greg Clayton1d273162010-10-06 03:09:58 +0000132SBInstructionList
133SBSymbol::GetInstructions (SBTarget target)
134{
Jim Ingham0f063ba2013-03-02 00:26:47 +0000135 return GetInstructions (target, NULL);
136}
137
138SBInstructionList
139SBSymbol::GetInstructions (SBTarget target, const char *flavor_string)
140{
Greg Clayton1d273162010-10-06 03:09:58 +0000141 SBInstructionList sb_instructions;
142 if (m_opaque_ptr)
143 {
Greg Claytonaf67cec2010-12-20 20:49:23 +0000144 Mutex::Locker api_locker;
Greg Clayton1d273162010-10-06 03:09:58 +0000145 ExecutionContext exe_ctx;
Greg Claytonb9556ac2012-01-30 07:41:31 +0000146 TargetSP target_sp (target.GetSP());
147 if (target_sp)
Greg Claytonaf67cec2010-12-20 20:49:23 +0000148 {
Jim Ingham10ebffa2012-05-04 23:02:50 +0000149 api_locker.Lock (target_sp->GetAPIMutex());
Greg Claytonb9556ac2012-01-30 07:41:31 +0000150 target_sp->CalculateExecutionContext (exe_ctx);
Greg Claytonaf67cec2010-12-20 20:49:23 +0000151 }
Greg Claytone7612132012-03-07 21:03:09 +0000152 if (m_opaque_ptr->ValueIsAddress())
Greg Clayton1d273162010-10-06 03:09:58 +0000153 {
Greg Clayton358cf1e2015-06-25 21:46:34 +0000154 const Address &symbol_addr = m_opaque_ptr->GetAddressRef();
155 ModuleSP module_sp = symbol_addr.GetModule();
Greg Claytone1cd1be2012-01-29 20:56:30 +0000156 if (module_sp)
Greg Clayton1d273162010-10-06 03:09:58 +0000157 {
Greg Clayton358cf1e2015-06-25 21:46:34 +0000158 AddressRange symbol_range (symbol_addr, m_opaque_ptr->GetByteSize());
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000159 const bool prefer_file_cache = false;
Greg Claytone1cd1be2012-01-29 20:56:30 +0000160 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module_sp->GetArchitecture (),
Greg Clayton1080edbc2011-03-25 18:03:16 +0000161 NULL,
Jim Ingham0f063ba2013-03-02 00:26:47 +0000162 flavor_string,
Greg Clayton1d273162010-10-06 03:09:58 +0000163 exe_ctx,
Jason Molenda6b3e6d52013-09-12 23:23:35 +0000164 symbol_range,
165 prefer_file_cache));
Greg Clayton1d273162010-10-06 03:09:58 +0000166 }
167 }
168 }
169 return sb_instructions;
170}
171
Caroline Tice750cd172010-10-26 23:49:36 +0000172lldb_private::Symbol *
173SBSymbol::get ()
174{
175 return m_opaque_ptr;
176}
Greg Clayton72eff182010-12-14 04:58:53 +0000177
178void
179SBSymbol::reset (lldb_private::Symbol *symbol)
180{
181 m_opaque_ptr = symbol;
182}
Greg Clayton93d00df2011-03-02 23:01:18 +0000183
184SBAddress
185SBSymbol::GetStartAddress ()
186{
187 SBAddress addr;
Greg Claytone7612132012-03-07 21:03:09 +0000188 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress())
Greg Clayton93d00df2011-03-02 23:01:18 +0000189 {
Greg Clayton358cf1e2015-06-25 21:46:34 +0000190 addr.SetAddress (&m_opaque_ptr->GetAddressRef());
Greg Clayton93d00df2011-03-02 23:01:18 +0000191 }
192 return addr;
193}
194
195SBAddress
196SBSymbol::GetEndAddress ()
197{
198 SBAddress addr;
Greg Claytone7612132012-03-07 21:03:09 +0000199 if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress())
Greg Clayton93d00df2011-03-02 23:01:18 +0000200 {
Greg Claytone7612132012-03-07 21:03:09 +0000201 lldb::addr_t range_size = m_opaque_ptr->GetByteSize();
202 if (range_size > 0)
Greg Clayton93d00df2011-03-02 23:01:18 +0000203 {
Greg Clayton358cf1e2015-06-25 21:46:34 +0000204 addr.SetAddress (&m_opaque_ptr->GetAddressRef());
Greg Claytone7612132012-03-07 21:03:09 +0000205 addr->Slide (m_opaque_ptr->GetByteSize());
Greg Clayton93d00df2011-03-02 23:01:18 +0000206 }
207 }
208 return addr;
209}
210
211uint32_t
212SBSymbol::GetPrologueByteSize ()
213{
214 if (m_opaque_ptr)
215 return m_opaque_ptr->GetPrologueByteSize();
216 return 0;
217}
Greg Clayton05d2b7f2011-03-31 01:08:07 +0000218
219SymbolType
220SBSymbol::GetType ()
221{
222 if (m_opaque_ptr)
223 return m_opaque_ptr->GetType();
224 return eSymbolTypeInvalid;
225}
Greg Clayton74ae3f52012-04-02 20:08:08 +0000226
227bool
228SBSymbol::IsExternal()
229{
230 if (m_opaque_ptr)
231 return m_opaque_ptr->IsExternal();
232 return false;
233}
234
235bool
236SBSymbol::IsSynthetic()
237{
238 if (m_opaque_ptr)
239 return m_opaque_ptr->IsSynthetic();
240 return false;
241}
242