blob: 481fa1a1d1a28465e1d8736cb17647e66a86ee5f [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBSymbolContext.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/SBSymbolContext.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Caroline Ticeceb6b132010-10-26 03:11:13 +000012#include "lldb/Core/Log.h"
Greg Clayton8f7180b2011-09-26 07:11:27 +000013#include "lldb/Core/Module.h"
Greg Claytoncfd1ace2010-10-31 03:01:06 +000014#include "lldb/Symbol/Function.h"
15#include "lldb/Symbol/Symbol.h"
16#include "lldb/Symbol/SymbolContext.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000017
18using namespace lldb;
19using namespace lldb_private;
20
21
22
23SBSymbolContext::SBSymbolContext () :
Greg Clayton66111032010-06-23 01:19:29 +000024 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025{
26}
27
28SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000029 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000030{
31 if (sc_ptr)
Greg Clayton66111032010-06-23 01:19:29 +000032 m_opaque_ap.reset (new SymbolContext (*sc_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033}
34
35SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
Greg Clayton66111032010-06-23 01:19:29 +000036 m_opaque_ap ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037{
38 if (rhs.IsValid())
Caroline Ticedac97f32010-09-22 23:01:29 +000039 {
40 if (m_opaque_ap.get())
41 *m_opaque_ap = *rhs.m_opaque_ap;
42 else
43 ref() = *rhs.m_opaque_ap;
44 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045}
46
47SBSymbolContext::~SBSymbolContext ()
48{
49}
50
51const SBSymbolContext &
52SBSymbolContext::operator = (const SBSymbolContext &rhs)
53{
54 if (this != &rhs)
55 {
56 if (rhs.IsValid())
Greg Clayton66111032010-06-23 01:19:29 +000057 m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000058 }
59 return *this;
60}
61
62void
63SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
64{
65 if (sc_ptr)
66 {
Greg Clayton66111032010-06-23 01:19:29 +000067 if (m_opaque_ap.get())
68 *m_opaque_ap = *sc_ptr;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000069 else
Greg Clayton66111032010-06-23 01:19:29 +000070 m_opaque_ap.reset (new SymbolContext (*sc_ptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +000071 }
72 else
73 {
Greg Clayton66111032010-06-23 01:19:29 +000074 if (m_opaque_ap.get())
Greg Clayton72310352013-02-23 04:12:47 +000075 m_opaque_ap->Clear(true);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000076 }
77}
78
79bool
80SBSymbolContext::IsValid () const
81{
Greg Clayton66111032010-06-23 01:19:29 +000082 return m_opaque_ap.get() != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000083}
84
85
86
87SBModule
88SBSymbolContext::GetModule ()
89{
Greg Clayton5160ce52013-03-27 23:08:40 +000090 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +000091
Chris Lattner30fdc8d2010-06-08 16:52:24 +000092 SBModule sb_module;
Greg Claytonacdbe812012-01-30 09:04:36 +000093 ModuleSP module_sp;
Greg Clayton66111032010-06-23 01:19:29 +000094 if (m_opaque_ap.get())
Greg Claytonacdbe812012-01-30 09:04:36 +000095 {
96 module_sp = m_opaque_ap->module_sp;
97 sb_module.SetSP (module_sp);
98 }
Caroline Ticeceb6b132010-10-26 03:11:13 +000099
100 if (log)
101 {
102 SBStream sstr;
103 sb_module.GetDescription (sstr);
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000104 log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
105 static_cast<void*>(m_opaque_ap.get()),
106 static_cast<void*>(module_sp.get()), sstr.GetData());
Caroline Ticeceb6b132010-10-26 03:11:13 +0000107 }
108
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000109 return sb_module;
110}
111
112SBCompileUnit
113SBSymbolContext::GetCompileUnit ()
114{
Greg Clayton66111032010-06-23 01:19:29 +0000115 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116}
117
118SBFunction
119SBSymbolContext::GetFunction ()
120{
Greg Clayton5160ce52013-03-27 23:08:40 +0000121 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000122
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000123 Function *function = NULL;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000124
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000125 if (m_opaque_ap.get())
126 function = m_opaque_ap->function;
127
128 SBFunction sb_function (function);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000129
130 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000131 log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
132 static_cast<void*>(m_opaque_ap.get()),
133 static_cast<void*>(function));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000134
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000135 return sb_function;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136}
137
138SBBlock
139SBSymbolContext::GetBlock ()
140{
Greg Clayton66111032010-06-23 01:19:29 +0000141 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000142}
143
144SBLineEntry
145SBSymbolContext::GetLineEntry ()
146{
Greg Clayton5160ce52013-03-27 23:08:40 +0000147 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000148
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000149 SBLineEntry sb_line_entry;
Greg Clayton66111032010-06-23 01:19:29 +0000150 if (m_opaque_ap.get())
151 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000152
Caroline Ticeceb6b132010-10-26 03:11:13 +0000153 if (log)
154 {
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000155 log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
156 static_cast<void*>(m_opaque_ap.get()),
157 static_cast<void*>(sb_line_entry.get()));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000158 }
159
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000160 return sb_line_entry;
161}
162
163SBSymbol
164SBSymbolContext::GetSymbol ()
165{
Greg Clayton5160ce52013-03-27 23:08:40 +0000166 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000167
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000168 Symbol *symbol = NULL;
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000169
Greg Claytoncfd1ace2010-10-31 03:01:06 +0000170 if (m_opaque_ap.get())
171 symbol = m_opaque_ap->symbol;
172
173 SBSymbol sb_symbol (symbol);
Caroline Ticeceb6b132010-10-26 03:11:13 +0000174
175 if (log)
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000176 log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
177 static_cast<void*>(m_opaque_ap.get()),
178 static_cast<void*>(symbol));
Caroline Ticeceb6b132010-10-26 03:11:13 +0000179
Saleem Abdulrasool324a1032014-04-04 04:06:10 +0000180 return sb_symbol;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000181}
182
Greg Clayton8f7180b2011-09-26 07:11:27 +0000183void
184SBSymbolContext::SetModule (lldb::SBModule module)
185{
Greg Claytonacdbe812012-01-30 09:04:36 +0000186 ref().module_sp = module.GetSP();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000187}
188
189void
190SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
191{
192 ref().comp_unit = compile_unit.get();
193}
194
195void
196SBSymbolContext::SetFunction (lldb::SBFunction function)
197{
198 ref().function = function.get();
199}
200
201void
202SBSymbolContext::SetBlock (lldb::SBBlock block)
203{
Greg Clayton5569e642012-02-06 01:44:54 +0000204 ref().block = block.GetPtr();
Greg Clayton8f7180b2011-09-26 07:11:27 +0000205}
206
207void
208SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
209{
210 if (line_entry.IsValid())
211 ref().line_entry = line_entry.ref();
212 else
213 ref().line_entry.Clear();
214}
215
216void
217SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
218{
219 ref().symbol = symbol.get();
220}
221
222
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000223lldb_private::SymbolContext*
224SBSymbolContext::operator->() const
225{
Greg Clayton66111032010-06-23 01:19:29 +0000226 return m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000227}
228
Greg Clayton09960032010-09-10 18:31:35 +0000229
230const lldb_private::SymbolContext&
231SBSymbolContext::operator*() const
232{
233 assert (m_opaque_ap.get());
234 return *m_opaque_ap.get();
235}
236
237
238lldb_private::SymbolContext&
239SBSymbolContext::operator*()
240{
241 if (m_opaque_ap.get() == NULL)
242 m_opaque_ap.reset (new SymbolContext);
243 return *m_opaque_ap.get();
244}
245
Caroline Ticedac97f32010-09-22 23:01:29 +0000246lldb_private::SymbolContext&
247SBSymbolContext::ref()
248{
249 if (m_opaque_ap.get() == NULL)
250 m_opaque_ap.reset (new SymbolContext);
251 return *m_opaque_ap.get();
252}
253
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000254lldb_private::SymbolContext *
Greg Clayton09960032010-09-10 18:31:35 +0000255SBSymbolContext::get() const
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000256{
Greg Clayton66111032010-06-23 01:19:29 +0000257 return m_opaque_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258}
259
Caroline Ticedde9cff2010-09-20 05:20:02 +0000260bool
261SBSymbolContext::GetDescription (SBStream &description)
262{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000263 Stream &strm = description.ref();
264
Caroline Ticedde9cff2010-09-20 05:20:02 +0000265 if (m_opaque_ap.get())
266 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000267 m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
Caroline Ticedde9cff2010-09-20 05:20:02 +0000268 }
269 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000270 strm.PutCString ("No value");
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000271
Caroline Ticedde9cff2010-09-20 05:20:02 +0000272 return true;
273}
Greg Clayton8f7180b2011-09-26 07:11:27 +0000274
275SBSymbolContext
Greg Clayton1ed54f52011-10-01 00:45:15 +0000276SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
277 SBAddress &parent_frame_addr) const
Greg Clayton8f7180b2011-09-26 07:11:27 +0000278{
279 SBSymbolContext sb_sc;
280 if (m_opaque_ap.get() && curr_frame_pc.IsValid())
281 {
Greg Clayton1ed54f52011-10-01 00:45:15 +0000282 if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
Greg Clayton8f7180b2011-09-26 07:11:27 +0000283 return sb_sc;
284 }
285 return SBSymbolContext();
286}
287