blob: 8a3211373d12a59663597c3ef99adeab2336ee9f [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- Symbol.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/Symbol/Symbol.h"
11
12#include "lldb/Core/Module.h"
13#include "lldb/Core/Section.h"
14#include "lldb/Core/Stream.h"
15#include "lldb/Target/Process.h"
Greg Claytonf5e56de2010-09-14 23:36:40 +000016#include "lldb/Target/Target.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
18using namespace lldb;
19using namespace lldb_private;
20
21
22Symbol::Symbol() :
Stephen Wilson71c21d12011-04-11 19:41:40 +000023 SymbolContextScope (),
Greg Clayton81c22f62011-10-19 18:09:39 +000024 m_uid (UINT32_MAX),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025 m_mangled (),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026 m_type_data (0),
27 m_type_data_resolved (false),
28 m_is_synthetic (false),
29 m_is_debug (false),
30 m_is_external (false),
31 m_size_is_sibling (false),
32 m_size_is_synthesized (false),
Greg Clayton01575f82011-11-22 21:20:33 +000033 m_type (eSymbolTypeInvalid),
34 m_flags (),
35 m_addr_range ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000036{
37}
38
39Symbol::Symbol
40(
Greg Clayton81c22f62011-10-19 18:09:39 +000041 uint32_t symID,
Chris Lattner30fdc8d2010-06-08 16:52:24 +000042 const char *name,
43 bool name_is_mangled,
44 SymbolType type,
45 bool external,
46 bool is_debug,
47 bool is_trampoline,
48 bool is_artificial,
Greg Claytone72dfb32012-02-24 01:59:29 +000049 const lldb::SectionSP &section_sp,
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050 addr_t offset,
51 uint32_t size,
52 uint32_t flags
53) :
Stephen Wilson71c21d12011-04-11 19:41:40 +000054 SymbolContextScope (),
Greg Clayton81c22f62011-10-19 18:09:39 +000055 m_uid (symID),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000056 m_mangled (name, name_is_mangled),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057 m_type_data (0),
58 m_type_data_resolved (false),
59 m_is_synthetic (is_artificial),
60 m_is_debug (is_debug),
61 m_is_external (external),
62 m_size_is_sibling (false),
63 m_size_is_synthesized (false),
Greg Clayton01575f82011-11-22 21:20:33 +000064 m_type (type),
65 m_flags (flags),
Greg Claytone72dfb32012-02-24 01:59:29 +000066 m_addr_range (section_sp, offset, size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000067{
68}
69
70Symbol::Symbol
71(
Greg Clayton81c22f62011-10-19 18:09:39 +000072 uint32_t symID,
Chris Lattner30fdc8d2010-06-08 16:52:24 +000073 const char *name,
74 bool name_is_mangled,
75 SymbolType type,
76 bool external,
77 bool is_debug,
78 bool is_trampoline,
79 bool is_artificial,
80 const AddressRange &range,
81 uint32_t flags
82) :
Stephen Wilson71c21d12011-04-11 19:41:40 +000083 SymbolContextScope (),
Greg Clayton81c22f62011-10-19 18:09:39 +000084 m_uid (symID),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000085 m_mangled (name, name_is_mangled),
Chris Lattner30fdc8d2010-06-08 16:52:24 +000086 m_type_data (0),
87 m_type_data_resolved (false),
88 m_is_synthetic (is_artificial),
89 m_is_debug (is_debug),
90 m_is_external (external),
91 m_size_is_sibling (false),
92 m_size_is_synthesized (false),
Greg Clayton01575f82011-11-22 21:20:33 +000093 m_type (type),
94 m_flags (flags),
95 m_addr_range (range)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000096{
97}
98
99Symbol::Symbol(const Symbol& rhs):
Stephen Wilson71c21d12011-04-11 19:41:40 +0000100 SymbolContextScope (rhs),
Greg Clayton81c22f62011-10-19 18:09:39 +0000101 m_uid (rhs.m_uid),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102 m_mangled (rhs.m_mangled),
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000103 m_type_data (rhs.m_type_data),
104 m_type_data_resolved (rhs.m_type_data_resolved),
105 m_is_synthetic (rhs.m_is_synthetic),
106 m_is_debug (rhs.m_is_debug),
107 m_is_external (rhs.m_is_external),
108 m_size_is_sibling (rhs.m_size_is_sibling),
109 m_size_is_synthesized (false),
Greg Clayton01575f82011-11-22 21:20:33 +0000110 m_type (rhs.m_type),
111 m_flags (rhs.m_flags),
112 m_addr_range (rhs.m_addr_range)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000113{
114}
115
116const Symbol&
117Symbol::operator= (const Symbol& rhs)
118{
119 if (this != &rhs)
120 {
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000121 SymbolContextScope::operator= (rhs);
Greg Clayton81c22f62011-10-19 18:09:39 +0000122 m_uid = rhs.m_uid;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000123 m_mangled = rhs.m_mangled;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000124 m_type_data = rhs.m_type_data;
125 m_type_data_resolved = rhs.m_type_data_resolved;
126 m_is_synthetic = rhs.m_is_synthetic;
127 m_is_debug = rhs.m_is_debug;
128 m_is_external = rhs.m_is_external;
129 m_size_is_sibling = rhs.m_size_is_sibling;
130 m_size_is_synthesized = rhs.m_size_is_sibling;
Greg Clayton01575f82011-11-22 21:20:33 +0000131 m_type = rhs.m_type;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000132 m_flags = rhs.m_flags;
Greg Clayton01575f82011-11-22 21:20:33 +0000133 m_addr_range = rhs.m_addr_range;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000134 }
135 return *this;
136}
137
Greg Clayton81c22f62011-10-19 18:09:39 +0000138void
139Symbol::Clear()
140{
141 m_uid = UINT32_MAX;
142 m_mangled.Clear();
Greg Clayton81c22f62011-10-19 18:09:39 +0000143 m_type_data = 0;
144 m_type_data_resolved = false;
145 m_is_synthetic = false;
146 m_is_debug = false;
147 m_is_external = false;
148 m_size_is_sibling = false;
149 m_size_is_synthesized = false;
Greg Clayton01575f82011-11-22 21:20:33 +0000150 m_type = eSymbolTypeInvalid;
Greg Clayton81c22f62011-10-19 18:09:39 +0000151 m_flags = 0;
Greg Clayton01575f82011-11-22 21:20:33 +0000152 m_addr_range.Clear();
Greg Clayton81c22f62011-10-19 18:09:39 +0000153}
154
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000155AddressRange *
156Symbol::GetAddressRangePtr()
157{
158 if (m_addr_range.GetBaseAddress().GetSection())
159 return &m_addr_range;
160 return NULL;
161}
162
163const AddressRange *
164Symbol::GetAddressRangePtr() const
165{
166 if (m_addr_range.GetBaseAddress().GetSection())
167 return &m_addr_range;
168 return NULL;
169}
170
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000171uint32_t
172Symbol::GetSiblingIndex() const
173{
174 return m_size_is_sibling ? m_addr_range.GetByteSize() : 0;
175}
176
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000177bool
178Symbol::IsTrampoline () const
179{
180 return m_type == eSymbolTypeTrampoline;
181}
182
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183void
Greg Claytonf5e56de2010-09-14 23:36:40 +0000184Symbol::GetDescription (Stream *s, lldb::DescriptionLevel level, Target *target) const
Greg Clayton0c5cd902010-06-28 21:30:43 +0000185{
Greg Clayton6b2bd932012-02-01 08:09:32 +0000186 s->Printf("uid={%6u}", m_uid);
Greg Claytond9dc52d2011-09-24 05:04:40 +0000187
Greg Claytone72dfb32012-02-24 01:59:29 +0000188 if (m_addr_range.GetBaseAddress().GetSection())
Greg Clayton0c5cd902010-06-28 21:30:43 +0000189 {
Greg Claytonc9800662010-09-10 01:30:46 +0000190 if (m_addr_range.GetBaseAddress().IsSectionOffset())
Greg Clayton0c5cd902010-06-28 21:30:43 +0000191 {
Greg Claytonc9800662010-09-10 01:30:46 +0000192 if (m_addr_range.GetByteSize() > 0)
193 {
194 s->PutCString (", range = ");
Greg Claytonf5e56de2010-09-14 23:36:40 +0000195 m_addr_range.Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
Greg Claytonc9800662010-09-10 01:30:46 +0000196 }
197 else
198 {
199 s->PutCString (", address = ");
Greg Claytonf5e56de2010-09-14 23:36:40 +0000200 m_addr_range.GetBaseAddress().Dump(s, target, Address::DumpStyleLoadAddress, Address::DumpStyleFileAddress);
Greg Claytonc9800662010-09-10 01:30:46 +0000201 }
Greg Clayton0c5cd902010-06-28 21:30:43 +0000202 }
203 else
Greg Claytond9dc52d2011-09-24 05:04:40 +0000204 s->Printf (", value = 0x%16.16llx", m_addr_range.GetBaseAddress().GetOffset());
205 }
206 else
207 {
208 if (m_size_is_sibling)
209 s->Printf (", sibling = %5llu", m_addr_range.GetBaseAddress().GetOffset());
210 else
211 s->Printf (", value = 0x%16.16llx", m_addr_range.GetBaseAddress().GetOffset());
Greg Clayton0c5cd902010-06-28 21:30:43 +0000212 }
Greg Clayton6b2bd932012-02-01 08:09:32 +0000213 if (m_mangled.GetDemangledName())
214 s->Printf(", name=\"%s\"", m_mangled.GetDemangledName().AsCString());
215 if (m_mangled.GetMangledName())
216 s->Printf(", mangled=\"%s\"", m_mangled.GetMangledName().AsCString());
217
Greg Clayton0c5cd902010-06-28 21:30:43 +0000218}
219
220void
Greg Claytonf5e56de2010-09-14 23:36:40 +0000221Symbol::Dump(Stream *s, Target *target, uint32_t index) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000222{
223// s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
224// s->Indent();
225// s->Printf("Symbol[%5u] %6u %c%c %-12s ",
226 s->Printf("[%5u] %6u %c%c%c %-12s ",
227 index,
228 GetID(),
229 m_is_debug ? 'D' : ' ',
230 m_is_synthetic ? 'S' : ' ',
231 m_is_external ? 'X' : ' ',
232 GetTypeAsString());
233
Greg Claytone72dfb32012-02-24 01:59:29 +0000234 SectionSP section_sp (m_addr_range.GetBaseAddress().GetSection());
235 if (section_sp)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000236 {
237 if (!m_addr_range.GetBaseAddress().Dump(s, NULL, Address::DumpStyleFileAddress))
238 s->Printf("%*s", 18, "");
239
240 s->PutChar(' ');
241
Greg Claytonf5e56de2010-09-14 23:36:40 +0000242 if (!m_addr_range.GetBaseAddress().Dump(s, target, Address::DumpStyleLoadAddress))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000243 s->Printf("%*s", 18, "");
244
245 const char *format = m_size_is_sibling ?
246 " Sibling -> [%5llu] 0x%8.8x %s\n":
247 " 0x%16.16llx 0x%8.8x %s\n";
248 s->Printf( format,
249 m_addr_range.GetByteSize(),
250 m_flags,
251 m_mangled.GetName().AsCString(""));
252 }
253 else
254 {
255 const char *format = m_size_is_sibling ?
256 "0x%16.16llx Sibling -> [%5llu] 0x%8.8x %s\n":
257 "0x%16.16llx 0x%16.16llx 0x%8.8x %s\n";
258 s->Printf( format,
259 m_addr_range.GetBaseAddress().GetOffset(),
260 m_addr_range.GetByteSize(),
261 m_flags,
262 m_mangled.GetName().AsCString(""));
263 }
264}
265
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000266uint32_t
267Symbol::GetPrologueByteSize ()
268{
Greg Claytonbcf2cfb2010-09-11 03:13:28 +0000269 if (m_type == eSymbolTypeCode)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000270 {
271 if (!m_type_data_resolved)
272 {
273 m_type_data_resolved = true;
Greg Claytone72dfb32012-02-24 01:59:29 +0000274 ModuleSP module_sp (m_addr_range.GetBaseAddress().GetModule());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000275 SymbolContext sc;
Greg Claytone72dfb32012-02-24 01:59:29 +0000276 if (module_sp && module_sp->ResolveSymbolContextForAddress (m_addr_range.GetBaseAddress(),
277 eSymbolContextLineEntry,
278 sc))
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000279 {
280 m_type_data = sc.line_entry.range.GetByteSize();
281 }
282 else
283 {
284 // TODO: expose something in Process to figure out the
285 // size of a function prologue.
286 }
287 }
288 return m_type_data;
289 }
290 return 0;
291}
292
293void
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294Symbol::SetValue(addr_t value)
295{
Greg Claytone72dfb32012-02-24 01:59:29 +0000296 m_addr_range.GetBaseAddress().SetRawAddress(value);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000297}
298
299
300bool
301Symbol::Compare(const ConstString& name, SymbolType type) const
302{
Jim Inghamc30ee562011-10-29 00:54:12 +0000303 if (type == eSymbolTypeAny || m_type == type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000304 return m_mangled.GetMangledName() == name || m_mangled.GetDemangledName() == name;
305 return false;
306}
307
308#define ENUM_TO_CSTRING(x) case eSymbolType##x: return #x;
309
310const char *
311Symbol::GetTypeAsString() const
312{
313 switch (m_type)
314 {
315 ENUM_TO_CSTRING(Invalid);
316 ENUM_TO_CSTRING(Absolute);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000317 ENUM_TO_CSTRING(Code);
318 ENUM_TO_CSTRING(Data);
319 ENUM_TO_CSTRING(Trampoline);
320 ENUM_TO_CSTRING(Runtime);
321 ENUM_TO_CSTRING(Exception);
322 ENUM_TO_CSTRING(SourceFile);
323 ENUM_TO_CSTRING(HeaderFile);
324 ENUM_TO_CSTRING(ObjectFile);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000325 ENUM_TO_CSTRING(CommonBlock);
326 ENUM_TO_CSTRING(Block);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327 ENUM_TO_CSTRING(Local);
328 ENUM_TO_CSTRING(Param);
329 ENUM_TO_CSTRING(Variable);
330 ENUM_TO_CSTRING(VariableType);
331 ENUM_TO_CSTRING(LineEntry);
332 ENUM_TO_CSTRING(LineHeader);
333 ENUM_TO_CSTRING(ScopeBegin);
334 ENUM_TO_CSTRING(ScopeEnd);
335 ENUM_TO_CSTRING(Additional);
336 ENUM_TO_CSTRING(Compiler);
337 ENUM_TO_CSTRING(Instrumentation);
338 ENUM_TO_CSTRING(Undefined);
Greg Clayton456809c2011-12-03 02:30:59 +0000339 ENUM_TO_CSTRING(ObjCClass);
340 ENUM_TO_CSTRING(ObjCMetaClass);
341 ENUM_TO_CSTRING(ObjCIVar);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000342 default:
343 break;
344 }
345 return "<unknown SymbolType>";
346}
347
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000348
349void
350Symbol::CalculateSymbolContext (SymbolContext *sc)
351{
352 // Symbols can reconstruct the symbol and the module in the symbol context
353 sc->symbol = this;
354 const AddressRange *range = GetAddressRangePtr();
355 if (range)
Greg Claytone72dfb32012-02-24 01:59:29 +0000356 sc->module_sp = range->GetBaseAddress().GetModule();
Greg Claytone1cd1be2012-01-29 20:56:30 +0000357 else
358 sc->module_sp.reset();
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000359}
360
Greg Claytone72dfb32012-02-24 01:59:29 +0000361ModuleSP
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000362Symbol::CalculateSymbolContextModule ()
363{
364 const AddressRange *range = GetAddressRangePtr();
365 if (range)
Greg Claytone72dfb32012-02-24 01:59:29 +0000366 return range->GetBaseAddress().GetModule();
367 return ModuleSP();
Greg Clayton7e9b1fd2011-08-12 21:40:01 +0000368}
369
370Symbol *
371Symbol::CalculateSymbolContextSymbol ()
372{
373 return this;
374}
375
376
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000377void
378Symbol::DumpSymbolContext (Stream *s)
379{
380 bool dumped_module = false;
381 const AddressRange *range = GetAddressRangePtr();
382 if (range)
383 {
Greg Claytone72dfb32012-02-24 01:59:29 +0000384 ModuleSP module_sp (range->GetBaseAddress().GetModule());
385 if (module_sp)
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000386 {
387 dumped_module = true;
Greg Claytone72dfb32012-02-24 01:59:29 +0000388 module_sp->DumpSymbolContext(s);
Greg Clayton59e8fc1c2010-08-30 18:11:35 +0000389 }
390 }
391 if (dumped_module)
392 s->PutCString(", ");
393
394 s->Printf("Symbol{0x%8.8x}", GetID());
395}
396
397