blob: ce232bf3f6a7c72f9a2cd194329239819d3f8667 [file] [log] [blame]
Chris Lattner24943d22010-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 Tice98f930f2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000012#include "lldb/Core/Disassembler.h"
Caroline Tice7826c882010-10-26 03:11:13 +000013#include "lldb/Core/Log.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000014#include "lldb/Core/Module.h"
Chris Lattner24943d22010-06-08 16:52:24 +000015#include "lldb/Symbol/Symbol.h"
Greg Clayton5c4c7462010-10-06 03:09:58 +000016#include "lldb/Target/ExecutionContext.h"
17#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000018
19using namespace lldb;
Greg Clayton5c4c7462010-10-06 03:09:58 +000020using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000021
22SBSymbol::SBSymbol () :
Greg Clayton63094e02010-06-23 01:19:29 +000023 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000024{
25}
26
27SBSymbol::SBSymbol (lldb_private::Symbol *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000028 m_opaque_ptr (lldb_object_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +000029{
30}
31
Greg Clayton538eb822010-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 Lattner24943d22010-06-08 16:52:24 +000044SBSymbol::~SBSymbol ()
45{
Greg Clayton63094e02010-06-23 01:19:29 +000046 m_opaque_ptr = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000047}
48
Greg Clayton43edca32010-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 Lattner24943d22010-06-08 16:52:24 +000055bool
56SBSymbol::IsValid () const
57{
Greg Clayton63094e02010-06-23 01:19:29 +000058 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000059}
60
61const char *
62SBSymbol::GetName() const
63{
Greg Claytona66ba462010-10-30 04:51:46 +000064 const char *name = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000065 if (m_opaque_ptr)
Greg Claytona66ba462010-10-30 04:51:46 +000066 name = m_opaque_ptr->GetMangled().GetName().AsCString();
Caroline Tice61ba7ec2010-10-26 23:49:36 +000067
Greg Claytone005f2c2010-11-06 01:53:30 +000068 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000069 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +000070 log->Printf ("SBSymbol(%p)::GetName () => \"%s\"", m_opaque_ptr, name ? name : "");
71 return name;
Chris Lattner24943d22010-06-08 16:52:24 +000072}
73
74const char *
75SBSymbol::GetMangledName () const
76{
Greg Claytona66ba462010-10-30 04:51:46 +000077 const char *name = NULL;
Greg Clayton63094e02010-06-23 01:19:29 +000078 if (m_opaque_ptr)
Greg Claytona66ba462010-10-30 04:51:46 +000079 name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
Greg Claytone005f2c2010-11-06 01:53:30 +000080 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +000081 if (log)
82 log->Printf ("SBSymbol(%p)::GetMangledName () => \"%s\"", m_opaque_ptr, name ? name : "");
83
84 return name;
Chris Lattner24943d22010-06-08 16:52:24 +000085}
86
87
88bool
89SBSymbol::operator == (const SBSymbol &rhs) const
90{
Greg Clayton63094e02010-06-23 01:19:29 +000091 return m_opaque_ptr == rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000092}
93
94bool
95SBSymbol::operator != (const SBSymbol &rhs) const
96{
Greg Clayton63094e02010-06-23 01:19:29 +000097 return m_opaque_ptr != rhs.m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000098}
Caroline Tice98f930f2010-09-20 05:20:02 +000099
100bool
101SBSymbol::GetDescription (SBStream &description)
102{
103 if (m_opaque_ptr)
104 {
Caroline Ticee49ec182010-09-22 23:01:29 +0000105 description.ref();
106 m_opaque_ptr->GetDescription (description.get(),
107 lldb::eDescriptionLevelFull, NULL);
Caroline Tice98f930f2010-09-20 05:20:02 +0000108 }
109 else
110 description.Printf ("No value");
111
112 return true;
113}
Greg Clayton5c4c7462010-10-06 03:09:58 +0000114
115
116
117SBInstructionList
118SBSymbol::GetInstructions (SBTarget target)
119{
120 SBInstructionList sb_instructions;
121 if (m_opaque_ptr)
122 {
Greg Claytonbdcda462010-12-20 20:49:23 +0000123 Mutex::Locker api_locker;
Greg Clayton5c4c7462010-10-06 03:09:58 +0000124 ExecutionContext exe_ctx;
125 if (target.IsValid())
Greg Claytonbdcda462010-12-20 20:49:23 +0000126 {
127 api_locker.Reset (target->GetAPIMutex().GetMutex());
Greg Clayton5c4c7462010-10-06 03:09:58 +0000128 target->CalculateExecutionContext (exe_ctx);
Greg Claytonbdcda462010-12-20 20:49:23 +0000129 }
Greg Clayton5c4c7462010-10-06 03:09:58 +0000130 const AddressRange *symbol_range = m_opaque_ptr->GetAddressRangePtr();
131 if (symbol_range)
132 {
133 Module *module = symbol_range->GetBaseAddress().GetModule();
134 if (module)
135 {
136 sb_instructions.SetDisassembler (Disassembler::DisassembleRange (module->GetArchitecture (),
Greg Clayton149731c2011-03-25 18:03:16 +0000137 NULL,
Greg Clayton5c4c7462010-10-06 03:09:58 +0000138 exe_ctx,
139 *symbol_range));
140 }
141 }
142 }
143 return sb_instructions;
144}
145
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000146lldb_private::Symbol *
147SBSymbol::get ()
148{
149 return m_opaque_ptr;
150}
Greg Claytondd62d722010-12-14 04:58:53 +0000151
152void
153SBSymbol::reset (lldb_private::Symbol *symbol)
154{
155 m_opaque_ptr = symbol;
156}
Greg Clayton89f1aa72011-03-02 23:01:18 +0000157
158SBAddress
159SBSymbol::GetStartAddress ()
160{
161 SBAddress addr;
162 if (m_opaque_ptr)
163 {
164 // Make sure the symbol is an address based symbol first:
165 AddressRange *symbol_arange_ptr = m_opaque_ptr->GetAddressRangePtr();
166 if (symbol_arange_ptr)
167 {
168 addr.SetAddress (&symbol_arange_ptr->GetBaseAddress());
169 }
170 }
171 return addr;
172}
173
174SBAddress
175SBSymbol::GetEndAddress ()
176{
177 SBAddress addr;
178 if (m_opaque_ptr)
179 {
180 AddressRange *symbol_arange_ptr = m_opaque_ptr->GetAddressRangePtr();
181 if (symbol_arange_ptr)
182 {
183 addr_t byte_size = symbol_arange_ptr->GetByteSize();
184 if (byte_size > 0)
185 {
186 addr.SetAddress (&symbol_arange_ptr->GetBaseAddress());
187 addr->Slide (byte_size);
188 }
189 }
190 }
191 return addr;
192}
193
194uint32_t
195SBSymbol::GetPrologueByteSize ()
196{
197 if (m_opaque_ptr)
198 return m_opaque_ptr->GetPrologueByteSize();
199 return 0;
200}
Greg Claytonb0e68d92011-03-31 01:08:07 +0000201
202SymbolType
203SBSymbol::GetType ()
204{
205 if (m_opaque_ptr)
206 return m_opaque_ptr->GetType();
207 return eSymbolTypeInvalid;
208}